设计模式十四:旁观者模式
什么是旁观者模式
描述单个对象(发布者)与一个或多个对象(订阅者)之间的发布-订阅关系。
使用场景
希望在一个对象的状态改变时更新另外一组对象。
典型案例
拍卖会,不论出价人在何时举牌,拍卖师都会更新报价,并将新的价格广播给所有出价人。
实例代码
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) # type(self).__name__ 是获取类名的简便技巧
@property # 提供_data变量的读取访问方式,可用object.data代替object.data()
def data(self):
return self._data
@data.setter # 每次使用赋值符(=)为_data变量赋新值时被调用
def data(self,vaule):
try:
self._data = int(vaule)
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)
print()
hf = HexFormatter()
df.add(hf)
df.data = 3
print(df)
print()
bf = BinaryFormatter()
df.add(bf)
df.data = 21
print(df)
print()
df.data = 40
print(df)
print()
df.remove(hf)
df.add(bf)
df.data = 'hello'
print(df)
print()
df.data = 15.8
print(df)
if __name__ == "__main__":
main()