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

来源:互联网 发布:易语言编程系统 编辑:程序博客网 时间:2024/06/14 19:13

问题描述

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

命令模式

如图所示,命令模式引入了一个间接层即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
原创粉丝点击