Command(命令) 行为型 对象 1
Intent_意图2
将“请求”封装成对象,以使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作
Motivation_动机3
在系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场景下,如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计其适合性不高
Applicability_适用性4
在某些场合,需要对行为进行“记录、撤销/重做、事务”等处理,在此情况下,将“行为请求者”与“行为实现者”解耦
Structure_结构5
Participants_参与者6
- Client(客户) 创建一个具体命令对象并确定其接收者
- Command(命令) 声明了一个给所有具体命令类的抽象接口
- ConcreteCommand(具体命令) 命令接口的实现,通常代表一个具体的命令
- Invoker(请求者) 负责调用命令对象执行请求
- Receiver(接收者) 负责具体实施和执行一个请求
Collaborations_协作7
- Client创建ConcreteCommand对象,并确定Receiver
- Command给所有的ConcreteCommand对象,定义抽象接口,声明执行方法(及撤销方法)
-> 一般定义execute()为执行方法,undo()为撤销方法 - ConcreteCommand实现Command接口定义的方法,调用Receiver的相应操作
-> 实现execute()方法,负责调用接收者的相应操作。execute()方法通常叫做执行方法 - Invoker接收并执行Command的执行方法
-> 相关方法称为action(行动)方法 - Receiver具体实施和执行Invoker发出的请求
-> 任何一个类都可以成为Receiver
-> 实现和执行请求的方法叫做action(行动)方法
Comsequences_结果8
- 优点
降低系统耦合度
更好的扩展性
更动态的控制 - 缺点
具体命令过于繁复 - 用途
Implementation/Sample Code_实现/范例代码910
Implementation
Receiver
public class Receiver {// 执行操作的实际方法public void action() {System.out.println("receiver execute");}public void undoAction() {System.out.println("receiver undo");}
}
Command
public interface Command {void execute(); // 执行方法void undo(); // 撤销方法
}
ConcreteCommand
public class ConcreteCommand implements Command {private Receiver receiver; // 持有的Receiverpublic ConcreteCommand(Receiver receiver) {this.receiver = receiver;}@Overridepublic void execute() {receiver.action(); // 将请求转交Receiver的相应执行方法,交由Receiver执行}@Overridepublic void undo() {receiver.undoAction(); // 将请求转交Receiver的相应撤销方法,交由Receiver执行}
}
Invoker
public class Invoker {private Command command; // 持有的Command对象// 设置对应的Command对象public void setCommand(Command command) {this.command = command;}// 执行方法public void action() {command.execute();}
}
Client
public class Client {// 创建接收者Receiver receiver = new Receiver();// 创建命令对象,并设置接收者Command command = new ConcreteCommand(receiver);// 创建请求者Invoker invoker = new Invoker();invoker.setCommand(command); // 设置命令对象invoker.action(); // 执行方法
}
Sample Code
Receiver
public class Light {public void on() {System.out.println("Light is on");}public void off() {System.out.println("Light is off"):}
}
Command
public interface Command {public void execute();public void undo();
}
ConcreteCommand
public class LightOnCommand implements Command {Light light;public LightOnCommand(Light light) {this.light = light;}@Overridepublic void execute() {light.on();}@Overridepublic void undo() {light.off();}
}
Invoker
public class RemoteControl {private Command command;public void setCommand(Command command) {this.command = command;}public void onButtonWasPushed() {command.execute();}public void undoButtonWasPushed() {command.undo();}
}
Client
public class Client {public static void main(String[] args) {Light light = new Light();Command lightOnCommand = new LightOnCommand(light);RemoteControl remoteControl = new RemoteControl();remoteControl.setCommand(lightOnCommand);remoteControl.onButtonWasPushed();remoteControl.undoButtonWasPushed();}
}
Result
Light is on
Light is off
Known Uses_已知应用11
Related Patterns_相关模式12
宏命令
宏命令就是包含多个命令的命令,是一个命令的组合
模式分类归属 ↩︎
意图:描述该模式的作用,以及该模式的定义 ↩︎
动机:给出了问题以及如何解决这个问题的具体场景 ↩︎
适用性:描述模式可以被应用在什么场合 ↩︎
结构:提供了图示,显示出参与此模式的类之间的关系 ↩︎
参与者:描述在此设计中所涉及到的类和对象在模式中的责任和角色 ↩︎
协作 :告诉参与者如何在此模式中合作 ↩︎
结果:描述采用此模式之后可能产生的效果,好的与不好的 ↩︎
实现:提供了在实现该模式时需要使用的技巧,以及应该小心面对的问题 ↩︎
范例代码:提供代码的片段 ↩︎
已知应用:用来描述已经在真实系统中发现的模式例子 ↩︎
相关模式:描述了此模式和其他模式之间的关系 ↩︎