需求:一套智能家电(照明灯、风扇、冰箱、洗衣机),我们只需要在手机上安装app就可以控制这些家电工作。
我们希望只要一个app就可以控制所有的智能家电,则每个智能家电都要提供一个统一的接口给app调用,这时就可以考虑使用命令模式。
命令模式可将“动作的请求者”从“动作的执行者”对象中解耦出来。在例子中,动作请求者是app,动作执行者是每个家电。
1.基本介绍
- 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个。
我们只需要在程序运行时指定具体的接收者即可,此时可使用命令模式进行设计。
(就比如将军指挥士兵进攻,但并不需要知道具体是哪个,士兵收到命令便会进攻) - 命令模式使得请求发送者与请求接收者解耦。
- 在命令模式中,会将一个请求封装为一个对象,以便使用不同参数来表示不同的请求。
- 角色:
Invoker 调用者
Receiver 被调用者
MyCommand 命令,实现了Command接口,持有接收对象
2.类图
3.命令模式解决智能家居问题
限于篇幅,这里只用电灯举例。
命令接口,拥有execute()、undo()两个方法。
public interface Command {
void execute();
void undo();
}
在具体的命令类中,需要聚合对应的Receiver,编写LightReceiver类。
public class LightReceiver {
public void on(){
System.out.println("电灯打开了");
}
public void off(){
System.out.println("电灯关闭了");
}
}
在LightOnComman