【胡思乱想】命令模式中,命令对象如何解耦Invoker和Receiver
首先,我们得清楚为何要解耦?
耦合的坏处就是,牵一发而动全身,比如,当我更改了类A或其子类的时候,类B也要进行修改。这里,解除耦合,就意味着,即使你Receiver怎么改,添加了多少,删除了多少。我Invoker都不需要做什么改动。
有人会说,这不是很好办吗,我定义一个接口,每个Receiver都实现这个接口,然后我Invoker针对这个接口编程不就好了?
这样有两个问题,一方面,我可能需要根据Receivier的方法或特性进行多种操作,一个接口实现是不能够满足需求的。
另一方面,如果有些Receiver已经存在,如果要让它实现一个接口,那不是就要修改原来的代码吗,这是要尽量避免的。
注意:Receiver可以是任何一个类。我们的目的就是要无修改地利用现有类。让Invoker根据需要,利用现有类的部分功能。
命令模式如何实现解耦?
Invoker同样是针对接口编程,不过这个接口并不是由Receiver实现,而是由命令对象实现。Invoker只管调用命令对象的execute方法即可,它根本不知道execute方法里发生了什么。命令对象就是Invoker和Receiver之间沟通的桥梁。利用命令对象,我们可以根据需要使Invoker调用某个类的某个方法等。
有人就奇怪了,要操作一个Receiver的某个方法,直接调用不就好了,为什么还要封装一下,专门给Invoker调用,这么麻烦?
很多学习命令模式的,刚接触的案例都是那几个。直接调用,和让Invoker调用,输出也没什么差别。所以,很多人没有意识到,命令给谁做的差别。但是,设想一下,如果这个命令是交给一个线程呢?这就不一样了吧。
如果不是直接调用,而是给其他类调用,那么这个调用类就必须知道该如何操作这个被调用的类(Receiver),而命令对象,就告诉了它,"别怕,你只要执行我的execute方法就好了,其他细节我来处理。"
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库