命令模式定义:将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。
命令模式,封装方法调用,命令模式可将“动作的请求者”从“动作的执行者”对象中解耦。类图,如下:
生活中例子:餐厅点菜(顾客,服务员,厨师关系,顾客订单告诉服务员就是,不用直接厨师打交道,厨师收到服务员的发来的订单后开始做好大餐)。
命令模式的优点:
● 在命令模式中, 请求者不直接与接收者交互, 即请求者不包含接收者的引用, 因此彻底消除了彼此之间的耦合.
● 命令模式满足"开-闭"原则. 如果增加新的具体命令和该命令的接收者, 不必修改调用者的代码, 调用者就可以使用新的命令对象; 反之, 如果增加新的调用者, 不必修改现有的具体命令和接收者, 新增加的调用者就可以使用自己已有的具体命令
● 由于请求者被封装到了具体命令中, 那么就可以将具体命令保存到持久化的媒介中, 在需要的时候, 重新执行这个具体命令. 因此使用命令模式可以记录日志.
● 使用命令模式可以对请求者的"请求"进行排队. 每个请求都各自对应一个具体命令,因此可以按照一定的顺序执行这些命令.
命令模式的使用场景:
● 命令模式将发出请求的对象和执行请求的对象进行解耦
● 用于队列请求,命令对象和一般对象一样可以被传来传去,只要实现统一的接口方法,可以被任意调用
● 用于日志请求,将所有动作记录在日志中,以便系统死机后能够重新调用来恢复
案例1:实现一个家庭自动化遥控器,能遥控灯,空调,,,等设备的开/关。(硬件api类是厂家提供),类图如下:
更多需求思考?
● 如果需要撤销命令,怎么修改呢?
● 如果需要组合命令,比如(先打开灯,然后打开电视,然后打开热水器,打开影响),这么实现呢?
● 如命令需要跨jvm,跨机器执行,怎么实现呢?
● 如果需要宕机后恢复数据,怎么实现呢?
本文题目:“HeadFirst设计模式“:命令模式-创新互联
当前链接:http://scpingwu.com/article/dsjjdi.html