1 什么是命令模式?
- 难点
1 需要弄懂什么是命令模式
2 搞懂命令模式的核心是什么
3 看懂命令模式的Demo
- 定义
命令模式的定义
:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
- 核心
阅读设计模式,要记得取其精华,用于变通,命令模式的核心就是:
1 将请求封装成了对象
2 对多个请求进行管理,进行队列操作,撤销操作等
2 命令模式常用的几个类
借用图
image.png
Command
:定义命令的接口,声明执行的方法.以及撤销方法(相当于Runnable)
ConcreteCommand
:命令接口对象,通常会持有接收者,并调用接收者的功能来完成命令要执行的操作(相当于Runnable的实现)
Receiver
:接收者,真正执行命令的对象(相当于Thread类)
Invoker
:要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象,这个是客户端真正触发命令并要求命令执行相应操作的地方(相当于ThreadPool类,管理了任务队列)
Client
:创建具体的命令对象,并且设置命令对象的接受者。(在Spring框架下,这个角色可以省略)
3 命令模式的简单Demo
点击标题查看代码
4 命令模式的应用场景
-
Multi-level undo
多级undo操作
如果系统需要实现多级回退操作,这时如果所有用户的操作都以
command
对象的形式实现,系统可以简
单地用stack来保存最近执行的命令,如果用户需要执行undo
操作,系统只需简单地popup
一个最近的
command
对象然后执行它的undo()
方法既可。
-
Transactional behavior
简单的原子事务行为
借助
command
模式,可以简单地实现一个具有原子事务的行为。当一个事务失败时,往往需要回退到执
行前的状态,可以借助command
对象保存这种状态,简单地处理回退操作。
-
Progress bars
(状态条)
假如系统需要按顺序执行一系列的命令操作,如果每个
command
对象都提供一个getEstimatedDuration()
方法,那么系统可以简单地评估执行状态并显示出合适的状态条。
-
Thread pools
(线程池)
通常一个典型的线程池实现类可能有一个名为
addTask()
的public
方法,用来添加一项工作任务到任务
队列中。该任务队列中的所有任务可以用command
对象来封装,通常这些command
对象会实现一个通用的 接口比如java.lang.Runnable。
-
Macro recording
(宏纪录,请求记录)
可以用command对象来封装用户的一个操作,这样系统可以简单通过队列保存一系列的
command
对象的状态就可以记录用户的连续操作。这样通过执行队列中的command
对象,就可以完成"Play back
"操作了.
比如:对于大型的数据结构操作,无法在每次发生改变时就进行保存(数据量太大),但是可以保存每次操作的日志.并持久化.如果操作出问题了,可以查询检查点之后的日志,并执行一遍,来恢复最新状态
-
Networking
网络请求
通过网络发送command命令到其他机器上运行。
比如:rpc调用,servlet请求等.或多或少都有用到命令模式的一些影子,但没有完全照搬命令模式,会有一定程度的变种
-
Parallel Processing
(并发处理)
当一个调用共享某个资源并被多个线程并发处理时。
比如:多线程对同一把锁的竞争时,会在同一个等待队列上
5 命令模式的 撤销Demo
查看HeadFirst 设计模式 封装调用:命令模式
网友评论