设计模式-观察者模式-observer-python
来源:互联网 发布:tplink路由器访客网络 编辑:程序博客网 时间:2024/05/24 04:14
def
定义对象间一种一对多的依赖关系, 使得每当一个对象改变状态, 则所有依赖于它的对象都会得到通知并被自动更新。
usage
● 观察者和被观察者之间是抽象耦合
如此设计, 则不管是增加观察者还是被观察者都非常容易扩展, 而且在Java中都已经实现的抽象层级的定义, 在系统扩展方面更是得心应手。
● 建立一套触发机制
根据单一职责原则, 每个类的职责是单一的, 那么怎么把各个单一的职责串联成真实世界的复杂的逻辑关系呢? 比如, 我们去打猎, 打死了一只母鹿, 母鹿有三个幼崽, 因失去了母鹿而饿死, 尸体又被两只秃鹰争抢, 因分配不均, 秃鹰开始斗殴, 然后羸弱的秃鹰死掉,生存下来的秃鹰, 则因此扩大了地盘……这就是一个触发机制, 形成了一个触发链。 观察者模式可以完美地实现这里的链条形式。
code
class Subject(object): def __init__(self): self._observers = [] def attach(self, observer): if observer not 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 usageclass 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(u'HexViewer: Subject %s has data 0x%x' % (subject.name, subject.data))class DecimalViewer: def update(self, subject): print(u'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(u"Setting Data 1 = 10") data1.data = 10 print(u"Setting Data 2 = 15") data2.data = 15 print(u"Setting Data 1 = 3") data1.data = 3 print(u"Setting Data 2 = 5") data2.data = 5 print(u"Detach HexViewer from data1 and data2.") data1.detach(view2) data2.detach(view2) print(u"Setting Data 1 = 10") data1.data = 10 print(u"Setting Data 2 = 15") data2.data = 15if __name__ == '__main__': main()### OUTPUT #### Setting Data 1 = 10# DecimalViewer: Subject Data 1 has data 10# HexViewer: Subject Data 1 has data 0xa# Setting Data 2 = 15# HexViewer: Subject Data 2 has data 0xf# DecimalViewer: Subject Data 2 has data 15# Setting Data 1 = 3# DecimalViewer: Subject Data 1 has data 3# HexViewer: Subject Data 1 has data 0x3# Setting Data 2 = 5# HexViewer: Subject Data 2 has data 0x5# DecimalViewer: Subject Data 2 has data 5# Detach HexViewer from data1 and data2.# Setting Data 1 = 10# DecimalViewer: Subject Data 1 has data 10# Setting Data 2 = 15# DecimalViewer: Subject Data 2 has data 15
阅读全文
0 0
- 设计模式-观察者模式-observer-python
- 观察者设计模式Observer
- 观察者设计模式(observer)
- observer(观察者设计模式)
- Observer(观察者)设计模式
- [设计模式]观察者模式, Observer
- 设计模式--观察者模式(Observer)
- 设计模式-观察者模式(observer)
- [设计模式]Observer观察者模式
- [设计模式]观察者模式(Observer)
- 设计模式-Observer(观察者模式)
- 设计模式--observer观察者模式
- 设计模式 -- Observer 观察者模式
- 设计模式--观察者模式Observer
- 设计模式:观察者(observer)模式
- 设计模式-观察者模式Observer
- 设计模式:观察者模式-observer
- 设计模式 - Observer观察者模式
- GreenDao3.0的使用
- (吴恩达笔记 1-1)附——为什么用最小平方和做目标函数
- windows下通过cmd切换python2和python3版本
- CSS-overflow:auto溢出加滚动条
- 设计模式:接口隔离原则
- 设计模式-观察者模式-observer-python
- STM32的GPIO
- 武术擂台赛机械小车拼装
- 【学习笔记】JS
- js实现图片旋转效果
- volume 生命周期管理
- HDU
- 移动端app创建
- ORACLE EBS:Can't connect to X11 window server using '**' as the value of the DISPLAY variable.