在軟體開發過程中,經常需要在乙個物件中呼叫另外乙個物件的方法去執行某種操作,但是呼叫方可能需要執行不同物件的方法;這時候可以考慮使用命令模式,來減少呼叫方和執行方的耦合,讓呼叫方不用關注具體的執行方是誰,也不需要關注具體的實現;命令模式的主要特點就是通過引入command物件,使得命令的呼叫方和具體執行方解耦;
1.組成結構
命令的呼叫方,就是誰要來執行操作的,它通過command物件來執行命令,會持有乙個command的引用,如果是批量處理命令的話,會有乙個command 佇列的引用;
2>command
抽象命令類,包含乙個execute方法用來執行命令;在invoker中會進行呼叫execute方法;
3>concretecommand
具體的命令類,實現了command抽象類的execute方法,會呼叫receiver.action方法來完成命令的執行;
4>receiver
命令的執行者,來執行命令的具體的操作的;會有乙個action方法,被concretecommand來呼叫;
具體的**
1.invoker
public class invoker
public void dosomething()
}
2.抽象command
public abstract class command
3.concretecommand
public class concretecommanda extends command
@override
public void execute()
}
4.receiver
public class receiver
}
2. 理解
為什麼要通過command來做乙個中間類,而不是直接在invoker類中呼叫receiver的action方法執行對應的操作哪?主要是為了解耦;如果直接呼叫就耦合了
invoker invoker = new invoker(receiver)
invoker.dosomething()
這樣的話,如果說invoker要呼叫其他的操作就不行了;通過引入command,可以注入不同的具體的command來執行操作,系統的靈活性大大提公升;舉個例子比如有個設定快捷鍵的功能,針對某乙個快捷鍵a,可以設定為列印,也可以設定為刪除,複製等操作;我們就可以把這些操作抽象成命令,這樣的話,可以隨便設定,而不固定於某一種操作;這就是命令模式的優點所在;另外命令模式也可以實現批處理的命令執行,這時候需要把呼叫方invoker中新增乙個command佇列的引用;
class commandqueue
public void removecommand(command command)
//迴圈呼叫每乙個命令物件的execute()方法
public void execute()
} }
class invoker
//設值注入
public void setcommandqueue(commandqueue commandqueue)
//呼叫commandqueue類的execute()方法
public void call()
}
總結:命令模式的優點有
1>降低系統的耦合性,通過引入了乙個command,解耦了命令的呼叫方和執行方;
2>新的命令可以很方便的加入到系統中,擴充套件性很好,直接新增command的具體實現即可;
3>可以很容易的實現佇列,請求的撤銷和恢復;
當然缺點就是引入了大量的類,每增加一種命令的操作就引入了乙個新的類去處理
設計模式 命令設計模式
一句話總結 命令設計模式的實質是將命令定義,命令的執行分離開,從而提公升了系統的解藕性 結構 命令的抽象command 命令的具體實現concretecommand 命令處理者抽象ireceiver 命令處理者的具體實現concretereceiver 命令的呼叫者invoker 客戶端client...
設計模式 命令模式
1 命令模式的角色組成 1 命令角色 command 生命執行操作的介面。介面或抽象類來實現。2 具體命令角色 concrete command 將乙個接收者物件繫結於乙個動作 呼叫接收者相應的操作,以實現命令角色宣告的執行操作的介面。3 客戶角色 client 建立乙個具體命令物件 並可以設定它的...
設計模式 命令模式
1 command.h ifndef command h define command h include include include using namespace std class chef 廚師,具體命令的執行者 class command 命令基類 class makemuttonco...