1. 程式人生 > >設計模式-命令模式(Command)

設計模式-命令模式(Command)

命令模式:將一個請求封裝為一個物件,從而可用不同的請求對客戶進行引數化;對請求排隊或記錄日誌,以及支援可撤銷的操作,將”發出請求的物件”和”接收與執行這些請求的物件”分隔開來。

 

角色和職責:

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