什么是命令模式:封装调用
将”请求”封装成对象,以便使用不同的请求、队列、或者日志来参数化其他对象。命令模式也支持可撤销的操作。
–《Head Fist设计模式》
为什么用命令模式
在开发过程中,我们经常需要向某一些对象发送请求,让他们来处理,但是最终由哪一个对象来处理,我们其实并不在意。程序只需要在运行时确定具体哪个对象处理就好了。这就是命令模式可以帮我们解决的问题,应用命令模式,我们可以解除发起请求者和请求接收者的关联,也就是解耦,让对象之间的调用关系更加灵活。
模式结构
命令模式包含的角色如下:
- Command:抽象命令
- ConcreteCommand:具体命令
- Invoker:请求发起者
- Receiver:请求接收者
- Client:客户端
类图
命令模式的使用
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
优点
- 将发出请求的对象与执行请求的对象解耦;
- 新的命令可以很容易加到系统中;
- 可以很容易实现命令队列和宏命令;
- 可以方便地实现undo和redo;
缺点
- 可能导致系统中有过多的具体命令类,因为需要针对每一个命令设计一个具体命令类(这一点与装饰者模式类似);
应用场景
- 需要将请求发起者和请求处理者解耦,使得发起者和处理者不直接交互(或因为它们不能交互);
- 系统需要在不同的时间指定请求,将请求排队和处理(例如日志记录系统);
- 系统需要支持undo和redo操作;
扩展
宏命令
宏命令又称组合命令,他是命令模式和组合模式的结合。宏命令也是一个具体的命令,不过它包含的不是接收者,而是一组命令对象。在调用宏命令的execute方法时,它会循环去调用每个成员命令的execute方法。执行一个宏命令将可以执行一组命令,从而实现对命令的批量操作。
在JDK中的应用
java.lang.Thread
|
|