2 命令模式

2018-10-11  本文已影响30人  6cc89d7ec09f

1 什么是命令模式?

1 需要弄懂什么是命令模式
2 搞懂命令模式的核心是什么
3 看懂命令模式的Demo

命令模式的定义:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

阅读设计模式,要记得取其精华,用于变通,命令模式的核心就是:
1 将请求封装成了对象
2 对多个请求进行管理,进行队列操作,撤销操作等

2 命令模式常用的几个类

借用图


image.png

Command:定义命令的接口,声明执行的方法.以及撤销方法(相当于Runnable)
ConcreteCommand:命令接口对象,通常会持有接收者,并调用接收者的功能来完成命令要执行的操作(相当于Runnable的实现)
Receiver:接收者,真正执行命令的对象(相当于Thread类)
Invoker:要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象,这个是客户端真正触发命令并要求命令执行相应操作的地方(相当于ThreadPool类,管理了任务队列)
Client:创建具体的命令对象,并且设置命令对象的接受者。(在Spring框架下,这个角色可以省略)

3 命令模式的简单Demo

点击标题查看代码

4 命令模式的应用场景

如果系统需要实现多级回退操作,这时如果所有用户的操作都以command对象的形式实现,系统可以简
单地用stack来保存最近执行的命令,如果用户需要执行undo操作,系统只需简单地popup一个最近的
command对象然后执行它的undo()方法既可。

借助command模式,可以简单地实现一个具有原子事务的行为。当一个事务失败时,往往需要回退到执
行前的状态,可以借助command对象保存这种状态,简单地处理回退操作。

假如系统需要按顺序执行一系列的命令操作,如果每个command对象都提供一个 getEstimatedDuration()方法,那么系统可以简单地评估执行状态并显示出合适的状态条。

通常一个典型的线程池实现类可能有一个名为addTask()public方法,用来添加一项工作任务到任务
队列中。该任务队列中的所有任务可以用command对象来封装,通常这些command对象会实现一个通用的 接口比如java.lang.Runnable。

可以用command对象来封装用户的一个操作,这样系统可以简单通过队列保存一系列的command对象的状态就可以记录用户的连续操作。这样通过执行队列中的command对象,就可以完成"Play back"操作了.
比如:对于大型的数据结构操作,无法在每次发生改变时就进行保存(数据量太大),但是可以保存每次操作的日志.并持久化.如果操作出问题了,可以查询检查点之后的日志,并执行一遍,来恢复最新状态

通过网络发送command命令到其他机器上运行。
比如:rpc调用,servlet请求等.或多或少都有用到命令模式的一些影子,但没有完全照搬命令模式,会有一定程度的变种

当一个调用共享某个资源并被多个线程并发处理时。
比如:多线程对同一把锁的竞争时,会在同一个等待队列上

5 命令模式的 撤销Demo

查看HeadFirst 设计模式 封装调用:命令模式

上一篇下一篇

猜你喜欢

热点阅读