命令设计模式知识概括
命令设计模式简介
智能生活项目需求:
- 我们买了一套智能家电, 有照明灯、 风扇、 冰箱、 洗衣机, 我们只要在手机上安装 app 就可以控制对这些家电工作。
- 这些智能家电来自不同的厂家, 我们不想针对每一种家电都安装一个 App, 分别控制, 我们希望只要一个 app 就可以控制全部智能家电。
- 要实现一个 app 控制所有智能家电的需要, 则每个智能家电厂家都要提供一个统一的接口给 app 调用, 这时 就可以考虑使用命令模式。
- 命令模式可将“动作的请求者”从“动作的执行者” 对象中解耦出来。
- 在我们的例子中,动作的请求者是手机 app,动作的执行者是每个厂商的一个家电产品。
命令模式基本介绍:
- 命令模式(Command Pattern): 在软件设计中, 我们经常需要向某些对象发送请求, 但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可, 此时可以使用命令模式来进行设计
- 命令模式使得请求发送者与请求接收者消除彼此之间的耦合, 让对象之间的调用关系更加灵活, 实现解耦
- 在命令模式中, 会将一个请求封装为一个对象, 以便使用不同参数来表示不同的请求(即命令), 同时命令模式也支持可撤销的操作
- 通俗易懂的理解: 将军发布命令, 士兵去执行。 其中有几个角色: 将军(命令发布者) 、 士兵(命令的具体执行者) 、 命令(连接将军和士兵)
- Invoker 是调用者(将军) , Receiver 是被调用者(士兵) , MyCommand 是命令, 实现了 Command 口, 持有接收对象
命令模式原理类图:
- Invoker:是调用者角色,里面聚合了一个 Command 实现类的对象
- Command:是命令角色, 用于定义接口规范,需要执行的所有命令都在这里, 可以是接口或抽象类
- Receiver:接收者角色, 知道如何实施和执行一个请求相关的操作
- ConcreteCommand:具体的命令角色,实现(或继承) Command,将一个接收者对象与一个动作绑定, 调用接受者相应的操作
- 将 Command 的具体实现类与 Invoker 聚合,将 Receiver 与 Command 的具体实现类聚合,从而将 Invoker(命令调用者)和 Receiver(命令执行者)解耦
命令模式解决智能生活项目
简介:
- 应用实例要求:编写程序, 使用命令模式 完成前面的智能家电项目
- 类图:
- 代码实现:
Command:定义命令的规范
//创建命令接口
public interface Command {
// 执行动作(操作)
public void execute();
// 撤销动作(操作)
public void undo();
}
LightOnCommand:打开电灯的命令类,该类实现了 Command 接口,并且聚合了一个 LightReceiver 的实现类,用于操作电灯的开、关
public class LightOnCommand implements Command {
// 聚合LightReceiver
LightReceiver light;
// 构造器
public LightOnCommand(LightReceiver light) {
this.light = light;
}
@Override
public void execute() {
// 调用接收者的方法
light.on();
}
@Override
public void undo() {
// 调用接收者的方法
light.off();
}
}
LightOffCommand:关闭电灯的命令类,该类实现了 Command 接口,并且聚合了一个 LightReceiver 的实现类,用于操作电灯的开、关
public class LightOffCommand implements Command {
// 聚合LightReceiver
LightReceiver light;
// 构造器
public LightOffCommand(LightReceiver light) {
this.light = light;
}
@Override
public void execute() {
// 调用接收者的方法
light.off();
}
@Override
public void undo() {
// 调用接收者的方法
light.on();
}
}
LightReceiver:命令执行者,用于操作电灯的开、关
public class LightReceiver {
public void on() {
System.out.println(" 电灯打开了.. ");
}
public void off() {
System.out.println(" 电灯关闭了.. ");
}
}
TVOnCommand:打开电视机的命令类,该类实现了 Command 接口,并且聚合了一个 TVReceiver 的实现类,用于操作电视机的开、关
public class TVOnCommand implements Com