首页 > 解决方案 > 在观察者设计模式中,主题类是如何存储的?

问题描述

我一直在阅读观察者设计模式。

从以下文章中获取以下代码: https ://sourcemaking.com/design_patterns/observer/python/1

我了解代码的工作原理以及主题和观察者这两个类如何相互关联。我无法完全理解的是这一切在现实中是如何运作的。

在我读过的观察者模式的真实例子中,主体和观察者之间的交互往往是开放式的。例如,如果您在 Quora 上订阅问题并通过电子邮件收到答案通知,理论上,您可以无限期地收到更新。

如果将下面的代码应用于现实世界的场景(如 Quora),这些类如何持续存在?类及其状态是否存储在服务器的某个位置?

import abc


class Subject:
    """
    Know its observers. Any number of Observer objects may observe a
    subject.
    Send a notification to its observers when its state changes.
    """

    def __init__(self):
        self._observers = set()
        self._subject_state = None

    def attach(self, observer):
        observer._subject = self
        self._observers.add(observer)

    def detach(self, observer):
        observer._subject = None
        self._observers.discard(observer)

    def _notify(self):
        for observer in self._observers:
            observer.update(self._subject_state)

    @property
    def subject_state(self):
        return self._subject_state

    @subject_state.setter
    def subject_state(self, arg):
        self._subject_state = arg
        self._notify()


class Observer(metaclass=abc.ABCMeta):
    """
    Define an updating interface for objects that should be notified of
    changes in a subject.
    """

    def __init__(self):
        self._subject = None
        self._observer_state = None

    @abc.abstractmethod
    def update(self, arg):
        pass


class ConcreteObserver(Observer):
    """
    Implement the Observer updating interface to keep its state
    consistent with the subject's.
    Store state that should stay consistent with the subject's.
    """

    def update(self, arg):
        self._observer_state = arg
        # ...


def main():
    subject = Subject()
    concrete_observer = ConcreteObserver()
    subject.attach(concrete_observer)
    subject.subject_state = 123


if __name__ == "__main__":
    main()



标签: python-3.xdesign-patternsobserver-pattern

解决方案


您不需要持久化这些类。您需要做的就是持久化数据。在您的真实示例中,Quora 仅存储每个问题的订阅者列表。如果有任何活动,它只需要调用一些Notification服务,传递列表,最终将邮件发送给订阅用户。


推荐阅读