用途
命令模式是一种行为型模式。
结构
图-命令模式结构图
Command : 用来声明执行操作的接口。
abstract
class Command {
protected Receiver receiver;
public Command(Receiver receiver) {
this.receiver = receiver;
}
public abstract void Execute();
}
protected Receiver receiver;
public Command(Receiver receiver) {
this.receiver = receiver;
}
public abstract void Execute();
}
ConcreteCommand : 将一个接收者对象绑定一个动作,调用接收者相应的操作,以实现Execute。
class ConcreteCommand
extends Command {
public ConcreteCommand(Receiver receiver) {
super(receiver);
}
@Override
public void Execute() {
receiver.Action();
}
}
public ConcreteCommand(Receiver receiver) {
super(receiver);
}
@Override
public void Execute() {
receiver.Action();
}
}
Invoker : 要求该命令执行这个请求。
class Invoker {
private Command command;
public Invoker(Command command) {
this.command = command;
}
public void ExecuteCommand() {
command.Execute();
}
}
private Command command;
public Invoker(Command command) {
this.command = command;
}
public void ExecuteCommand() {
command.Execute();
}
}
Receiver : 知道如何实施与执行一个与请求相关的操作,任何类都可能作为一个接收者。
class Receiver {
public void Action() {
System.out.println("执行请求");
}
}
public void Action() {
System.out.println("执行请求");
}
}
Client : 创建一个具体命令对象并设定它的接受者。
public
class CommandPattern {
public static void main(String[] args) {
Receiver receiver = new Receiver();
Command cmd = new ConcreteCommand(receiver);
Invoker invoker = new Invoker(cmd);
invoker.ExecuteCommand();
}
}
public static void main(String[] args) {
Receiver receiver = new Receiver();
Command cmd = new ConcreteCommand(receiver);
Invoker invoker = new Invoker(cmd);
invoker.ExecuteCommand();
}
}
交互
图-命令模式交互图
1、Client 创建一个 ConcreteCommand 对象并指定他的 Receiver 对象。
2、某个 Invoker 对象存储该 ConcreteCommand 对象。
3、该 Invoker 通过调用 Command 对象的 Execute 操作来提交一个请求。若该命令是可撤销的,ConcreteCommand 就在执行 Execute 操作之前存储当前状态以用于取消该命令。
4、ConcreteCommand 对象对调用它的 Receiver 的一些操作以执行该请求。
2、某个 Invoker 对象存储该 ConcreteCommand 对象。
3、该 Invoker 通过调用 Command 对象的 Execute 操作来提交一个请求。若该命令是可撤销的,ConcreteCommand 就在执行 Execute 操作之前存储当前状态以用于取消该命令。
4、ConcreteCommand 对象对调用它的 Receiver 的一些操作以执行该请求。
要点
1、命令模式的本质是对命令进行封装,将发出命令的责任和执行命令的责任分割开。
2、每一个命令都是一个操作:请求的一方发出请求,要求执行一个操作;接收的一方收到请求,并执行操作。
3、命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。
4、命令模式使请求本身成为一个对象,这个对象和其他对象一样可以被存储和传递。
5、命令模式的关键在于引入了抽象命令接口,且发送者针对抽象命令接口编程,只有实现了抽象命令接口的具体命令才能与接收者相关联。
2、每一个命令都是一个操作:请求的一方发出请求,要求执行一个操作;接收的一方收到请求,并执行操作。
3、命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。
4、命令模式使请求本身成为一个对象,这个对象和其他对象一样可以被存储和传递。
5、命令模式的关键在于引入了抽象命令接口,且发送者针对抽象命令接口编程,只有实现了抽象命令接口的具体命令才能与接收者相关联。