意图
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。
例子
|
|
接下来就是接收者如何处理消息public class Receiver {
public void action() {
System.out.println("接收者处理消息");
}
}
上面大致是命令收到后会让接收者收到一条消息。
接下来就是发送消息public class Invoker {
private Command command = null;
public void setCommand(Command command) {
this.command = command;
}
public void invoke() {
command.execute();
}
}
大致准备好后,就可以使用了public class Client {
public static void main(String[] arg) {
Command command = OpenCommand(new Receiver());
Invoker invoker = new Invoker();
invoker.setCommand(command);
invoker.invoke();
}
}
适用性
- 将可用过程语言中的回调函数表达这种参数化机制。回调函数是指函数先在某处注册,而他将在稍后某个需要的时候被调用。命令模式是回调机制的一个面向对象的代替品。
- 在不同的时刻指定、排列和执行请求。一个命令对象可以有一个与初始请求无关的生存期。如果一个请求的接收者可用一种与地址空间无关的方式表达,那么就可将负责该请求的命令对象传送给另一个不同的进程并在那实现该请求。
- 支持取消操作。
- 支持修改日志。
- 用构建在原语操作上的高层操作构造一个系统,这样一种结构在支持事务的信息系统上很常见。一个事务封装了对数据的一组变动。命令模式提供了对事物进行组建的方法。命令模式有一个公共的接口,使得你可以用同一种方式调用所有的事务。同时使用该模式也易于添加新事物以扩展系统。
结构
协作
- Client创建一个 ConcreteCommand 对象并指定它的 Receiver 对象。
- 某 Invoker对象存储该 ConcreteCommand 对象。
- 该 Invoker 通过调用 Command对象的 Execute 操作来提交一个请求。若该命令是可撤消的, ConcreteCommand 就在执行 Excute操作之前存储当前状态以用于取消该命令。
- ConcreteCommand 对象对调用它的 Receiver 的一些操作以执行该请求 。
效果
命令模式有以下效果 :
- 命令模式将调用操作的对象与知道如何实现该操作的对象解耦。
- 命令是头等的对象。它们可像其他的对象一样被操纵和扩展。
- 你可将多个命令装配成一个复合命令 。 例如是前面描述的MacroCommand类 。 一般说来,复合命令是组合模式的一个实例。
- 增加新的命令很容易,因为这无需改变已有的类。