命令模式
1.定义
命令模式(英语:Command pattern)是一种设计模式,它尝试以对象来代表实际行动。命令对象可以把行动(action) 及其参数封装起来,于是这些行动可以被:重复多次/取消(如果该对象有实现的话)/取消后又再重做
2.实现
命令(Command)模式
- 客户(Client)角色
- 命令(Command)角色
- 具体命令(Concrete Command)角色
- 接收者(Receiver)角色

- 命令(Command)角色
/**
* 命令(Command)角色
*/
public interface Command {
void execute();
}
- 接收者(Receiver)角色
/**
* 接收者(Receiver)角色
*/
public class Receiver {
public void on() {
System.out.println("Receiver is on");
}
public void down() {
System.out.println("Receiver is down");
}
}
- 具体命令(Concrete Command)角色
/**
* 具体命令(Concrete Command)角色
*/
public class ConcreteCommandOn implements Command{
private Receiver receiver;
public ConcreteCommandOn(Receiver receiver) {
this.receiver = receiver;
}
public void execute() {
receiver.on();
}
}
/**
* 具体命令(Concrete Command)角色
*/
public class ConcreteCommandDown implements Command{
private Receiver receiver;
public ConcreteCommandDown(Receiver receiver) {
this.receiver = receiver;
}
public void execute() {
receiver.down();
}
}
- 客户(Client)角色
public class CommandClient {
public static void main(String[] args) {
Receiver receiver = new Receiver();
Command commandOn = new ConcreteCommandOn(receiver);
commandOn.execute();
Command commandDown = new ConcreteCommandDown(receiver);
commandDown.execute();
// stdout
// Receiver is on
// Receiver is down
}
}
4.总结
优缺点
- 更松散的耦合
- 共动态的控制
- 能很自然的复合命令
- 更好的扩展性
何时选用
- 如果需要抽象出需要执行的动作,并参数化这些对象,可以选用命令模式,把这些需要执行的动作抽象成为命令,然后实现命令的参数化配置
- 如果需要在不同的时刻指定、排列和执行请求,可以选用命令模式,把这些请求封装成为命令对象,然后实现把请求队列化。
- 如果需要支持取消操作,可以选用命令模式,通过管理命令对象,能很容易的实现命令的恢复和重做的功能
- 如果需要支持当系统崩溃时,能把对系统的操作功能重新执行一遍,可以选用命令模式,把这些操作功能的请求封装成命令对象,然后实现日志命令,就可以在系统恢复回来后,通过日志获取命令列表,从而重新执行一遍功能
- 在需要事物的系统中,可以选用命令模式,命令模式提供了对事务进行建模的方法,命令模式有一个别名就是Transaction