1 介绍
命令模式实现了指挥者和执行者之间的解耦。可以很好的实现指挥者对执行者的控制。
2 例子
以打开关闭电灯为例子,如果不采用命令模式,直接客户端调用电灯,耦合较大,针对较为复杂的情况如果需要撤销,较为麻烦。在二者之间加一个命令作为桥梁,可以很好的实现解耦,让命令对象去执行执行者的方法。
2.1 电灯实体类
//电灯接收者
class Light{
//电灯状态
private boolean lightOn=false;
//电灯打开
void on(){
System.out.println("电灯已经打开");
this.lightOn=true;
}
//电灯关闭
void off(){
System.out.println("电灯已经关闭");
this.lightOn=false;
}
}
2.2 命令接口
//命令接口
interface Command{
//执行
void execute();
}
2.3 实现命令
//打开命令
class LightOnCommand implements Command{
private Light light;
//构造函数
LightOnCommand(Light light){
this.light=light;
}
@Override
public void execute() {
this.light.on();
}
}
//关闭命令
class LightOffCommand implements Command{
private Light light;
//构造函数
LightOffCommand(Light light){
this.light=light;
}
@Override
public void execute() {
this.light.off();
}
}
2.4 测试主类
public class Main {
public static void main(String[] args) {
//创建接收者
Light light=new Light();
//创建两个命令
Command on=new LightOnCommand(light);
Command off=new LightOffCommand(light);
//调用
on.execute();
off.execute();
}
}
3 例子升华
上述例子比较简单,而且开关几乎是0延迟的情况,所以似乎命令模式的优势没有体现出来。试想这样一个场景,有多个指挥者,且每一个命令执行时间较长,指挥者不停在发命令,这时候使用一个缓存的命令队列就很有必要了,而且都是统一调用execute()方法,非常统一。
4 总结
4.1 核心角色
- 命令执行者:执行命令的实体类。
- 命令父类:对于命令的操作,执行、撤销、中断等等。
- 命令实体:具体的每一项命令,注意要聚合一个命令执行者对象。
4.2 关键代码结构
结构和对象适配器模式相似,都是实现接口聚合目标对象,但是命令模式更加强调能够统一执行,而适配器强调适配某一种。侧重点不一样。