1. 程式人生 > >面向對象編程思想-命令模式

面向對象編程思想-命令模式

發出 lose 技術分享 code exec 參數化 方法 trac spa

一、引言

起初餐館吃飯都是客人和廚師直接溝通,菜譜是一樣的,可是客人多了的時候,有的客人可能有急事不吃了要退單,還有的客人點很多菜需要記錄類別和次序等現象,這時服務員角色的出現解決了問題。那麽面對某些無法抵禦變化的“緊耦合”的場景如何做程序設計呢?命令模式設計便出現了,使得“行為請求者”與“行為實現者”解耦,以便適應變化,讓對象之間調用關系更加靈活。下面請看今天要學習的命令模式:

二、命令模式

定義:將一個請求封裝為一個對象,從而使可用不同的請求對客戶進行參數化;對請求排隊或記錄請求日誌,以及支持可撤銷的操作。

下面是結構圖:

技術分享

下面是代碼demo:

技術分享
    //接收者類
    class Receiver
    {
        
//真正執行命令 public void Action() { Console.WriteLine("執行命令"); } } //命令抽象類 abstract class Command { //命令應該知道接收者是誰,所以有Receiver這個對象 protected Receiver receiver; public Command(Receiver receiver) { this.receiver = receiver; }
//執行命令操作 public abstract void Execute(); } //具體命令類 class ConcreteCommand : Command { public ConcreteCommand(Receiver receiver) : base(receiver) { } public override void Execute() { //調用接收者來執行命令 receiver.Action(); } } //調度類 要求命令執行這個請求
class Invoker { //調度者應該知道被請求的命令,所以有Command這個成員變量 private Command command; //設置命令 public void SetCommand(Command command) { this.command = command; } //執行命令 public void ExecuteCommand() { command.Execute(); } } class Program { static void Main(string[] args) { Receiver receiver = new Receiver(); Command command = new ConcreteCommand(receiver); Invoker invoker = new Invoker(); invoker.SetCommand(command); invoker.ExecuteCommand(); Console.Read(); } }
View Code

優點:

1.降低系統耦合度,解除請求者和實現者的耦合

2.組合命令,將多個命令裝配成一個組合命令,即較容易設計一個命令隊列和宏命令

3.增加一個新的命令很容易,無需改變現有的類

4.對請求排隊或記錄請求日誌,支持可撤銷的操作

缺點:

1.針對每一個命令設計一個具體的命令類,可能導致系統有過多的具體命令類

使用場景:

1.系統需要請求者和實現者解耦,調用者和接收者不直接交互

2.需要在不同的時間支持請求,對請求排隊。一個命令對象和原來的請求者有不同的生命期。換言之,原來的請求發出者可能已經不在了,而命令對象本身仍然是活動的。這時命令接收者可以在本地,也可以在網絡的另一個地址。命令對象可以在串行之後傳送到另一臺機器上去。

3.系統需要支持命令的撤銷(undo)。命令對象可以把狀態存儲起來,等客戶端需要撤銷命令所產生效果時,可以調用undo方法,把命令所產生的效果撤銷掉

4.如果一個系統要將系統中所有數據消息更新到日誌裏,以便在系統崩潰時,可以根據日誌裏讀回所有數據的更新命令,重新調用方法一條一條執行命令,從而恢復系統在崩潰前所作的數據更新

5.使用命令模式作為“Callback”在面向對象系統中的替代。"Callback"即先將一個函數註冊上,然後在以後調用此函數

關於命令模式的學習就到此結束了,希望能夠幫到你,若有不足,歡迎斧正,感謝您的閱讀。

面向對象編程思想-命令模式