【问题标题】:Is it possible to have multiple subjects in Observer pattern? [closed]观察者模式中是否可以有多个主题? [关闭]
【发布时间】:2020-11-20 22:44:24
【问题描述】:

我一直在研究观察者模式,其中包含一对多事件。在这种情况下,是否通知了多个类,即来自一个主题的多个观察者? 相反,我想问的主题可能不止一个吗?这种情况是否超出了观察者模式,创建了不同的模式?

想象一家印刷报纸杂志书籍的出版社。用户可以订阅他们想要的任何内容。例如,用户可能只订阅 books 或同时订阅 booksnewspapers。每次发布其中一种新类型时,都应通知相关用户。不应通知未注册的用户。换句话说,如果用户只注册了books,则不会为newspapers发送通知。

在这个例子中,主题是出版社吗?或者 booksnewspapersmagazines 会是不同的主题吗?

【问题讨论】:

    标签: design-patterns observer-pattern


    【解决方案1】:

    观察者模式适用于一对多通知。事实上,GoF 书那一章的第一句话是,

    在对象之间定义一对多的依赖关系,这样当一个对象改变状态时,它的所有依赖项都会得到通知并自动更新。

    显而易见的解决方案是让出版社成为主题。在这种情况下,我的偏好是让主题触发不同类型的事件,并允许观察者为他们感兴趣的每种类型的事件分别注册。也可以触发单个事件类型并强制观察者确定发生了什么变化.

    或者,您可以将每个单独的出版物视为自己的主题。正如您所提到的,在这种情况下,观察者必须向不同的主题注册。我在这里看到的唯一优势是您可以让观察者与他们不需要知道的出版物脱钩。

    这两种选择都是可行的。我会推荐出版社作为主题。

    【讨论】:

    • GoF 书中确实提到了观察多个主题的情况(“观察多个主题”,第 297 页)。另请参阅此处 (stackoverflow.com/a/4829657/3160284)。所以对于OP的问题,这可能不会构成新的设计模式。
    • 我同意。 “alternatively”这个词并不意味着暗示一种替代模式,而是相同模式的替代实现。正如 GoF 书中所发表的,Observer 非常广泛。关于是否应该将其拆分为多种模式的激烈争论只导致了一种模式。辩论记录在Pattern Hatching。如果辩论以另一种方式进行,我从上面的偏好(其中一个主题触发不同类型的事件)将被称为 Multicast 而不是 Observer。就目前而言,这两个选项都符合观察者模式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    • 2011-06-17
    • 2013-03-11
    相关资源
    最近更新 更多