设计模式(23) - 命令模式

问题描述

一个消息的发送者对象向消息的接收者发送消息,发送者如果保持接收者的信息,即可完成消息的投递。但是这种方式把消息的发送者和接收者直接绑定在一起,让消息的发送者依赖于消息的接收者。命令模式解除了消息发送者对于消息接收者的依赖。

命令模式

如图所示,命令模式引入了一个间接层即Command对象来隔离消息发送者Invoker对象和消息的接收者对象Receiver。客户把一个消息接收者对象Receiver注册到一个Command对象中,以便Command对象Execute()方法转发一个消息给该接收者。客户利用一个Command对象来参数化消息发送者Invoker对象,当Invoker对象检测到消息需要发送的时候,投递该消息到Command对象。在Invoker对象看来,Command对象封装了消息的接收者信息(包括接收者的类型,消息接收方法等);Invoker对象只需要与一个稳定的Command接口交互,而不需要关注消息接收者的信息。除了消息投递,Command对象Execute()方法可以完成其他操作,例如:

  • 决定是否转发该消息到 Receiver对象
  • 依据ConcreteCommand和Receiver的约定,Execute()方法也可以调用Receiver的多个方法来完成一个消息的接收工作
  • 利用Memento备忘录模式,ConcreteCommand对象甚至可以支持一个命令的撤销:即依据备忘信息来恢复Receiver对象在执行命令前的状态。
Command模式隐藏了消息接收的逻辑:包括谁接收,如何接收等信息都被Command对象完全隐藏;Invoker对象只需要向Command对象提交一个请求/消息就可以了。


讨论

命令模式在消息的发送者和接收者之间引入了一个间接层次,即Command对象;解除了消息的发送者和接收者的直接依赖关系;消除了消息发送者和消息接收逻辑之间的依赖关系。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值