• 观察者模式


    一、内容

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

    观察者模式又称‘发布-订阅’模式

    二、角色

    •  抽象主题(Subject
    •  具体主题(ConcreteSubject——发布者
    •  抽象观察者(Observer
    •  具体观察者(ConcreteObserver——订阅者

    三、优点

    • 目标和观察者之间的抽象耦合最小
    • 支持广播通信

    四、缺点

    • 多个观察者之间互不知道对方存在,因此一个观察者对主题的修改可能造成错误的更新。

    五、适用场景

    • 当一个抽象模型有两方面,其中一方面依赖于另一方面。将这两者封装在独立对象中以使它们可以独立地改变和复用。
    • 当对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变。
    • 当一个对象必须通知其他对象,而它又不能假定其他对象是谁。换言之,你不希望这些对象是紧密耦合的

    六、代码示例

    from abc import ABCMeta, abstractmethod
    
    
    class Observer(metaclass=ABCMeta):
        @abstractmethod
        def update(self, notice):
            pass
    
    
    class Notice:
        def __init__(self):
            self.observers = [] # 记录该主体的观察者(订阅者)
    
        def attach(self, obs):
            self.observers.append(obs)
    
        def detach(self, obs):
            obs.company_info = None
            self.observers.remove(obs)
    
        def notify(self):
            for obj in self.observers:
                obj.update(self)
    
    
    class ManagerNotice(Notice):
        def __init__(self, company_info=None):
            super().__init__()
            self.__company_info = company_info
    
        @property
        def company_info(self):
            return self.__company_info
    
        @company_info.setter
        def company_info(self, info):
            self.__company_info = info
            self.notify()
    
    
    
    class Manager(Observer):
        def __init__(self):
            self.company_info = None
    
        def update(self, noti):
            self.company_info = noti.company_info
    
    
    notice = ManagerNotice()
    
    alex = Manager()
    wusir = Manager()
    
    # print(alex.company_info)
    # print(wusir.company_info)
    
    notice.attach(alex)
    notice.attach(wusir)
    #
    notice.company_info="公司运行良好"
    #
    print(alex.company_info)
    print(wusir.company_info)
    #
    notice.detach(wusir)
    #
    notice.company_info="公司要破产了"
    
    print(alex.company_info)
    print(wusir.company_info)
  • 相关阅读:
    机器学习中规则化和模型选择知识
    关于arcengine权限的设置
    arcengine 实现调用arctoolbox中的dissolove
    基于手机令牌的屏保软件设计与实现
    RelativeLayout中最底的View一个View.layout_marginBottom无效
    Citrus Engine简单Demo
    Java菜鸟学习笔记(23)--继承篇(二):继承与组合
    uva 579 ClockHands 几何初接触 求时针与分针的夹角
    OpenCV中GPU函数
    html监听,键盘事件
  • 原文地址:https://www.cnblogs.com/morgana/p/8496309.html
Copyright © 2020-2023  润新知