观察者模式 描述单个对象与一个或多个对象之间的发布-订阅关系。
当一个对象的状态改变时更新另外一组对象

class Publisher:
def __init__(self):
self.observers = []
def add(self, observer):
if observer not in self.observers:
self.observers.append(observer)
else:
print('Failed to add: {}'.format(observer))
def remove(self, observer):
try:
self.observers.remove(observer)
except ValueError:
print('Failed to remove: {}'.format(observer))
def notify(self):
[o.notify(self) for o in self.observers]
class DefaultFormatter(Publisher):
def __init__(self, name):
Publisher.__init__(self)
self.name = name
self._data = 0
def __str__(self):
return "{}: '{}' has data = {}".format(type(self).__name__, self.name, self._data)
@property
def data(self):
return self._data
@data.setter
def data(self, new_value):
try:
self._data = int(new_value)
except ValueError as e:
print('Error: {}'.format(e))
else:
self.notify()
class HexFormatter:
def notify(self, publisher):
print("{}: '{}' has now hex data = {}".format(type(self).__name__,
publisher.name, hex(publisher.data)))
class BinaryFormatter:
def notify(self, publisher):
print("{}: '{}' has now bin data = {}".format(type(self).__name__,
publisher.name, bin(publisher.data)))
def main():
df = DefaultFormatter('test1')
print(df)
hf = HexFormatter()
df.add(hf)
df.data = 3
print(df)
bf = BinaryFormatter()
df.add(bf)
df.data = 21
print(df)
df.remove(hf)
df.data = 40
print(df)
df.remove(hf)
df.add(bf)
df.data = 'hello'
print(df)
df.data = 15.8
print(df)
if __name__ == '__main__':
main()