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