“Head First 设计模式“ :命令模式

命令模式


命令模式定义:将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。
命令模式,封装方法调用,命令模式可将“动作的请求者”从“动作的执行者”对象中解耦。类图,如下:

“Head First 设计模式“ :命令模式


生活中例子:餐厅点菜(顾客,服务员,厨师关系,顾客订单告诉服务员就是,不用直接厨师打交道,厨师收到服务员的发来的订单后开始做好大餐)。


命令模式的优点
● 在命令模式中, 请求者不直接与接收者交互, 即请求者不包含接收者的引用, 因此彻底消除了彼此之间的耦合.
● 命令模式满足"开-闭"原则. 如果增加新的具体命令和该命令的接收者, 不必修改调用者的代码, 调用者就可以使用新的命令对象; 反之, 如果增加新的调用者, 不必修改现有的具体命令和接收者, 新增加的调用者就可以使用自己已有的具体命令
● 由于请求者被封装到了具体命令中, 那么就可以将具体命令保存到持久化的媒介中, 在需要的时候, 重新执行这个具体命令. 因此使用命令模式可以记录日志.
● 使用命令模式可以对请求者的"请求"进行排队. 每个请求都各自对应一个具体命令,因此可以按照一定的顺序执行这些命令.


命令模式的使用场景
● 命令模式将发出请求的对象和执行请求的对象进行解耦
● 用于队列请求,命令对象和一般对象一样可以被传来传去,只要实现统一的接口方法,可以被任意调用
● 用于日志请求,将所有动作记录在日志中,以便系统死机后能够重新调用来恢复


案例1:实现一个家庭自动化遥控器,能遥控灯,空调,,,等设备的开/关。(硬件api类是厂家提供),类图如下:
“Head First 设计模式“ :命令模式


更多需求思考?
● 如果需要撤销命令,怎么修改呢?
● 如果需要组合命令,比如(先打开灯,然后打开电视,然后打开热水器,打开影响),这么实现呢?
● 如命令需要跨jvm,跨机器执行,怎么实现呢?
● 如果需要宕机后恢复数据,怎么实现呢?

转载于:https://blog.51cto.com/u2r2otkit/2108035

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值