1 命令模式介绍
命令模式是一种行为设计模式,它允许你将操作封装在对象中,从而使你可以将其参数化并将其它对象中的操作排入队列、记录日志、进行撤销等操作。
在命令模式中,所有需要执行的操作都被包装在一个命令类中,接收者和调用者之间不存在直接引用。通过将一个或多个命令交给调用者执行,减少了对象之间的直接耦合,增强了整个系统的可扩展性。
📌 场景
命令模式的应用场景包括但不限于:撤销和重做操作、队列请求、日志记录、事务处理等。
📌 优点
- 解耦合:命令模式可以将命令与其接受者(执行者)解耦合,从而使命令发送者(调用者)和接受者(执行者)之间的耦合度降低,可以独立修改和扩展它们。
- 可扩展性:命令模式可以方便地添加新的命令或修改现有的命令,从而实现系统的扩展和灵活性。
- 记录日志:命令模式可以方便地记录日志,可以记录所有执行过的命令,以便以后进行跟踪和调试。
📌 缺点
- 命令类可能会增多:因为每个具体命令都需要一个具体的命令类来实现,所以如果命令过多,则会增加系统的复杂度。
- 可能造成系统性能瓶颈:如果系统中存在大量的命令对象,执行这些命令可能会对系统的性能造成影响。
- 执行花费时间:由于命令是通过一个个对象来完成的,因此,在执行命令时可能需要执行大量的对象,这可能会带来一定的时间开销。
2 命令模式实现
以手机控制电视机开启为例:
现在各大电子厂商都在推智能家居,即可以通过手机这一个终端控制多个家用电器,比之前的单个设备智能由对应遥控器控制的方案要方便很多。这其实就是命令模式的应用。
📌 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,再用构造方法指定要控制的设备即可。