看一个智能生活项目需求:制作豆浆,编写程序。
说明如下:
- 我们买了一套智能家电,有照明灯、风扇、冰箱、洗衣机,我们只要在手机上安装app就可以控制这些家电工作。
- 这些智能家电来自不同的厂家,我不想根据每一种家电安装不同的app分别控制,我只希望只要一个app可以控制所有智能家电。
- 要实现一个app控制所有智能家电的需要,则每个智能家电厂家都要提供一个统一的接口给app调用,这样可以考虑使用命令模式。
- 命令模式可以将"动作的请求者"从"动作的执行者"对象中解耦了出来。
- 在我们的例子中,动作的请求者是手机app,动作的执行者是每个厂家的同一个电子产品。
命令模式(Command Pattern)介绍:
- 在软件设计中,我们通常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需要在程序运行时指定一个具体的接收者即可,此时,可以使用命令模式来设计。
- 命令模式使得请求发送者和请求接受者消除彼此之间的耦合,让对象之间的调用关系更加灵活,实现解耦。
- 在命令模式中,会将请求封装为一个对象,以便使用不同的参数来表示不同的请求(即命名)。同时,命令模式也支持可以撤销的操作。
- 通俗易懂的理解:将军发布命令、士兵去执行。其中有几个角色:将军(命令发布者)、士兵(命令的具体执行者)、命令(连接将军和士兵)。
Invoke是调用者(将军)、Receiver是被调用者(士兵),MyCommand是命令,实现了Command接口,持有接收对像。
命令模式类图:
对原理类图的说明即模板方法模式的角色和职责:
- Invoker调用者角色。
- Command是命令角色,需要执行的所有命令,可以是接口或者抽象类。
- Receiver是接受者角色,知道如何实施和执行一个请求相关的操作。
- ConcreteCommand是一个具体的命令类,实现了Command抽象类或者接口,将一个接受者对象与一个动作绑定,调用接收者相应的操作实现execute()。
命令模式解决智能生活项目
- 分析:
- UML类图:
关键代码:
package com.xia.designmode.study.commandpattern;
/**
* 命令模式--具体实现命令角色
*
* */
public class LightOffCommand implements Command{
//聚合命令接收者
private LightReceiver lightReceiver;
public LightOffCommand(LightReceiver lightReceiver) {
this.lightReceiver = lightReceiver;
}
@Override
public void execute() {
//关闭电灯,调用接收者的方法
lightReceiver.off();
}
@Override
public void cancel() {
//打开电灯,调用接收者的方法
lightReceiver.on();
}
}
package com.xia.designmode.study.commandpattern;
/**
* 命令模式--具体实现命令角色