设计模式-行为型-观察者模式(发布订阅模式)

责任链模式

概述

  • 定义对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖他的对象都得到通知并自动更新。又称发布订阅模式

对象

  • 抽象主题(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):
        self.observers.remove(obs)
    
    def notify(self):
        for obs in self.observers:
            obs.update(self)
    

# 发布者
class StaffNotice(Notice):
    def __init__(self, info):
        super().__init__()
        self.__info = info 
    
    @property
    def info(self):
        return self.__info
    
    @info.setter
    def info(self, info):
        self.__info = info
        self.notify()

#订阅者
class Staff(Observer):
    def __init__(self):
        self.info = None
        self.notice = None

    def subscribe(self, notice):
        self.notice = notice
        notice.attach(self)
    
    def unsubscribe(self):
        if not self.notice:
            return
        self.notice.detach(self)
        self.notice = None

    def update(self, notice):
        self.info = notice.info
    
    def __str__(self):
        return self.info

# client
staff_notice = StaffNotice("初始化信息")
staff1 = Staff()
staff2 = Staff()
staff1.subscribe(staff_notice)
staff2.subscribe(staff_notice)
staff_notice.info = "更新消息: 公司放假了!!!!"

print(str(staff1))
print(str(staff2))

staff1.unsubscribe()
staff_notice.info = "更新消息: 公司又不放假了!!!!"
print(str(staff1))
print(str(staff2))

优点

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

猜你喜欢

转载自blog.csdn.net/DALAOS/article/details/114127854