目前我正在研究设计模式,并且我已经找到了一个部分,我很困惑观察者模式是使用推动机制还是利用拉动机制?
我已经阅读了不同的实现,并不能真正确定哪一个是正确的.
此外,我想知道推模型对拉模型的三个直接优势.我猜其中一个是推模型比拉模型更少耦合?
定义:Observer模式定义了对象之间的一对多依赖关系,这样当一个对象改变状态时,它的所有依赖关系都会自动得到通知和更新
需要关注的3件事:
可观察对象 - 被观察的对象.
Observer对象 - 观察可观察对象的对象
通信机制 - 推或推机制
目前我正在研究设计模式,并且我已经找到了一个部分,我很困惑观察者模式是使用推动机制还是利用拉动机制?
混乱可能是因为你是文学名字 - 拉或推.
请注意,在这两种机制中,Observable对象始终有责任通知所有已订阅的观察者,但不同之处在于观察者是否[Push - >]获得所需的确切数据,或者[Pull->]获取数据包装在某个对象(主要是Observable对象)中,它必须从中提取所需的数据.
Push - > Observer直接获取所需数据
Pull - > Observer获取包装在对象中的数据,它需要提取它.
我已经阅读了不同的实现,并不能真正确定哪一个是正确的.
这里不是纠正的问题,实际上两者在任何情况下都能正常工作.如果我们看到这两种机制的以下细节,那么它最适合于特定场景/情况,可以轻松分析.
此外,我想知道推模型对拉模型的三个直接优势.我猜其中一个是推模型比拉模型更少耦合?
我可能无法提供3个优点,但如果我能通过使用用例示例清楚地了解使用方法,请让我尝试一下:
推动机制
这纯粹是Observable的责任,Observer只需要确保他们在他们的更新方法中放置了所需的代码.
好处
"推"模型的主要优点是观察者和主体之间的耦合较低.
Observable和Observer都是接口/抽象类,实际上是一个设计原则 - 程序接口或超类型
坏处
灵活性较低:由于Observable需要将所需数据发送到Observer,如果我们说1000个观察者并且大多数需要不同类型的数据,它将变得混乱.
用例
当最多2-3种不同类型的观察者(不同类型意味着观察者需要不同的数据)或所有观察者需要相同类型的数据时,应该使用它.
就像银行中的令牌系统一样
在这个所有观察者(不同的LED)中只需要一个通知更新的等待令牌号列表,因此与Pull Mechanism相比,可以更好地以这种方式实现.
拉机制
在pull机制中,Observable有责任通知所有观察者某些事情已经发生了变化,但是这次Observable共享整个具有变化的对象,一些观察者可能不需要完整的对象,所以Observers只需要提取所需的该更新方法中该完整项目的详细信息.
好处
这样做的好处是更灵活.
每个观察者可以自己决定要查询的内容,而不依赖于主题来发送正确的(仅需要的)信息.
坏处
观察者必须知道关于主题的事情,以便从共享的完整对象中查询正确的信息.
用例
当有超过2-3种不同类型的观察者时应该使用它(不同的类型意味着观察者需要不同的数据)
就像任何外汇汇率提供商为不同的投资银行发布外汇汇率一样
在这一些银行只处理INR,其他一些只处理GBP等,因此与Push机制相比,它应该使用Pull机制实现.
参考
头脑优先设计模式书
https://softwareengineering.stackexchange.com/questions/253398/the-observer-pattern-using-the-pulling-mechanism?newreg=999c28a6a1f6499783fbe56eb97fa8ec
https://dzone.com/articles/observer-pattern