设计模式十四:旁观者模式

什么是旁观者模式

描述单个对象(发布者)与一个或多个对象(订阅者)之间的发布-订阅关系。

使用场景

希望在一个对象的状态改变时更新另外一组对象。

典型案例

拍卖会,不论出价人在何时举牌,拍卖师都会更新报价,并将新的价格广播给所有出价人。

实例代码

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 = nameself._data = 0def __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 = 3print(df)print()bf = BinaryFormatter()df.add(bf)df.data = 21print(df)print()df.data = 40print(df)print()df.remove(hf)df.add(bf)df.data = 'hello'print(df)print()df.data = 15.8print(df)if __name__ == "__main__":main()

Python设计模式:旁观者模式相关推荐

  1. Python设计模式-建造者模式

    Python设计模式-建造者模式 代码基于3.5.2,代码如下; #coding:utf-8 #建造者模式 class Burger():name = ""price = 0.0d ...

  2. Python设计模式-状态模式

    Python设计模式-状态模式 代码基于3.5.2,代码如下; #coding:utf-8 #状态模式class state():def writeProgram(self,work):raise N ...

  3. Python设计模式-备忘录模式

    Python设计模式-备忘录模式 代码基于3.5.2,代码如下; #coding:utf-8 #备忘录模式 import randomclass gameCharacter():vitality = ...

  4. Python设计模式-解释器模式

    Python设计模式-解释器模式 代码基于3.5.2,代码如下; #coding:utf-8 #解释器模式class PlayContext():play_text = Noneclass Expre ...

  5. Python设计模式-命令模式

    Python设计模式-命令模式 代码基于3.5.2,代码如下; #coding:utf-8 #命令模式class barbecuer():def bakeButton(self):print(&quo ...

  6. Python设计模式-策略模式

    Python设计模式-策略模式 代码基于3.5.2,代码如下; #coding:utf-8 #策略模式class sendInterface():def send(self,value):raise ...

  7. Python设计模式-外观模式

    Python设计模式-外观模式 代码基于3.5.2,代码如下; #coding:utf-8 # 外观模式class AlarmSensor:def run(self):print("Alar ...

  8. Python设计模式-桥接模式

    Python设计模式-桥接模式 基于Python3.5.2,代码如下 #coding:utf-8class Shape():name = ""param = "" ...

  9. Python设计模式-代理模式

    Python设计模式-代理模式 基于Python3.5.2,代码如下 #coding:utf-8info_struct = dict() info_struct["addr"] = ...

  10. 精通python设计模式-浅谈Python设计模式 - 原型模式

    声明,本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 在<精通Python设计模式>中把设计模式分为三种类型: 创建型模式 ...

最新文章

  1. Visual studio 2017基本配置
  2. 美团全链路压测自动化实践
  3. c++:栈的基本操作+实例:迷宫求解
  4. SQL Server中的Union和Union All语句之间的差异及其性能
  5. 将mysql从服务器永远变为只读_将mysql从服务器永远变为只读
  6. C#利用Socket实现客户端之间直接通信
  7. Android -- 网络请求
  8. 协议protocol
  9. java判断输入值是否在数组_java判断特定值是否在数组中的方法
  10. 计算机论文的字体要求,论文格式及字体大小要求(标准)
  11. Apabi Reader-强大的免费pdf文档阅读器(方正出品)
  12. 常见设计模式之(五):观察者模式
  13. DSP中EALLOW,EDIS,EINT,DINT,ERTM,DRTM的作用
  14. 新东方---博客分类目录
  15. 有道云笔记 markdown html,你不可不知的有道云笔记Markdown指南【进阶版】
  16. 万测试验机软件,万测关注检查井盖质量检测
  17. 《神经科学:探索脑》学习笔记(第6章 神经递质系统)
  18. 清华应届程序员同时被5家公司录取,晒出工资,网友:羡慕
  19. 关于serverlet
  20. eclipse @override 报错 解决

热门文章

  1. NET上传大文件出现网页无法显示的问题 默认的上传文件大小是4M
  2. 初识Loadrunner
  3. 成为富豪的22条秘诀
  4. YOLO-V3可视化
  5. bazel proxy 设置
  6. word中硬回车与软回车的区别与替换·转换(shift+enter)
  7. Java编写HTTP请求发送XML报文数据
  8. mysql事务_MySQL事务提交过程(一)
  9. 生成26个大小写字母加0-9数字的密码字典文件(python3.X)
  10. OpenCasCade——将鼠标点的位置转换为基于OCC三维坐标系中在某一面上的坐标