设计模式 16 命令模式
命令模式(Command Pattern)属于行为型模式
概述
现在各大电子厂商都在推智能家居,即可以通过手机这一个终端控制多个家用电器,比之前的单个设备智能由对应遥控器控制的方案要方便很多。这其实就是命令模式的应用。
命令模式将请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。
代码实现
这里以手机控制电视机开启为例介绍命令模式:
1、定义命令接收者
/**
* 命令接收者
*/
public interface Receiver {
/**
* 开启
*/
void open();
}
2、定义电视机
/**
* 电视机
*/
public class Television implements Receiver{
@Override
public void open() {
System.out.println("电视机已开启");
}
}
3、定义命令
/**
* 命令
*/
public abstract class Command {
/**
* 命令接收者
*/
private final Receiver receiver;
/**
* 绑定命令与命令接收者
* @param receiver 命令接收者
*/
public Command(Receiver receiver) {
this.receiver = receiver;
}
/**
* 执行命令
*/
public void execute() {
// 开启
this.receiver.open();
}
}
4、定义开启命令
/**
* 开启命令
*/
public class OpenCommand extends Command {
/**
* 开启电视机
* @param television 电视机
*/
public OpenCommand(Television television) {
super(television);
}
}
5、定义控制器
/**
* 控制器
*/
public class Controller {
/**
* 发出命令
* @param command 命令
*/
public static void call(Command command) {
command.execute();
}
}
6、调用
// 定义电视机
Television television = new Television();
// 使用终端设备发送命令到控制器
// 控制器发出开启命令到电视机
// 电视机接收到开启命令后开始启动
Controller.call(new OpenCommand(television));
输出结果为:
电视机已开启
这样就实现了通过命令开启电视机。如果需要添加其他命令,比如说关闭,只需要定义一个关闭命令继承 Command,再用构造方法指定要控制的设备即可。
优缺点
优点
1、降低了系统耦合度。
2、新的命令可以很容易添加到系统中去。
缺点
使用命令模式可能会导致某些系统有过多的具体命令类。
使用场景
需要用命令的地方都可以使用命令模式,比如:
1、GUI 中每一个按钮都是一条命令。
2、模拟 CMD。
注意事项
系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作,也可以考虑使用命令模式。
命令模式结构示意图:
参考
https://www.bilibili.com/video/BV1u3411P7Na?p=24&vd_source=299f4bc123b19e7d6f66fefd8f124a03
天河有尽身作涯,星海无边前是岸。