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