Design Patterns教程-命令模式
            
            命令模式的定义是“将一个请求封装成一个对象作为命令,然后将其传递给调用者对象。调用者对象寻找能够处理该命令的合适对象,并将命令传递给相应的对象,由该对象执行命令”。
它也被称为动作(Action)或事务(Transaction)。
命令模式的优点
- 它将调用操作的对象与实际执行操作的对象分离。
 - 它使添加新命令变得容易,因为现有的类保持不变。
 
命令模式的使用场景
它用于:
- 需要根据执行的动作来参数化对象时。
 - 需要在不同时间创建和执行请求时。
 - 需要支持回滚、日志记录或事务功能时。
 
命令模式示例
让我们通过上面的UML图来理解命令模式的示例。
命令模式的UML图:
命令设计模式的参与者包括:
- Command 这是一个用于执行操作的接口。
 - ConcreteCommand 这个类扩展了Command接口并实现了execute方法。它在动作与接收者之间创建绑定。
 - Client 这个类创建ConcreteCommand类并将其与接收者关联。
 - Invoker 这个类请求命令执行请求。
 - Receiver 这个类知道如何执行操作。
 

上述UML的实现:
第一步
创建一个ActionListenerCommand接口,它将作为命令。
public interface ActionListenerCommand { 
    public void execute(); 
}第二步
创建一个Document类,它将作为接收者。
文件:Document.java
public class Document { 
    public void open() { 
        System.out.println("Document Opened"); 
    } 
    
    public void save() { 
        System.out.println("Document Saved"); 
    } 
}第三步
创建一个ActionOpen类,它将作为具体命令。
文件:ActionOpen.java
public class ActionOpen implements ActionListenerCommand { 
    private Document doc; 
    
    public ActionOpen(Document doc) { 
        this.doc = doc; 
    } 
    
    @Override 
    public void execute() { 
        doc.open(); 
    } 
}第四步
创建一个ActionSave类,它将作为具体命令。
文件:ActionSave.java
public class ActionSave implements ActionListenerCommand { 
    private Document doc; 
    
    public ActionSave(Document doc) { 
        this.doc = doc; 
    } 
    
    @Override 
    public void execute() { 
        doc.save(); 
    } 
}第五步
创建一个MenuOptions类,它将作为调用者。
文件:MenuOptions.java
public class MenuOptions { 
    private ActionListenerCommand openCommand; 
    private ActionListenerCommand saveCommand; 
    
    public MenuOptions(ActionListenerCommand open, ActionListenerCommand save) { 
        this.openCommand = open; 
        this.saveCommand = save; 
    } 
    
    public void clickOpen() { 
        openCommand.execute(); 
    } 
    
    public void clickSave() { 
        saveCommand.execute(); 
    } 
}第六步
创建一个CommandPatternClient类,它将作为客户端。
文件:CommandPatternClient.java
public class CommandPatternClient { 
    public static void main(String[] args) { 
        Document doc = new Document(); 
        
        ActionListenerCommand clickOpen = new ActionOpen(doc); 
        ActionListenerCommand clickSave = new ActionSave(doc); 
        
        MenuOptions menu = new MenuOptions(clickOpen, clickSave); 
        
        menu.clickOpen(); 
        menu.clickSave(); 
    } 
}输出
Document Opened 
Document Saved