命令模式(Command Pattern):是一個高內聚的模式。
定義: Encapsulate a request as an object , thereby letting you parameterize clients with different requests ,queue or long requests, and support undoable Operations.(將一個請求封裝成一個對象,從而讓你使用不同的請求把客戶端參數化,對請求排隊或者記錄請求日志,可以提供命令的撤銷和恢復功能。)
通用類圖:

Receive接收者角色:命令傳遞到這里應該被執行的。
Command 命令角色: 需要執行的所有命令都在這里聲明。
Invoker 調用者角色 :接收到命令,并執行命令。
優點:
1、類間解耦: 調用者角色和接收者角色之間沒有任何依賴關系,調用者實現功能只需調用Command抽象類的execute方法就可以,不需要了解到底是哪個接收者
2、可擴展性:Command的子類可以非常容易的擴展,而調用者Invoker和高層次的模塊Client不產生嚴重的代碼耦合
缺點:
如果有N個命令,Command的子類就可能是N個,導致類膨脹得非常大
實現:
/// <summary> /// 通用Receive類 /// </summary> public abstract class Reveiver { //抽象接收者,定義每個接收者都必須完成的業務 public abstract void doSomething(); } /// <summary> /// 具體的Receiver類 /// </summary> public class ConcreteReciver1 : Reveiver { //每個接收者都必須處理一定的業務邏輯 public void doSomething() { } } public class ConcreteReciver2 : Reveiver { //每個接收者都必須處理一定的業務邏輯 public void doSomething() { } } /// <summary> /// 抽象的Command類 /// </summary> public abstract class Command { //每個命令類都必須有一個執行命令的方法 public abstract void execute(); } /// <summary> /// 具體的Command類1 /// </summary> public class ConcreteCommand1 : Command { PRivate Receiver receiver; public ConcreteCommand1(Receiver _receiver) { receiver = _receiver; } public void execute() { receiver.doSomething(); } } /// <summary> /// 具體的Command類2 /// </summary> public class ConcreteCommand2 : Command { private Receiver receiver; public ConcreteCommand1(Receiver _receiver) { receiver = _receiver; } public void execute() { receiver.doSomething(); } } /// <summary> /// 調用者Invoker類 /// </summary> public class Invoker { private Command command; public void SetCommand(Command _command) { command = _command; } //執行命令 public void actiong() { command.execute(); } } public class Client { public static void main(String [] args) { //首先聲明調用者Invoker Invoker Invoker = new Invoker(); //定義接收者 Receiver receiver = new ConcreteReciver1(); //定義一個發送接收者的命令 Command command = new ConcreteCommand1(receiver); //把命令交給調用者去執行 Invoker.SetCommand(command); invoker.action(); } } 好了,這一章就寫到這,歡迎大家加入QQ群:280993838 。或者關注我的公眾號:
新聞熱點
疑難解答