天天看點

指令模式-對象行為型

指令模式屬于對象的行為模式。指令模式又稱為行動(Action)模式或交易(Transaction)模式。

指令模式将一個請求封裝為一個對象,進而使我們可用不同的請求對客戶進行參數化;對請求排隊或者記錄請求日志,以及支援可撤銷的操作。

在軟體設計中,我們經常需要向某些對象發送請求,但是并不知道請求的接收者是誰,也不知道被請求的操作是哪個,我們隻需在程式運作時指定具體的請求接收者即可,此時,可以使用指令模式來進行設計,使得請求發送者與請求接收者消除彼此之間的耦合,讓對象之間的調用關系更加靈活。 

例子1:電視機遙控器 : 遙控器是請求的發送者,電視機是請求的接收者,遙控器上有一些按鈕如開,關,換頻道等按鈕就是具體指令,不同的按鈕對應電視機的不同操作。

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

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

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

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

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

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

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

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

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

指令模式涉及到五個角色,它們分别是:

  ●  用戶端(Client)角色:建立一個具體指令(ConcreteCommand)對象并确定其接收者。

  ●  指令(Command)角色:聲明了一個給所有具體指令類的抽象接口。

  ●  具體指令(ConcreteCommand)角色:定義一個接收者和行為之間的弱耦合;實作execute()方法,負責調用接收者的相應操作。execute()方法通常叫做執行方法。

  ●  請求者(Invoker)角色:負責調用指令對象執行請求,相關的方法叫做行動方法。

  ●  接收者(Receiver)角色:負責具體實施和執行一個請求。任何一個類都可以成為接收者,實施和執行請求的方法叫做行動方法。

指令模式-對象行為型

指令模式的優點: 

指令模式是對指令的封裝。指令模式把發出指令的責任和執行指令的責任分割開,委派給不同的對象。

每一個指令都是一個操作:請求的一方送出請求要求執行一個操作;接收的一方收到請求,并執行操作。指令模式允許請求的一方和接收的一方獨立開來,使得請求的一方不必知道接收請求的一方的接口,更不必知道請求是怎麼被接收,以及操作是否被執行、何時被執行,以及是怎麼被執行的。

  指令允許請求的一方和接收請求的一方能夠獨立演化,進而具有以下的優點:

  (1)指令模式使新的指令很容易地被加入到系統裡。

  (2)允許接收請求的一方決定是否要否決請求。

  (3)能較容易地設計一個指令隊列(宏指令)。

指令模式-對象行為型

  (4)可以容易地實作對請求的撤銷和恢複。

  (5)在需要的情況下,可以較容易地将指令記入日志。

指令模式的缺點: 

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

1)Composite模式(可被用來實作宏指令)。

2)備忘錄Memento模式可用來保持某個狀态,指令用這一狀态來取消它的效果。在被放入曆史表列前必須被拷貝的指令起到一種原型的作用。