Observer(观察者)
意图:
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。
适用性:
当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。
当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。
- #!/usr/bin/python
- #coding:utf8
- '''
- Observer
- '''
- class Subject(object):
- def __init__(self):
- self._observers = []
- def attach(self, observer):
- if not observer in self._observers:
- self._observers.append(observer)
- def detach(self, observer):
- try:
- self._observers.remove(observer)
- except ValueError:
- pass
- def notify(self, modifier=None):
- for observer in self._observers:
- if modifier != observer:
- observer.update(self)
- # Example usage
- class Data(Subject):
- def __init__(self, name=''):
- Subject.__init__(self)
- self.name = name
- self._data = 0
- @property
- def data(self):
- return self._data
- @data.setter
- def data(self, value):
- self._data = value
- self.notify()
- class HexViewer:
- def update(self, subject):
- print('HexViewer: Subject %s has data 0x%x' %
- (subject.name, subject.data))
- class DecimalViewer:
- def update(self, subject):
- print('DecimalViewer: Subject %s has data %d' %
- (subject.name, subject.data))
- # Example usage...
- def main():
- data1 = Data('Data 1')
- data2 = Data('Data 2')
- view1 = DecimalViewer()
- view2 = HexViewer()
- data1.attach(view1)
- data1.attach(view2)
- data2.attach(view2)
- data2.attach(view1)
- print("Setting Data 1 = 10")
- data1.data = 10
- print("Setting Data 2 = 15")
- data2.data = 15
- print("Setting Data 1 = 3")
- data1.data = 3
- print("Setting Data 2 = 5")
- data2.data = 5
- print("Detach HexViewer from data1 and data2.")
- data1.detach(view2)
- data2.detach(view2)
- print("Setting Data 1 = 10")
- data1.data = 10
- print("Setting Data 2 = 15")
- data2.data = 15
- if __name__ == '__main__':
- main()
Observer(观察者)的更多相关文章
- java: 观察者模式:Observable被观察者,Observer观察者
java: 观察者模式:Observable被观察者,Observer观察者 以房子价格为例,卖房者为被观察者: import java.util.Observable; //被观察者子类化 publ ...
- Java Observer 观察者
http://www.cnblogs.com/jaward/p/3277619.html 1.API 被观察者 java.util.Observable; public class Observabl ...
- Java设计模式——Observer(观察者)模式
在多个对象之间建立一对多的关系,以便当一个对象状态改变的时候.其它全部依赖于这个对象的对象都能得到通知,并被自己主动更新. 适用情况: 当一个抽象模型有两个方面,当中一个方面依赖于还有一方面. 将这二 ...
- 十七、 Observer 观察者设计模式
设计: 代码清单: Observer public interface Observer { void update(NumberGenerator generator); } DigitObserv ...
- Observer观察者设计模式
Observer设计模式主要包括以下两种对象: (1)被观察对象:Subject,它往往包含其他对象感兴趣的东西,上面例子中热水器中就是Subject(被监视对象); (2)观察对象:Observer ...
- Observer 观察者
意图 定义对象间的一种一对多的依赖关系 ,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新. 动机 一致性,松耦合 需要维护相关对象间的一致性.我们不希望为了维持一致性而使各类紧 ...
- Observer(观察者)设计模式[转]
Observer设计模式中主要包括如下两类对象: Subject:监视对象,它往往包含着其他对象所感兴趣的内容.在本范例中,热水器就是一个监视对象,它包含的其他对象所感兴趣的内容,就是tempratu ...
- C#委托与事件之观察者Observer设计模式
前言 委托: 委托是一种在对象里保存方法引用的类型,同时也是一种类型安全的函数指针. 或委托可以看成一种表示函数的数据类型,类似函数指针. 事件是特殊的委托 观察者模式:两种角色:(1)Subj ...
- 设计模式--观察者(Observer)
GOF给出的定义: Define a one-to-many dependency between objects so that when one object changes state, all ...
- 设计模式之Observer(观察者)(转)
Java深入到一定程度,就不可避免的碰到设计模式(design pattern)这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广泛,遵循 ...
随机推荐
- pycharm 和 Anaconda 下的 opencv 安装
学习真的切忌三天打鱼两天晒网!! 一开始python下的opencv已经都弄好了,中间电脑坏了一次,好久没有接触这个,就全部都忘完了.深感惋惜. 今天又从新安装了一下opencv.在anaconda下 ...
- List<Map<String, Object>> 与 json 互转
近期做指纹识别,需要用到缓存文件,数据量并不大,用redis不合适,所以用到了txt文件. 思路是 1.定时查询指纹,存到txt缓存文件中. 2.新增或删除指纹时,查询指纹,存到txt缓存文 ...
- 关于string的length
在C++里面,std::string的length()返回的是字节数,与编码方式有关. int main() { std::string s = "我是中国人"; std::cou ...
- mysql_commit() COMMIT ROLLBACK 提交 回滚 连接释放
MySQL :: MySQL 8.0 Reference Manual :: 28.7.7.6 mysql_commit() https://dev.mysql.com/doc/refman/8.0/ ...
- 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 ...
- Git 进阶之底层相关
Git is a content-addressable filesystem. 1. Plumbing 和 Porcelain "Plumbing commands": Git ...
- 存储5——逻辑卷管理LVM
1. LVM概念 LVM是 Logical Volume Manager(逻辑卷管理)的简写,它由Heinz Mauelshagen在Linux 2.4内核上实现.LVM将一个或多个硬盘的分区在逻辑上 ...
- mongodb 的使用
install: 1.ubuntu用deb安装. 2.下载压缩文件,绿色的,不用安装. 推荐此方法. 配置dbpath: 1.用deb安装的,会在 /etc 目录下 创建mongodb.conf ...
- Zabbix设置自定义监控
[zabbix]自定义监控项key值 说明: zabbix自带的默认模版里包括了很多监控项,有时候为了满足业务需求,需要根据自己的监控项目自定义监控项,这里介绍一种自定义监控项的方式. 1,首先编 ...
- Sql Server CPU 性能排查及优化的相关 Sql
Sql Server CPU 性能排查及优化的相关 Sql 语句,非常好的SQL语句,记录于此: --Begin Cpu 分析优化的相关 Sql --使用DMV来分析SQL Server启动以来累计使 ...