天天看點

GoF--指令設計模式

定義

将來自用戶端的請求傳入一個對象,進而使你可用不同的請求對客戶進行參數化。用于“行為請求者”與“行為實作者”解耦,可實作二者之間的松耦合,以便适應變化。分離變化與不變的因素。

角色

Command

定義指令的接口,聲明執行的方法。

ConcreteCommand

指令接口實作對象,是“虛”的實作;通常會持有接收者,并調用接收者的功能來完成指令要執行的操作。

Receiver

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

Invoker

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

Client

建立具體的指令對象,并且設定指令對象的接收者。注意這個不是我們正常意義上的用戶端,而是在組裝指令對象和接收者,或許,把這個Client稱為裝配者會更好了解,因為真正使用指令的用戶端是從Invoker來觸發執行。

優點

1.降低對象之間的耦合度。

2.新的指令可以很容易地加入到系統中。

3.可以比較容易地設計一個組合指令。

4.調用同一方法實作不同的功能

缺點

使用指令模式可能會導緻某些系統有過多的具體指令類。因為針對每一個指令都需要設計一個具體指令類,是以某些系統可能需要大量具體指令類,這将影響指令模式的使用。

适用情況

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

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

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

4.系統需要将一組操作組合在一起,即支援宏指令。

應用

模拟對電視機的操作有開機、關機、換台指令。代碼如下

執行結果

總結

1.指令模式的本質是對指令進行封裝,将發出指令的責任和執行指令的責任分割開。

2.每一個指令都是一個操作:請求的一方送出請求,要求執行一個操作;接收的一方收到請求,并執行操作。

3.指令模式允許請求的一方和接收的一方獨立開來,使得請求的一方不必知道接收請求的一方的接口,更不必知道請求是怎麼被接收,以及操作是否被執行、何時被執行,以及是怎麼被執行的。

4.指令模式使請求本身成為一個對象,這個對象和其他對象一樣可以被存儲和傳遞。

5.指令模式的關鍵在于引入了抽象指令接口,且發送者針對抽象指令接口程式設計,隻有實作了抽象指令接口的具體指令才能與接收者相關聯。

繼續閱讀