设计模式(观察者模式)

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> 设计模式(观察者模式)

点击上方”python宝典”,关注获取python全套视频,

技术文章第一时间送达!

观察者模式

1、内容

  • 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于他的对象都得到通知并被自动更新。
  • 观察者模式又称‘发布-订阅’模式
  • 2、角色

  •  抽象主题(Subject)
  •  具体主题(ConcreteSubject)——发布者
  •  抽象观察者(Observer)
  •  具体观察者(ConcreteObserver)——订阅者
  • 3、使用场景

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

    • 目标和观察者之间的抽象耦合最小
    • 支持广播通信
    • **5、缺点**
    • 多个观察者之间互不知道对方存在,因此一个观察者对主题的修改可能造成错误的更新。
    • 6、代码示例

      
      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)
      
      设计模式(观察者模式)

      识别图中二维码,欢迎关注python宝典

    本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

    本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

    原文链接:blog.ouyangsihai.cn >> 设计模式(观察者模式)


     上一篇
    设计模式(单例模式) 设计模式(单例模式)
    点击上方”python宝典”,关注获取python全套视频, 技术文章第一时间送达! 单例模式1、内容 保证一个类只有一个实例,并提供一个访问它的全局访问点 2、角色 单例 3、使用场景 当类只有一个实例而且客户可
    2021-04-05
    下一篇 
    设计模式(责任链模式) 设计模式(责任链模式)
    点击上方”python宝典”,关注获取python全套视频, 技术文章第一时间送达! 责任链模式1、内容 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求 直到有一个对象处
    2021-04-05