В шаблоне проектирования Observer Как сохраняется предметный класс? - PullRequest
0 голосов
/ 23 января 2020

Я читал шаблон проектирования наблюдателя.

Возьмите приведенный ниже код из следующей статьи: 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()



1 Ответ

0 голосов
/ 23 января 2020

Вам не нужно сохранять классы. Все, что вам нужно сделать, это сохранить данные . В вашем реальном примере Quora просто хранит список подписчиков для каждого вопроса. Если есть какое-либо действие, ему просто нужно позвонить какой-нибудь службе Notification, передавая список, который в конечном итоге отправит почту подписанным пользователям.

...