python-3.x - 在观察者设计模式中,主题类是如何存储的?
问题描述
我一直在阅读观察者设计模式。
从以下文章中获取以下代码: 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()
解决方案
您不需要持久化这些类。您需要做的就是持久化数据。在您的真实示例中,Quora 仅存储每个问题的订阅者列表。如果有任何活动,它只需要调用一些Notification
服务,传递列表,最终将邮件发送给订阅用户。
推荐阅读
- javascript - 我需要一种方法来使用javascript找出每个div中图像中可用的颜色代码
- python - 逻辑错误;从目录调用时文件未打开
- python-2.7 - AWS python SDK 多次调用 AWS lambda 函数
- javascript - EaselJS - 改变线条的透明度
- javascript - 可读流是否总是关闭
- android - 设备管理员添加屏幕未出现
- javascript - 数组和...数组之间的区别
- c++ - 将进程的执行从thread1转移到thread2
- firebase - Firestore Firebase 数据库规则
- java - 如何从 Spring 3.x 迁移到 5.x?