天天看點

【設計模式】Java設計模式之指令模式

目錄

一、為什麼使用指令模式

二、模式定義

三、模式結構

四、模式優點

五、模式缺點

六、模式适用環境

七、模式應用執行個體

一、為什麼使用指令模式

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

指令模式可以對發送者和接收者完全解耦,發送者與接收者之間沒有直接引用關系,發送請求的對象隻需要知道如何發送請求,而不必知道如何完成請求。

二、模式定義

指令模式(Command Pattern):将一個請求封裝為一個對象,進而使我們可用不同的請求對客戶進行參數化;對請求排隊或者記錄請求日志,以及支援可撤銷的操作。指令模式是一種對象行為型模式,其别名為動作(Action)模式或事務(Transaction)模式。

三、模式結構

【設計模式】Java設計模式之指令模式

指令模式包含如下角色: • Command: 抽象指令類 • ConcreteCommand: 具體指令類 • Invoker: 調用者 • Receiver: 接收者 • Client: 客戶類 指令模式的本質是 對指令進行封裝 , 将發出指令的責任和執行 指令的責任分割開 。 指令模式的關鍵在于 引入了抽象指令接口 ,且 發送者 針對抽象指令接口程式設計 ,隻有實作了抽象指令接口的 具體指令才能與接收者相關聯 。 指令模式順序圖:

【設計模式】Java設計模式之指令模式

為便于了解,仍取劉偉老師教材中的例子。

電視機是請求的接收者,遙控器是請求的發送者,遙控器上有一些按鈕,不同的按鈕對應電視機的不同操作。抽象指令角色由一個指令接口來扮演,有三個具體的指令類實作了抽象指令接口,這三個具體指令類分别代表三種操作:打開電視機、關閉電視機和切換頻道。顯然,電視機遙控器就是一個典型的指令模式應用執行個體
【設計模式】Java設計模式之指令模式

四、模式優點

• 降低系統的耦合度。 • 新的指令可以很容易地加入到系統中。 • 可以比較容易地設計一個指令隊列和宏指令(組合指令)。 • 可以友善地實作對請求的 Undo 和 Redo 。

五、模式缺點

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

六、模式适用環境

在以下情況下可以使用指令模式: • 系統 需要将請求調用者和請求接收者解耦 ,使得調用者和接收者不直接互動。 • 系統 需要在不同的時間指定請求、将請求排隊和執行請求 。 • 系統 需要支援指令的撤銷 (Undo) 操作和恢複 (Redo) 操作 。 • 系統 需要将一組操作組合在一起 ,即支援宏指令。

七、模式應用執行個體

(1) Java 語言使用指令模式實作 AWT/Swing GUI 的 委派事件模型 (Delegation Event Model, DEM) 。 (2) 很多系統都提供了宏指令功能,如 UNIX 平台下的 Shell 程式設計 ,可以将多條指令封裝在一個指令對象中, 隻需要一條簡單的指令即可執行一個指令序列,這也 是指令模式的應用執行個體之一。

繼續閱讀