参考文章:
观察者模式 | 菜鸟教程
教程由java实现, 本文以python实现.功能相同.
1. 观察者模式实现效果
Subject类为主, 当subject对象的值改动时.发布通知到各个注册了的观察者对象当中. 观察者接受通知并分别输出值的二进制,十进制,十六进制.
2. 关键逻辑
- subject中维护一个观察者列表observers, 观察者主动注册, 通知时遍历列表.
- 观察者类继承于同一个基类. 接受通知时分别调用各子类的方法,即多态.
3. 实现代码
class Subject(object):
def __init__(self):
self.observers = []
self.state = 0
def getState(self):
return self.state
def setState(self, value):
self.state = value
self.notifyAllObservers()
def attach(self, observer):
self.observers.append(observer)
def notifyAllObservers(self):
for observer in self.observers:
observer.update()
class Observer(object):
# Subject
def __init__(self, subject):
self.subject = subject
subject.attach(self)
def update(self):
pass
class BinaryObserver(Observer):
def update(self):
print("Binary String: "+ bin(self.subject.getState()))
class OctalObserver(Observer):
def update(self):
print("Octal String: "+ oct(self.subject.getState()))
class HexaObserver(Observer):
def update(self):
print("Hex String: "+ hex(self.subject.getState()))
subject = Subject()
HexaObserver(subject)
OctalObserver(subject)
BinaryObserver(subject)
print("First state change: 15")
subject.setState(15)
print("First state change: 10")
subject.setState(10)
输出结果:
First state change: 15
Hex String: 0xf
Octal String: 0o17
Binary String: 0b1111
First state change: 10
Hex String: 0xa
Octal String: 0o12
Binary String: 0b1010
学习笔记: 观察者模式与发布订阅模式的区别
关键: 存储观察者列表与发布通知的模块不同