博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Observer(观察者)
阅读量:4338 次
发布时间:2019-06-07

本文共 2025 字,大约阅读时间需要 6 分钟。

意图:

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

适用性:

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

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

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

#!/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 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('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()

 

转载于:https://www.cnblogs.com/navysummer/p/9835256.html

你可能感兴趣的文章
Android - 广播机制和Service
查看>>
MFC接收ShellExecute多个参数
查看>>
volatile和synchronized的区别
查看>>
RocketMQ介绍与云服务器安装
查看>>
Jenkins插件HTML Publisher Plugin的使用
查看>>
A. The number of positions
查看>>
Windows中cmd的DOS命令查看占用某端口的程序及PID号
查看>>
设计多列布局
查看>>
返回一个整数数组中最大子数组的和
查看>>
解决FLASH遮住层的问题 IE,Firefox都适用!
查看>>
第七章:线程以及线程间的通信
查看>>
算法 PK 猫咪 | 章鱼保罗后继竟然是只猫?
查看>>
读书报告汇总
查看>>
rsync+inotify
查看>>
linux 创建连接命令 ln -s 软链接
查看>>
数据源与连接池
查看>>
开源工作流系统
查看>>
Provider 模式
查看>>
系统分析与建模6
查看>>
window.onload起冲突解决办法
查看>>