zoukankan      html  css  js  c++  java
  • 【编程思想】【设计模式】【行为模式Behavioral】观察者模式Observer

    Python转载版

    https://github.com/faif/python-patterns/blob/master/behavioral/observer.py

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    """
    http://code.activestate.com/recipes/131499-observer-pattern/
    
    *TL;DR80
    Maintains a list of dependents and notifies them of any state changes.
    """
    
    from __future__ import print_function
    
    
    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 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(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 = 15
    
    
    if __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
    Python转载版
  • 相关阅读:
    JS中document对象和window对象有什么区别
    jQuery parent.append和$after的区别
    使用CFURLCreateStringByAddingPercentEscapes进行URL编码
    JQuery中==与===、$("#")与$("")的区别
    理解JavaScript中的arguments,callee,caller,apply
    使用自己的ClassLoader实现热替换
    TextBox 英文文档
    easyui的textbox和validatebox的 赋值区别
    jquery的$.extend、$.fn.extend、 jQuery.extend( target, object1, [objectN])作用及区别
    jQuery 遍历
  • 原文地址:https://www.cnblogs.com/demonzk/p/9035645.html
Copyright © 2011-2022 走看看