JDK设计模式(十七)命令模式

1、概述

命令模式将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。

2、解决的问题

用于“行为请求者”与“行为实现者”解耦,可实现二者之间的松耦合,以便适应变化。

3、模式中的角色

1、命令(Command)角色:定义命令的接口,声明执行的方法。

2、具体命令(ConcreteCommand)角色:命令接口实现对象,通常它会持有命令的接收者,通过调用接收者相应的功能方法来执行当前命令所要完成的操作。

3、接收者(Receiver)角色:真正执行命令的对象。任何类都可以成为一个接收者,只要它能够实现命令要求实现的相应功能即可。

4、请求者(Invoker)角色:要求命令对象执行相关请求的对象,通常会持有命令对象,可以是多个命令对象。这是客户端真正触发命令并要求命令执行相应操作的入口点。

5、客户端(Client)角色:创建具体的命令对象,并设置命令对象的接收者。注意,这里的客户端并不是我们通常所指的客户端,而是指组装命令和接收者的地方,把这个Client称为装配者或者意义会更明了,真正使用命令的客户端是从Invoker来触发执行的,而不是从这个Client端命令的调用。

4、模式解读

命令模式的类图如下所示

5、JDK涉及到的设计模式

6、模式总结

优点

1、封装性很好

2、扩展性很好

缺点

1、可能会导致系统具有过多的具体命令类

适用场景

1、对于大多数请求响应模式的功能,比较适合使用命令模式,正如命令模式定义说的那样,命令模式对实现记录日志、撤销操作等功能比较方便。