設計模式-命令模式(Command)
阿新 • • 發佈:2018-12-17
命令模式:將一個請求封裝為一個物件,從而可用不同的請求對客戶進行引數化;對請求排隊或記錄日誌,以及支援可撤銷的操作,將”發出請求的物件”和”接收與執行這些請求的物件”分隔開來。
角色和職責:
1.Command:
宣告執行操作的介面
2.Concrete Command:
具體實現
3.Invoker:
執行者
4.Receiver:
接收者
UML圖
具體程式碼:
/** * 接收者 */ public class Receiver {public void action(){ System.out.println("執行一個命令"); } public void unAction(){ System.out.println("撤銷一個命令"); } }
/** * 命令介面 */ public interface Command { void execute();//執行 void undo();//撤回 }
/** * 具體命令 */ public class ConcreteCommand implements Command{private Receiver receiver; public ConcreteCommand(Receiver receiver){ this.receiver = receiver; } @Override public void execute() { receiver.action(); } @Override public void undo() { receiver.unAction(); } }
/** * 呼叫者 */ public class Invoker {public Command command; public Command getCommand() { return command; } public void setCommand(Command command) { this.command = command; } //執行命令 public void executeAction(){ command.execute(); } //撤銷命令 public void undoAction(){ command.undo(); } }
public class Main { public static void main(String[] args) { //建立命令的接收者 Receiver receiver = new Receiver(); //建立命令,設定接收者 Command command = new ConcreteCommand(receiver); //建立執行者 Invoker invoker = new Invoker(); invoker.setCommand(command);//設定對應的命令 //執行命令 invoker.executeAction(); invoker.undoAction(); } }
結果:
執行一個命令
撤銷一個命令
命令模式(Command)的應用效果:
1)command模式將呼叫操作的物件和實現該操作的物件解耦
2)可以將多個命令裝配成一個複合命令,複合命令是Composite模式的一個例項
3)增加新的command很容易,無需改變已有的類
命令模式(Command)的適用性
1.抽象出待執行的動作以引數化某物件。
2.在不同的時刻指定、排列和執行請求。
3.支援取消操作。
4.支援修改日誌,這樣當系統崩潰時,這樣修改可以被重做一遍。
5.用構建在原語操作上的高層操作構造一個系統。
原始碼地址:https://github.com/qjm201000/design_pattern_command.git