天天看點

設計模式:指令模式

日常生活中,我們出去吃飯都會遇到下面的場景。

設計模式:指令模式

定義:

将一個請求封裝為一個對象,使送出請求的責任和執行請求的責任分割開。這樣兩者之間通過指令對象進行溝通,這樣友善将指令對象進行存儲、傳遞、調用、增加與管理。

指令模式包含以下主要角色:

抽象指令類(Command)角色: 定義指令的接口,聲明執行的方法。

具體指令(Concrete Command)角色:具體的指令,實作指令接口;通常會持有接收者,并調用接收者的功能來完成指令要執行的操作。

實作者/接收者(Receiver)角色: 接收者,真正執行指令的對象。任何類都可能成為一個接收者,隻要它能夠實作指令要求實作的相應功能。

調用者/請求者(Invoker)角色: 要求指令對象執行請求,通常會持有指令對象,可以持有很多的指令對象。這個是用戶端真正觸發指令并要求指令執行相應操作的地方,也就是說相當于使用指令對象的入口。

将上面的案例用代碼實作,那我們就需要分析指令模式的角色在該案例中由誰來充當。

服務員: 就是調用者角色,由她來發起指令。

資深大廚: 就是接收者角色,真正指令執行的對象。

訂單: 指令中包含訂單。

類圖如下:

設計模式:指令模式
設計模式:指令模式

1,優點:

降低系統的耦合度。指令模式能将調用操作的對象與實作該操作的對象解耦。

增加或删除指令非常友善。采用指令模式增加與删除指令不會影響其他類,它滿足“開閉原則”,對擴充比較靈活。

可以實作宏指令。指令模式可以與組合模式結合,将多個指令裝配成一個組合指令,即宏指令。

友善實作 Undo 和 Redo 操作。指令模式可以與後面介紹的備忘錄模式結合,實作指令的撤銷與恢複。

2,缺點:

使用指令模式可能會導緻某些系統有過多的具體指令類。

系統結構更加複雜。

系統需要将請求調用者和請求接收者解耦,使得調用者和接收者不直接互動。

系統需要在不同的時間指定請求、将請求排隊和執行請求。

系統需要支援指令的撤銷(Undo)操作和恢複(Redo)操作。

Runable是一個典型指令模式,Runnable擔當指令的角色,Thread充當的是調用者,start方法就是其執行方法

會調用一個native方法start0(),調用系統方法,開啟一個線程。而接收者是對程式員開放的,可以自己定義接收者。