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")