美文网首页
2 命令模式

2 命令模式

作者: 6cc89d7ec09f | 来源:发表于2018-10-11 16:23 被阅读30次

    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 设计模式 封装调用:命令模式

    相关文章

      网友评论

          本文标题:2 命令模式

          本文链接:https://www.haomeiwen.com/subject/wpvbaftx.html