命令模式

来源:互联网 发布:幸福狐狸内衣淘宝有卖 编辑:程序博客网 时间:2024/05/16 12:17

    命令模式可以将“动作的请求者”从“动作的执行者”对象中解耦。利用命令对象,把请求封装成一个特定对象。

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

 

    命令模式的更多用途:
    a.队列请求。命令可以将运算块打包(一个接收者和一组动作),然后将它传来传去,就像是一般的对象一样。想象一个工作队列:你在某一端添加命令,然后另一端则是线程。线程进行下面的动作;从队列中取出一个命令,调用它的execute()方法,等待这个调用完成,然后将此命令对象丢弃,再取下一个命令……请注意,工作队列类和进行计算的对象之间完全是解耦的。工作队列对象不在乎到底做些什么,它们只知道取出命令对象,然后调用其execute()方法。只要是实现命令模式的对象,就可以放入队列里。
    b.日志请求。命令模式通过新增两个方法(store()、load()),利用对象的序列化实现恢复对象状态的日志功能。通过记录日志,在检查点之后的所有操作记录下来,实现恢复的目的。

 

    要点:
    1.命令模式将发出请求的对象和执行请求的对象解耦。
    2.在被解耦的两者之间是通过命令对象进行沟通的,命令对象封装了接收者和一个或一组动作。
    3.调用者通过调用命令对象的execute()发出请求,这会使得接收者的动作被调用。
    4.调用者可以接受命令当做参数,甚至在运行时动态地进行。
    5.命令模式可以支持撤销,做法是实现一个undo()方法来回到execute被执行前的状态。
    6.宏命令是命令模式的一种简单的延伸,允许调用多个命令。宏方法也可以支持撤销。
    7.实际操作时,很常见使用“聪明”命令对象,也就是直接实现了请求,而不是将工作委托给接收者。
    8.命令也可以用来实现日志和事务系统。

 

一个简单的例子:

测试及输出:

 

原创粉丝点击