观察者模式

Posted 小仙女~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了观察者模式相关的知识,希望对你有一定的参考价值。

观察者模式

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

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

  • 适用场景:

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

  • 缺点:

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

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)


# 公司运行良好
# 公司运行良好
# 公司将要上市
# 公司将要上市
# 公司要破产了,赶快跑路
# 公司将要上市

以上是关于观察者模式的主要内容,如果未能解决你的问题,请参考以下文章

未调用 LiveData 观察者

Java设计模式补充:回调模式事件监听器模式观察者模式(转)

如何为片段设置观察者

永远观察实时数据的片段

设计模式观察者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

观察者模式