design-patterns - [GoF]-ConcreteSubject 可以覆盖通知方法吗?
问题描述
我正在模拟一种情况,其中有:
- NotificationBox : 观察者
- list1,list2,list3:主题
现在我将使用观察者模式制作一张图表来描述每个列表实现不同类型的 notify() 的事实(例如,列表状态的某些更改需要仅通过某些标准通知某个观察者)
我做了类似的东西:
在这种情况下,每个主题都会覆盖通知方法,以便仅通知观察者的某个子集,这取决于某些标准,并使用正确的更新方法。
例子
ListaMDDpubblico是一个由某个文件组成的列表,每个文件都有一个特定的标签。加载文件时,应使用updateMDD仅通知与“喜欢”文件标签的用户相关联的notificationBox 。
它对 [GoF] 友好吗?
或者我需要制作 3 个不同的 Subject 抽象类,每个都以列表方式实现 notify 方法?
提前致谢
[编辑]
在对答案和评论进行了一些推理之后,我对这种情况所做的另一种可能的设计是:
通过这种方式,每个更改都会通知所有订阅的观察者(针对每种不同类型的主题),并且了解是否必须考虑通知的逻辑在由 notificationBox 实现的更新方法中建模(因此现在通知是广播的,并且每个ConcreteSubject 不需要对具体观察者一无所知)。
解决方案
GoF 书第 298-299 页详细讨论了这个问题。我认为上面显示的设计最接近,
明确指定感兴趣的修改。您可以通过扩展主题的注册接口以允许仅针对感兴趣的特定事件注册观察者来提高更新效率。当这样的事件发生时,对象只通知那些对该事件感兴趣的观察者。
然而,GoF 书的实现方式与上面显示的设计略有不同。上述设计扩展了观察者接口以指定每种类型的事件,因此事件类型的知识传播到每个主题(以及每个观察者,如果有多个)。此外,如果将来添加新的事件类型,则很容易编辑观察者界面。
由于这些原因,我更喜欢使用多个观察者的方法。与其将所有更新方法组合到一个接口中,不如将它们分成GsObserver
、MddObserver
和DdlObserver
。每个主体只能注册其中一个观察者接口,但NotificationBox
可以实现所有三个。
推荐阅读
- ruby - RSpec:期望一个方法被调用导致该方法实际上没有被调用
- android - 如何知道 Android 是决定使用本地化的 strings.xml 文件还是默认文件?
- python - 使用标记值作为默认值的类型提示参数
- typeorm - UserEntity 的 TypeOrm 实例化失败
- apache-spark - spark如何在后台读取数据?
- r - 运行 pcor.test 的问题(部分相关)
- javascript - 2 使用 Fast-UI + Vue.js 版本的方式绑定问题。2.6.11
- docker - 当主要 go 文件位于嵌套目录中时,如何解析 dockerfile 和 docker-compose?
- amazon-web-services - 从浏览器录制实时音频并流式传输到 Amazon S3 进行存储
- java - Jar 文件无权写入带有扩展名的文件