-
意图:
将请求封装为一个对象,从而使你可用不同的请求对客户端进行参数化;对请求排队或记录请求日志,以及支持可撤销操作。 -
别名:
动作(Action),事务(Transaction) -
动机:
-
适用性:
a. 抽象出待执行的动作以参数化某对象。
b. 在不同的时刻指定、排列和执行请求。
c. 支持取消操作。
d. 支持日志修改。
e. 用构建在原语操作上的高层操作构造一个系统。 -
结构:
-
参与者:
a. Command:
声明执行操作的接口。
b. ConcreteCommand:
将一个接收对象绑定于一个动作。
调用接收者相应的操作,以实现Execute。
c. Client:
创建一个具体命令对象并设定它的接收者。
d. Invoke:
要求该命令执行这个请求。
e. Receiver:
知道如何实施与执行一个请求相关的操作。任何类都可能作为一个接收者。 -
协作:
-
效果:
a. 将对用操作的对象与知道如何实现该操作的对象解耦。
b. Command是头等的对象。
c. 可将多个命令装配成一个复合命令。
d. 增加性的Command很容易。 -
实现:
a. 一个命令对象应达到何种智能程度。
b. 支持取消(undo)和重做(redo)。
c. 避免取消过程中的错误积累。 -
代码示例:
public interface Command {
void execute();
}
public class ConcreteCommand implements Command {
private Receiver receiver = null;
private Integer state = 0;
public ConcreteCommand(Receiver receiver) {
this.receiver = receiver;
}
@Override
public void execute() {
receiver.action();
state = 1;
}
public Integer getState() {
return state;
}
}
public class Receiver {
public void action() {
System.out.println("Receiver receiver");
}
public class Invoker {
private Command command = null;
public Invoker(Command command) {
this.command = command;
}
public void execute() {
command.execute();
}
}
public class Client {
public static void main(String[] args) {
ConcreteCommand command = new ConcreteCommand(new Receiver());
Invoke invoke = new Invoke(command);
invoke.execute();
}
}
-
已知应用:
-
相关模式:
Composite可被用来实现宏命令。
Memento模式可用来保存莫格状态,命令用这一状态来取消它的效果。