成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

設(shè)計(jì)模式(python實(shí)現(xiàn)):觀察者模式

idealcn / 2828人閱讀

摘要:所以,以后,只有甲乙會(huì)收到消息。原理當(dāng)我們遇到一個(gè)多對(duì)一的依賴關(guān)系時(shí),就可以用觀察者模式。觀察者模式有一個(gè)被觀察者和多個(gè)觀察者。被觀察者提供注冊(cè)刪除通知的功能,觀察者提供數(shù)據(jù)更新和展示等功能。

1.白話栗子

市里新修了一個(gè)圖書(shū)館,現(xiàn)在招募一個(gè)圖書(shū)管理員叫T,T知道圖書(shū)館里的圖書(shū)更新和借閱等信息。現(xiàn)在有三個(gè)同學(xué)甲乙丙想去了解以后幾個(gè)月的圖書(shū)館圖書(shū)信息和借閱信息,于是它們?nèi)那里注冊(cè)登記。當(dāng)圖書(shū)館圖書(shū)更新后,T就給注冊(cè)了的同學(xué)發(fā)送圖書(shū)更新信息。三個(gè)月后,丙不需要知道圖書(shū)更新信息了,于是就去T那兒注銷了它的信息。所以,以后,只有甲乙會(huì)收到消息。幾個(gè)月后,丁也去圖書(shū)館注冊(cè)了信息,所以以后甲乙丁會(huì)收到圖書(shū)更新信息。

2.原理

當(dāng)我們遇到一個(gè)多對(duì)一的依賴關(guān)系時(shí),就可以用觀察者模式。觀察者模式有一個(gè)被觀察者(subject)和多個(gè)觀察者(observer)。被觀察者提供注冊(cè)、刪除、通知的功能,觀察者提供數(shù)據(jù)更新展示等功能。
上面栗子中,T就是一個(gè)被觀察者,T提供了注冊(cè)身份信息的功能、刪除信息的功能和給甲乙丙丁發(fā)送通知的功能,而甲乙丙丁就是觀察者,更新它們從T那個(gè)獲取的信息。

3.好處

獨(dú)立封裝,互不影響:觀察者和被觀察者都是獨(dú)自封裝好的,觀察者之間并不會(huì)相互影響
熱插拔:在軟件運(yùn)行中,可以動(dòng)態(tài)添加和刪除觀察者

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

    #注冊(cè)功能
    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)

#被觀察者數(shù)據(jù)來(lái)源
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
    
    

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/44799.html

相關(guān)文章

  • python設(shè)計(jì)模式-察者模式

    摘要:在程序設(shè)計(jì)中,觀察者模式通常被定義為觀察者模式定義了對(duì)象之間的一對(duì)多依賴,這樣一來(lái),當(dāng)一個(gè)對(duì)象改變狀態(tài)是,它的所有依賴者都會(huì)收到通知并自動(dòng)更新。事件扮演發(fā)布者的角色,監(jiān)聽(tīng)者則扮演觀察者的角色。 題目:現(xiàn)在你有一個(gè)數(shù)字,默認(rèn)格式化程序是以十進(jìn)制格式展示此數(shù)值,但需要提供一個(gè)功能,這個(gè)程序要支持添加/注冊(cè)更多的格式化程序(比如:添加一個(gè)十六進(jìn)制格式化程序和一個(gè)二進(jìn)制格式化程序)。每次數(shù)值...

    terasum 評(píng)論0 收藏0
  • Python設(shè)計(jì)模式之監(jiān)聽(tīng)者模式

    摘要:監(jiān)聽(tīng)模式又名觀察者模式發(fā)布訂閱模式源監(jiān)聽(tīng)器模式,模式的核心是設(shè)計(jì)時(shí)要區(qū)分誰(shuí)是被觀察者,誰(shuí)是觀察者。 監(jiān)聽(tīng)模式 又名觀察者模式、發(fā)布/訂閱模式、源-監(jiān)聽(tīng)器(Source/Listener)模式,模式的核心是:設(shè)計(jì)時(shí)要區(qū)分誰(shuí)是被觀察者,誰(shuí)是觀察者。被觀察者至少有三個(gè)方法,添加觀察者、刪除觀察者、監(jiān)聽(tīng)目標(biāo)變化并通知觀察者;觀察者這至少包含一個(gè)方法,當(dāng)接收到被觀察者的通知時(shí),做出相應(yīng)的處理(即...

    hlcfan 評(píng)論0 收藏0
  • python設(shè)計(jì)模式

    摘要:在本節(jié)實(shí)驗(yàn)中,我們學(xué)習(xí)了四種設(shè)計(jì)模式策略模式,觀察者模式,命令模式以及模板方法模式。這四種設(shè)計(jì)模式都是行為型模式。這就是適配器模式。下面讓我們看看適配器模式在實(shí)驗(yàn)樓中使用吧。準(zhǔn)確來(lái)說(shuō),裝飾者模式能動(dòng)態(tài)的給對(duì)象添加行為。 1、策略模式 策略模式將各種操作(算法)進(jìn)行封裝,并使它們之間可以互換?;Q的意思是說(shuō)可以動(dòng)態(tài)改變對(duì)象的操作方式(算法)。 -- coding: utf-8 -- im...

    array_huang 評(píng)論0 收藏0
  • 每天一個(gè)設(shè)計(jì)模式之訂閱-發(fā)布模式

    摘要:借助繼承為對(duì)象安裝發(fā)布訂閱功能根據(jù)自己需求定義一個(gè)函數(shù)供事件處理完后調(diào)用創(chuàng)建個(gè)回調(diào)函數(shù)訂閱和這個(gè)事件,并且綁定相關(guān)的完成后的函數(shù)當(dāng)兩個(gè)事件完成時(shí)候,觸發(fā)前幾行綁定的相關(guān)函數(shù)打印實(shí)現(xiàn)中一般用事件模型來(lái)代替?zhèn)鹘y(tǒng)的發(fā)布訂閱模式。 博主按:《每天一個(gè)設(shè)計(jì)模式》旨在初步領(lǐng)會(huì)設(shè)計(jì)模式的精髓,目前采用javascript(_靠這吃飯_)和python(_純粹喜歡_)兩種語(yǔ)言實(shí)現(xiàn)。誠(chéng)然,每種設(shè)計(jì)模式都...

    printempw 評(píng)論0 收藏0
  • 每天一個(gè)設(shè)計(jì)模式之訂閱-發(fā)布模式

    摘要:借助繼承為對(duì)象安裝發(fā)布訂閱功能根據(jù)自己需求定義一個(gè)函數(shù)供事件處理完后調(diào)用創(chuàng)建個(gè)回調(diào)函數(shù)訂閱和這個(gè)事件,并且綁定相關(guān)的完成后的函數(shù)當(dāng)兩個(gè)事件完成時(shí)候,觸發(fā)前幾行綁定的相關(guān)函數(shù)打印實(shí)現(xiàn)中一般用事件模型來(lái)代替?zhèn)鹘y(tǒng)的發(fā)布訂閱模式。 博主按:《每天一個(gè)設(shè)計(jì)模式》旨在初步領(lǐng)會(huì)設(shè)計(jì)模式的精髓,目前采用javascript(_靠這吃飯_)和python(_純粹喜歡_)兩種語(yǔ)言實(shí)現(xiàn)。誠(chéng)然,每種設(shè)計(jì)模式都...

    svtter 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<