概述
- 定义 : 将"请求"封装成对象, 以便使用不同的请求
- 命令模式解决了应用车鞥徐中对象的职责以及它们之间的通信方式
- 类型 : 行为型
适用场景
- 请求的调用者和请求的接收者需要解耦, 使得调用者和接收者不直接交互
- 需要抽象出等待执行的行为
优点
- 降低耦合
- 容易扩展新命令或者一组命令
缺点
- 命令的无限扩展会增加类的数量, 提高系统实现的复杂度
模式角色
-
Command : 声明执行操作的接口。
-
ConcreteCommand :
- 将一个接收者对象绑定于一个动作
- 调用接收者相应的操作,以实现Excute
-
Invoker : 要求该命令执行这个请求。可以理解为下达命令的对象, 有时候可以省略直接让Client担任这个角色
-
Receiver : 知道如何实施与执行一个请求相关的操作。任何类都可能作为一个接收者。
-
Client : 创建一个具体命令对象并设定它的接收者。
代码实现
业务场景
以开灯关灯为例, 类与命令模式中角色对应如下:
- Command接口 : 对应模式中Command接口
- LighetOnCommand, LightOffCommand : 对应模式中ConcreteCommand角色
- Person : 对应模式中Invoker角色
- Light : 对应模式中Receiver角色
- Client : 对应模式中Client角色, 测试代码
完整UML类图
省略了Client测试类的类图:
代码
Command接口 :
/**
* 命令接口
*
* @author 七夜雪
* @create 2018-11-24 18:17
*/
public interface Command {
public void excute();
}
LighetOnCommand, LightOffCommand :
/**
* @author 七夜雪
* @create 2018-11-24 18:20
*/
public class LightOffCommand implements Command {
private Light