观察者模式的替代方案,其中主题和观察者都代表同一实体?

时间:2019-06-26 11:51:44

标签: design-patterns observer-pattern software-design

我的项目中基本上有一个节点类,其他节点可以订阅。这样,如果我要在此处实现观察者模式,那将意味着该节点类最终将成为主题和观察者。我查看了类似的设计模式,但找不到适合自己需求的东西。即使节点类必须同时实现主题接口和观察者接口,观察者模式在这里是否也起作用?或者是否可以使用更合适的替代方法?谢谢。

1 个答案:

答案 0 :(得分:0)

  

观察者模式在这里有用吗

这个问题有两个部分。

从技术上讲,一个班级可以同时扮演主题和观察者的角色吗?

是的。观察者模式的结构没有什么可以阻止这种情况的。只需让Subject类实现Observer接口(或等效方法),然后注册该类的实例即可。 Gamma et al.明确提到了这种可能性:

  

9。组合Subject和Observer类。 [...]这样,您就可以定义一个既充当主体又充当观察者的对象,而没有多重继承...

这是个好主意吗?

这将取决于您要解决的特定设计问题。要解决的两个常见问题是:

  • 如果正在运行的程序中的许多节点实例不是 主题,那么让它们全部具有未使用的字段来跟踪其不存在的观察者可能不是最佳选择。在这种情况下,值得考虑使用专门的ObservableNode类子类。请参见ObservableList的示例。

  • 代码的某些部分必须负责避免观察者通知序列中的循环。