【胡思乱想】命令模式中,命令对象如何解耦Invoker和Receiver
2018-10-28 03:00
288 查看
首先,我们得清楚为何要解耦?
耦合的坏处就是,牵一发而动全身,比如,当我更改了类A或其子类的时候,类B也要进行修改。这里,解除耦合,就意味着,即使你Receiver怎么改,添加了多少,删除了多少。我Invoker都不需要做什么改动。
有人会说,这不是很好办吗,我定义一个接口,每个Receiver都实现这个接口,然后我Invoker针对这个接口编程不就好了?
这样有两个问题,一方面,我可能需要根据Receivier的方法或特性进行多种操作,一个接口实现是不能够满足需求的。 另一方面,如果有些Receiver已经存在,如果要让它实现一个接口,那不是就要修改原来的代码吗,这是要尽量避免的。 注意:Receiver可以是任何一个类。我们的目的就是要无修改地利用现有类。让Invoker根据需要,利用现有类的部分功能。 命令模式如何实现解耦? Invoker同样是针对接口编程,不过这个接口并不是由Receiver实现,而是由命令对象实现。Invoker只管调用命令对象的execute方法即可,它根本不知道execute方法里发生了什么。命令对象就是Invoker和Receiver之间沟通的桥梁。利用命令对象,我们可以根据需要使Invoker调用某个类的某个方法等。 有人就奇怪了,要操作一个Receiver的某个方法,直接调用不就好了,为什么还要封装一下,专门给Invoker调用,这么麻烦? 很多学习命令模式的,刚接触的案例都是那几个。直接调用,和让Invoker调用,输出也没什么差别。所以,很多人没有意识到,命令给谁做的差别。但是,设想一下,如果这个命令是交给一个线程呢?这就不一样了吧。 如果不是直接调用,而是给其他类调用,那么这个调用类就必须知道该如何操作这个被调用的类(Receiver),而命令对象,就告诉了它,"别怕,你只要执行我的execute方法就好了,其他细节我来处理。"相关文章推荐
- 请求发送者与接收者解耦——命令模式(三)
- 本文是笔者根据数据库编程经验,利用C++语言的模板、继承、授权、多态等面向对象特性,借鉴命令模式,实现了对象在关系数据中的存储,降低应用系统与数据库之间的耦合,提高开发效率。
- ubuntu 如何启动命令模式
- 如何用数据表对象生成 sql insert 命令
- 如何让孩子爱上设计模式 ——17.命令模式(Command Pattern)
- [置顶] 观察者模式及如何通过消息机制(观察者模式)实现模块间解耦
- 设计模式(14)----- 命令设计模式(升级----一个命令对象执行多条命令)
- 如何训练自己面向对象思维模式
- 请求发送者与接收者解耦——命令模式(四)
- 19、命令模式—为请求者和实现者解耦
- 设计模式之命令(Command)---对象行为型模式
- Command(命令)-对象行为型模式
- 如何使用动态共享对象的模式来安装PHP
- JavaScript中的对象,如何创建对象,创建对象的7种模式
- 请求发送者与接收者解耦——命令模式(一)
- FormView 编辑模式 DataBind 事件中如何获取当前绑定的数据对象
- [导入]C#面向对象设计模式纵横谈(15):(行为型模式) Command 命令模式.zip(7.56 MB)
- 命令模式-对象行为型
- 请求发送者与接收者解耦——命令模式(二)
- C#面向对象模式设计第十五讲:Command 命令模式(行为型模式)