意图:

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。

适用性:

当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。

当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。

当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。

  1. #!/usr/bin/python
  2. #coding:utf8
  3. '''
  4. Observer
  5. '''
  6.  
  7. class Subject(object):
  8. def __init__(self):
  9. self._observers = []
  10.  
  11. def attach(self, observer):
  12. if not observer in self._observers:
  13. self._observers.append(observer)
  14.  
  15. def detach(self, observer):
  16. try:
  17. self._observers.remove(observer)
  18. except ValueError:
  19. pass
  20.  
  21. def notify(self, modifier=None):
  22. for observer in self._observers:
  23. if modifier != observer:
  24. observer.update(self)
  25.  
  26. # Example usage
  27. class Data(Subject):
  28. def __init__(self, name=''):
  29. Subject.__init__(self)
  30. self.name = name
  31. self._data = 0
  32.  
  33. @property
  34. def data(self):
  35. return self._data
  36.  
  37. @data.setter
  38. def data(self, value):
  39. self._data = value
  40. self.notify()
  41.  
  42. class HexViewer:
  43. def update(self, subject):
  44. print('HexViewer: Subject %s has data 0x%x' %
  45. (subject.name, subject.data))
  46.  
  47. class DecimalViewer:
  48. def update(self, subject):
  49. print('DecimalViewer: Subject %s has data %d' %
  50. (subject.name, subject.data))
  51.  
  52. # Example usage...
  53. def main():
  54. data1 = Data('Data 1')
  55. data2 = Data('Data 2')
  56. view1 = DecimalViewer()
  57. view2 = HexViewer()
  58. data1.attach(view1)
  59. data1.attach(view2)
  60. data2.attach(view2)
  61. data2.attach(view1)
  62.  
  63. print("Setting Data 1 = 10")
  64. data1.data = 10
  65. print("Setting Data 2 = 15")
  66. data2.data = 15
  67. print("Setting Data 1 = 3")
  68. data1.data = 3
  69. print("Setting Data 2 = 5")
  70. data2.data = 5
  71. print("Detach HexViewer from data1 and data2.")
  72. data1.detach(view2)
  73. data2.detach(view2)
  74. print("Setting Data 1 = 10")
  75. data1.data = 10
  76. print("Setting Data 2 = 15")
  77. data2.data = 15
  78.  
  79. if __name__ == '__main__':
  80. main()

Observer(观察者)的更多相关文章

  1. java: 观察者模式:Observable被观察者,Observer观察者

    java: 观察者模式:Observable被观察者,Observer观察者 以房子价格为例,卖房者为被观察者: import java.util.Observable; //被观察者子类化 publ ...

  2. Java Observer 观察者

    http://www.cnblogs.com/jaward/p/3277619.html 1.API 被观察者 java.util.Observable; public class Observabl ...

  3. Java设计模式——Observer(观察者)模式

    在多个对象之间建立一对多的关系,以便当一个对象状态改变的时候.其它全部依赖于这个对象的对象都能得到通知,并被自己主动更新. 适用情况: 当一个抽象模型有两个方面,当中一个方面依赖于还有一方面. 将这二 ...

  4. 十七、 Observer 观察者设计模式

    设计: 代码清单: Observer public interface Observer { void update(NumberGenerator generator); } DigitObserv ...

  5. Observer观察者设计模式

    Observer设计模式主要包括以下两种对象: (1)被观察对象:Subject,它往往包含其他对象感兴趣的东西,上面例子中热水器中就是Subject(被监视对象); (2)观察对象:Observer ...

  6. Observer 观察者

    意图 定义对象间的一种一对多的依赖关系 ,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新. 动机 一致性,松耦合 需要维护相关对象间的一致性.我们不希望为了维持一致性而使各类紧 ...

  7. Observer(观察者)设计模式[转]

    Observer设计模式中主要包括如下两类对象: Subject:监视对象,它往往包含着其他对象所感兴趣的内容.在本范例中,热水器就是一个监视对象,它包含的其他对象所感兴趣的内容,就是tempratu ...

  8. C#委托与事件之观察者Observer设计模式

    前言    委托: 委托是一种在对象里保存方法引用的类型,同时也是一种类型安全的函数指针. 或委托可以看成一种表示函数的数据类型,类似函数指针. 事件是特殊的委托 观察者模式:两种角色:(1)Subj ...

  9. 设计模式--观察者(Observer)

    GOF给出的定义: Define a one-to-many dependency between objects so that when one object changes state, all ...

  10. 设计模式之Observer(观察者)(转)

    Java深入到一定程度,就不可避免的碰到设计模式(design pattern)这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广泛,遵循 ...

随机推荐

  1. pycharm 和 Anaconda 下的 opencv 安装

    学习真的切忌三天打鱼两天晒网!! 一开始python下的opencv已经都弄好了,中间电脑坏了一次,好久没有接触这个,就全部都忘完了.深感惋惜. 今天又从新安装了一下opencv.在anaconda下 ...

  2. List<Map<String, Object>> 与 json 互转

    近期做指纹识别,需要用到缓存文件,数据量并不大,用redis不合适,所以用到了txt文件. 思路是 1.定时查询指纹,存到txt缓存文件中.      2.新增或删除指纹时,查询指纹,存到txt缓存文 ...

  3. 关于string的length

    在C++里面,std::string的length()返回的是字节数,与编码方式有关. int main() { std::string s = "我是中国人"; std::cou ...

  4. mysql_commit() COMMIT ROLLBACK 提交 回滚 连接释放

    MySQL :: MySQL 8.0 Reference Manual :: 28.7.7.6 mysql_commit() https://dev.mysql.com/doc/refman/8.0/ ...

  5. elk----es settings--logstash--performance---bigdesk---logstash plugin online/offline

    www.cnblogs.com/tangr206/articles/2274845.html yum timeout error(/etc/resolv.conf) elk: elasticsearc ...

  6. Git 进阶之底层相关

    Git is a content-addressable filesystem. 1. Plumbing 和 Porcelain "Plumbing commands": Git ...

  7. 存储5——逻辑卷管理LVM

    1. LVM概念 LVM是 Logical Volume Manager(逻辑卷管理)的简写,它由Heinz Mauelshagen在Linux 2.4内核上实现.LVM将一个或多个硬盘的分区在逻辑上 ...

  8. mongodb 的使用

    install: 1.ubuntu用deb安装. 2.下载压缩文件,绿色的,不用安装.   推荐此方法. 配置dbpath: 1.用deb安装的,会在 /etc 目录下 创建mongodb.conf ...

  9. Zabbix设置自定义监控

    [zabbix]自定义监控项key值   说明: zabbix自带的默认模版里包括了很多监控项,有时候为了满足业务需求,需要根据自己的监控项目自定义监控项,这里介绍一种自定义监控项的方式. 1,首先编 ...

  10. Sql Server CPU 性能排查及优化的相关 Sql

    Sql Server CPU 性能排查及优化的相关 Sql 语句,非常好的SQL语句,记录于此: --Begin Cpu 分析优化的相关 Sql --使用DMV来分析SQL Server启动以来累计使 ...