命令模式的定义是“将一个请求封装成一个对象作为命令,然后将其传递给调用者对象。调用者对象寻找能够处理该命令的合适对象,并将命令传递给相应的对象,由该对象执行命令”。

它也被称为动作(Action)或事务(Transaction)

命令模式的优点

  • 它将调用操作的对象与实际执行操作的对象分离。
  • 它使添加新命令变得容易,因为现有的类保持不变。

命令模式的使用场景

它用于:

  • 需要根据执行的动作来参数化对象时。
  • 需要在不同时间创建和执行请求时。
  • 需要支持回滚、日志记录或事务功能时。

命令模式示例

让我们通过上面的UML图来理解命令模式的示例。

命令模式的UML图:

命令设计模式的参与者包括:
  • Command 这是一个用于执行操作的接口。
  • ConcreteCommand 这个类扩展了Command接口并实现了execute方法。它在动作与接收者之间创建绑定。
  • Client 这个类创建ConcreteCommand类并将其与接收者关联。
  • Invoker 这个类请求命令执行请求。
  • Receiver 这个类知道如何执行操作。

2-1.png

上述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 

标签: Design Patterns, Design Patterns教程, 设计模式, 软件设计, 结构型模式, 行为型模式, 单例模式, 工厂模式, 观察者模式, 中介者模式, 访问者模式