命令模式是一种行为设计模式,它允许你将操作封装在对象中,从而使你可以将其参数化并将其它对象中的操作排入队列、记录日志、进行撤销等操作。
在命令模式中,所有需要执行的操作都被包装在一个命令类中,接收者和调用者之间不存在直接引用。通过将一个或多个命令交给调用者执行,减少了对象之间的直接耦合,增强了整个系统的可扩展性。
场景
命令模式的应用场景包括但不限于:撤销和重做操作、队列请求、日志记录、事务处理等。
优点
缺点
以手机控制电视机开启为例:
现在各大电子厂商都在推智能家居,即可以通过手机这一个终端控制多个家用电器,比之前的单个设备智能由对应遥控器控制的方案要方便很多。这其实就是命令模式的应用。
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.调用
public class Client {
public static void main(String[] args) {
// 定义电视机
Television television = new Television();
// 使用终端设备发送命令到控制器
// 控制器发出开启命令到电视机
// 电视机接收到开启命令后开始启动
Controller.call(new OpenCommand(television));
}
}
电视机已开启
这样就实现了通过命令开启电视机。如果需要添加其他命令,比如说关闭,只需要定义一个关闭命令继承 Command,再用构造方法指定要控制的设备即可。