zoukankan      html  css  js  c++  java
  • Python—程序设计:观察者模式

    观察者模式 

    内容:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。观察者模式又称“发布-订阅”模式。

    角色:
      抽象主题(Subject)
      具体主题(ConcreteSubject)——发布者
      抽象观察者(Observer)
      具体观察者(ConcreteObserver)——订阅者

    适用场景:
      当一个抽象模型有两方面,其中一个方面依赖于另一个方面。将这两者封装在独立对象中以使它们可以各自独立地改变和复用。
      当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变。
      当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之,你不希望这些对象是紧密耦合的。
    优点:
      目标和观察者之间的抽象耦合最小
      支持广播通信

    from abc import ABCMeta, abstractmethod
    
    
    class Publisher:
        """抽象发布者"""
    
        def __init__(self):
            self.subscribers = []
    
        def attach(self, sub):
            self.subscribers.append(sub)
    
        def detach(self, sub):
            self.subscribers.remove(sub)
    
        def notify(self):
            for sub in self.subscribers:
                sub.update(self)
    
    
    class Subscriber(metaclass=ABCMeta):
        """抽象订阅者"""
    
        @abstractmethod
        def update(self, notice):
            pass
    
    
    class StaffNotify(Publisher):
        """具体发布者"""
    
        def __init__(self, info=None):
            super().__init__()
            self.__info = info
    
        @property
        def company_info(self):
            return self.__info
    
        @company_info.setter
        def company_info(self, info):
            self.__info = info
            self.notify()  # 推送
    
    
    class Staff(Subscriber):
        """具体订阅者"""
    
        def __init__(self):
            self.info = None
    
        def update(self, notice):
            self.info = notice.company_info
    
    
    # 高层代码
    publish = StaffNotify('公司信息')
    s1 = Staff()
    s2 = Staff()
    # 添加绑定
    publish.attach(s1)
    publish.attach(s2)
    # 推送信息
    publish.company_info = "明天放假"
    print(s1.info)
    print(s2.info)
    # 解除绑定
    publish.detach(s2)
    publish.company_info = "国庆放假十天"
    print(s1.info)
    print(s2.info)
  • 相关阅读:
    魔兽70TBC猎人常用宏
    魔兽70TBC猎人宝宝技能汇总
    redis常用概念
    mongodb分片集群开启安全认证
    mongodb集群搭建(分片+副本)
    mongodb 用户权限控制
    greenplum数据迁移
    greenplum资源队列
    GreenPlum 集群常用命令
    COCOS 实现Player玩家控制的左右控制,实现马里奥一样的移动
  • 原文地址:https://www.cnblogs.com/zivli/p/11434816.html
Copyright © 2011-2022 走看看