观察者模式

观察者模式

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

  • 角色:抽象主题,具体主题(发布者),抽象观察者,具体观察者(订阅者)

  • 适用场景:

    • 当一个抽象模型有两个方面,其中一个方面依赖于另一个方面,将两者封装在独立的对象中,以使它们各自独立的改变和复用。
    • 当一个对象的改变需要同时改变其他对象,而且不知道有多少对象以待改变
    • 当一个对象必须通知其他对象,而且又不知道其他对象是谁,即这些对象之间时解耦的
  • 优点:目标和观察者之间的耦合最小,支持广播通信

  • 缺点:

    • 多个观察者之间不知道对方的存在,因此一个观察者对主题的修改肯能造成错误的更新
    • 当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率。
  • 逻辑:订阅者通过抽象观察者来操作修改发布者,当对象的属性进行修改的时候,便会通过发布者列表经行通知所有订阅者并进行修改

class Oberserver(object):
    '''抽象主题'''
    def update(self):
        raise NotImplemented('请使用同名的update方法')

class Notice(object):
    '''具体出题(发布者)'''
    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 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()  #修改完后调用发布者里面的notify方法通知其他订阅者并修改

class Manager(Oberserver):
    '''具体观察者(订阅者)'''
    def __init__(self):
        self.company_info=None
    def update(self,noti):
        self.company_info=noti.company_info
#实例化抽象观察者
notice=ManagerNotice()
# 实例化具体观察者,创建两个订阅者
alex=Manager()
tony=Manager()

# 将订阅者添加到订阅者列表
notice.attach(alex)
notice.attach(tony)

# 发布信息公司运行良好
notice.company_info='公司运行良好'
print(alex.company_info)
print(tony.company_info)

notice.company_info='公司将要上市'
print(alex.company_info)
print(tony.company_info)

notice.detach(tony)
notice.company_info='公司要破产了,赶快跑路'
print(alex.company_info)
print(tony.company_info)


# 公司运行良好
# 公司运行良好
# 公司将要上市
# 公司将要上市
# 公司要破产了,赶快跑路
# 公司将要上市
posted @ 2021-06-03 12:43  刘家小仙女  阅读(46)  评论(0编辑  收藏  举报