java設計模式之命令模式

2021-08-18 07:30:02 字數 2050 閱讀 6520

命令模式(command) ,是行為設計模式的一種。command模式通過被稱為command的類封裝了對目標物件的呼叫行為以及呼叫引數。請求以命令的形式包裹在物件中,並傳給呼叫物件。呼叫物件尋找可以處理該命令的合適的物件,並把該命令傳給相應的物件,該物件執行命令。

解決問題:

在軟體系統中,行為請求者與行為實現者通常是一種緊耦合的關係,但某些場合,比如需要對行為進行記錄、撤銷或重做、事務等處理時,這種無法抵禦變化的緊耦合的設計就不太合適。

應用場景:

在物件導向的程式設計中,乙個物件呼叫另乙個物件,一般情況下的呼叫過程是:建立目標物件例項;設定呼叫引數;呼叫目標物件的方法。

在某些場合,比如要對行為進行"記錄、撤銷/重做、事務"等處理,這種無法抵禦變化的緊耦合是不合適的。在這種情況下,如何將"行為請求者"與"行為實現者"解耦?將一組行為抽象為物件,可以實現二者之間的松耦合。

- 整個呼叫過程比較繁雜,或者存在多處這種呼叫。這時,使用command類對該呼叫加以封裝,便於功能的再利用。

- 呼叫前後需要對呼叫引數進行某些處理。

- 呼叫前後需要進行某些額外處理,比如日誌,快取,記錄歷史操作等

應用例項:

struts 1 中的 action 核心控制器 actionservlet 只有乙個,相當於 invoker,而模型層的類會隨著不同的應用有不同的模型類,相當於具體的command。

命令模式uml圖:

角色和職責:

command:ommand抽象類。

concretecommand:command的具體實現類,需要執行的所有命令都在這裡宣告。

receiver:呼叫的目標物件,真正的命令執行物件,命令傳到這裡應該被執行。

invorker:invorker執行command物件,使用命令物件的入口

實現**示例:

/**

* 命令接收者receiver類

* 小商販

*/public class peddler

//賣香蕉

public void sailbanana()

}/**

* command抽象類

*/public abstract class command

public peddler getpeddler()

public void setpeddler(peddler peddler)

public abstract void sail();

}public class bananacommand extends command

@override

public void sail()

} super(peddler);

} @override

public void sail()

}/**

* 呼叫者invoker類

*/public class waiter

public void removeorder(command command)

public void sail()

} }public class mainclass

}

優點:1、降低了系統耦合度。類間解耦:呼叫者角色與接收者角色之間沒有任何依賴關係,呼叫者實現功能時只需呼叫command 抽象類的方法就可以,不需要了解到底是哪個接收者執行。

2、可擴充套件性:command的子類可以非常容易地擴充套件,而呼叫者invoker和高層次的模組client不產生嚴重的**耦合。

缺點:

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

java設計模式之命令模式

意圖 將乙個請求封裝為乙個物件,從而可用不同的請求對客戶進行引數化 對請求排隊或記錄日誌,以及支援可撤銷的操作 動機 將 發出請求的物件 和 接收與執行這些請求的物件 分隔開來。效果 1 command模式將呼叫操作的物件和實現該操作的物件解耦 2 可以將多個命令裝配成乙個復合命令,復合命令是com...

java設計模式之命令模式

定義 把方法呼叫封裝起來,命令模式請求或者操作封裝到乙個物件之中,呼叫的物件需要知道是如何實現的,只要明白如何使用就好。應用場景 記錄日誌,是用這些命令實現撤銷或者恢復的 命令模式對命令進行封裝,發出和執行分派給兩個不同的物件 把請求命令和執行命令分開了 這樣做的好處是 a 便於新的命令加入 b 命...

設計模式之命令模式(java)

命令模式,其實就是進一步封裝,把方法呼叫封裝起來,head first中舉了乙個很生動的例子,飯店中點餐的流暢如下 客戶點了訂單並交給服務端,然後女招待把訂單交給大廚的師傅,大師傅最後呈現出一道可口的菜餚。在這個過程中,客戶只需要知道來飯店點好選單就可以等吃飯了,服務員也是只需要知道把訂單交給大廚,...