资讯专栏INFORMATION COLUMN

设计模式(python实现):观察者模式

idealcn / 2805人阅读

摘要:所以,以后,只有甲乙会收到消息。原理当我们遇到一个多对一的依赖关系时,就可以用观察者模式。观察者模式有一个被观察者和多个观察者。被观察者提供注册删除通知的功能,观察者提供数据更新和展示等功能。

1.白话栗子

市里新修了一个图书馆,现在招募一个图书管理员叫T,T知道图书馆里的图书更新和借阅等信息。现在有三个同学甲乙丙想去了解以后几个月的图书馆图书信息和借阅信息,于是它们去T那里注册登记。当图书馆图书更新后,T就给注册了的同学发送图书更新信息。三个月后,丙不需要知道图书更新信息了,于是就去T那儿注销了它的信息。所以,以后,只有甲乙会收到消息。几个月后,丁也去图书馆注册了信息,所以以后甲乙丁会收到图书更新信息。

2.原理

当我们遇到一个多对一的依赖关系时,就可以用观察者模式。观察者模式有一个被观察者(subject)和多个观察者(observer)。被观察者提供注册删除通知的功能,观察者提供数据更新展示等功能。
上面栗子中,T就是一个被观察者,T提供了注册身份信息的功能、删除信息的功能和给甲乙丙丁发送通知的功能,而甲乙丙丁就是观察者,更新它们从T那个获取的信息。

3.好处

独立封装,互不影响:观察者和被观察者都是独自封装好的,观察者之间并不会相互影响
热插拔:在软件运行中,可以动态添加和删除观察者

4.Show in Code
class Subject(object):
    def __init__(self):
        self._observers = [] #观察者列表

    #注册功能
    def attach(self, observer):
        if observer not in self._observers:
            self._observers.append(observer)

    #删除功能
    def delete(self, observer):
        try:
            self._observers.remove(observer)
        except ValueError:
            pass

    #通知功能
    def notify(self, modifier=None):
        for observer in self._observers:
            if modifier != observer:
                observer.update(self)

#被观察者数据来源
class Data(Subject):
    def __init__(self, name=""):
        Subject.__init__(self)
        self.name = name
        self._data = 0
    @property
    def data(self):
        return self._data

    @data.setter
    def data(self, value):
        self._data = value
        self.notify()

#观察者
class Viewer:
    def __init__(self, name=""):
        self._name = name
    def update(self, subject):
        print("my name is ", self._name, "and", subject.name, "***", subject.data)

if __name__ == "__main__":
    data1 = Data("管理员T")
    view1 = Viewer("甲")
    data1.attach(view1)
    view2 = Viewer("乙")
    data1.attach(view2)
    view3 = Viewer("丙")
    data1.attach(view3)

    print("data1初始值")
    print(data1.data)
    print("改变data1的值")
    data1.data = 5
    print("再次改变data1的值")
    data1.data = 10

    print("删除view3后")
    data1.delete(view3)
    data1.data = 90
    
    

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44799.html

相关文章

  • python设计模式-察者模式

    摘要:在程序设计中,观察者模式通常被定义为观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态是,它的所有依赖者都会收到通知并自动更新。事件扮演发布者的角色,监听者则扮演观察者的角色。 题目:现在你有一个数字,默认格式化程序是以十进制格式展示此数值,但需要提供一个功能,这个程序要支持添加/注册更多的格式化程序(比如:添加一个十六进制格式化程序和一个二进制格式化程序)。每次数值...

    terasum 评论0 收藏0
  • Python设计模式之监听者模式

    摘要:监听模式又名观察者模式发布订阅模式源监听器模式,模式的核心是设计时要区分谁是被观察者,谁是观察者。 监听模式 又名观察者模式、发布/订阅模式、源-监听器(Source/Listener)模式,模式的核心是:设计时要区分谁是被观察者,谁是观察者。被观察者至少有三个方法,添加观察者、删除观察者、监听目标变化并通知观察者;观察者这至少包含一个方法,当接收到被观察者的通知时,做出相应的处理(即...

    hlcfan 评论0 收藏0
  • python设计模式

    摘要:在本节实验中,我们学习了四种设计模式策略模式,观察者模式,命令模式以及模板方法模式。这四种设计模式都是行为型模式。这就是适配器模式。下面让我们看看适配器模式在实验楼中使用吧。准确来说,装饰者模式能动态的给对象添加行为。 1、策略模式 策略模式将各种操作(算法)进行封装,并使它们之间可以互换。互换的意思是说可以动态改变对象的操作方式(算法)。 -- coding: utf-8 -- im...

    array_huang 评论0 收藏0
  • 每天一个设计模式之订阅-发布模式

    摘要:借助继承为对象安装发布订阅功能根据自己需求定义一个函数供事件处理完后调用创建个回调函数订阅和这个事件,并且绑定相关的完成后的函数当两个事件完成时候,触发前几行绑定的相关函数打印实现中一般用事件模型来代替传统的发布订阅模式。 博主按:《每天一个设计模式》旨在初步领会设计模式的精髓,目前采用javascript(_靠这吃饭_)和python(_纯粹喜欢_)两种语言实现。诚然,每种设计模式都...

    printempw 评论0 收藏0
  • 每天一个设计模式之订阅-发布模式

    摘要:借助继承为对象安装发布订阅功能根据自己需求定义一个函数供事件处理完后调用创建个回调函数订阅和这个事件,并且绑定相关的完成后的函数当两个事件完成时候,触发前几行绑定的相关函数打印实现中一般用事件模型来代替传统的发布订阅模式。 博主按:《每天一个设计模式》旨在初步领会设计模式的精髓,目前采用javascript(_靠这吃饭_)和python(_纯粹喜欢_)两种语言实现。诚然,每种设计模式都...

    svtter 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<