python 觀察者模式

觀察者模式

當(dāng)我們希望一個(gè)對象的狀態(tài)發(fā)生變化债热,那么依賴與它的所有對象都能相應(yīng)變化(獲得通知),那么就可以用到Observer模式惕它, 其中的這些依賴對象就是觀察者的對象,那個(gè)要發(fā)生變化的對象就是所謂’觀察者’

# 這個(gè)是觀察者基類
class Observe(object):
    def __init__(self):
        self._observers = []

    # 添加依賴的對象
    def attach(self, observer):
        if not observer in self._observers:
            self._observers.append(observer)

    # 取消添加
    def detach(self, observer):
        try:
            self._observers.remove(observer)
        except ValueError:
            pass

    # 這里只是通知上面注冊的依賴對象新的變化
    def notify(self, modifier=None):
        for observer in self._observers:
            # 可以設(shè)置過濾條件,對不符合過濾條件的更新
            if modifier != observer:
                observer.update(self)


# 觀察者類
class Data(Observe):
    def __init__(self, name=''):
        super(Data, self).__init__()
        self.name = name
        self._data = 0

    # python2.6新增的寫法,獲取屬性為property讯屈,設(shè)置屬性為(假設(shè)屬性名字為x)@x.setter,刪除為@x.deleter
    @property
    def data(self):
        return self._data

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

# 這里有2個(gè)被觀察者绑蔫,也就是依賴的對象运沦,每次Data有改變,這2個(gè)view都會(huì)變動(dòng)
class HexViewer(object):
    def update(self, observe):
        print 'HexViewer: Observe%s has data 0x%x' % (observe.name, observe.data)

class DecimalViewer(object):
    def update(self, observe):
        print 'DecimalViewer: Observe%s has data %d' % (observe.name, observe.data)


if __name__ == '__main__':

    data1 = Data('Data 1')
    data2 = Data('Data 2')
    view1 = DecimalViewer()
    view2 = HexViewer()
    data1.attach(view1)
    data1.attach(view2)
    data2.attach(view2)
    data2.attach(view1)

    print "Setting Data 1 = 10"
    data1.data = 10
    print "Setting Data 2 = 15"
    data2.data = 15
    print "Setting Data 1 = 3"
    data1.data = 3
    print "Setting Data 2 = 5"
    data2.data = 5
    print "Update data1's view2 Because view1 is be filtered"
    data1.notify(modifier=view1)  
    print "Detach HexViewer from data1 and data2."
    data1.detach(view2)
    data2.detach(view2)
    print "Setting Data 1 = 10"
    data1.data = 10
    print "Setting Data 2 = 15"
    data2.data = 15
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末配深,一起剝皮案震驚了整個(gè)濱河市携添,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌篓叶,老刑警劉巖烈掠,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異澜共,居然都是意外死亡向叉,警方通過查閱死者的電腦和手機(jī)锥腻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進(jìn)店門嗦董,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瘦黑,你說我怎么就攤上這事京革。” “怎么了幸斥?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵匹摇,是天一觀的道長。 經(jīng)常有香客問我甲葬,道長廊勃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任经窖,我火速辦了婚禮坡垫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘画侣。我一直安慰自己冰悠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布配乱。 她就那樣靜靜地躺著溉卓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪搬泥。 梳的紋絲不亂的頭發(fā)上桑寨,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天,我揣著相機(jī)與錄音忿檩,去河邊找鬼尉尾。 笑死,一個(gè)胖子當(dāng)著我的面吹牛休溶,可吹牛的內(nèi)容都是我干的代赁。 我是一名探鬼主播扰她,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼芭碍!你這毒婦竟也來了徒役?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤窖壕,失蹤者是張志新(化名)和其女友劉穎忧勿,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瞻讽,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鸳吸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了速勇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晌砾。...
    茶點(diǎn)故事閱讀 38,673評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖烦磁,靈堂內(nèi)的尸體忽然破棺而出养匈,到底是詐尸還是另有隱情,我是刑警寧澤都伪,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布呕乎,位于F島的核電站,受9級特大地震影響陨晶,放射性物質(zhì)發(fā)生泄漏猬仁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一先誉、第九天 我趴在偏房一處隱蔽的房頂上張望湿刽。 院中可真熱鬧,春花似錦谆膳、人聲如沸叭爱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽买雾。三九已至,卻和暖如春杨帽,著一層夾襖步出監(jiān)牢的瞬間漓穿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工注盈, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留晃危,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像僚饭,于是被迫代替她去往敵國和親震叮。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 本系列文章是希望將軟件項(xiàng)目中最常見的設(shè)計(jì)模式用通俗易懂的語言來講解清楚鳍鸵,并通過Python來實(shí)現(xiàn)苇瓣,每個(gè)設(shè)計(jì)模式都是...
    geekpy閱讀 1,402評論 0 8
  • [python|高級篇|筆記|設(shè)計(jì)模式|觀察者模式] 這兩天讀了[Head First設(shè)計(jì)模式][1]和[Pyth...
    plectrum閱讀 824評論 0 1
  • 目標(biāo):每一次天氣數(shù)據(jù)變化的時(shí)候,主顯示器更新數(shù)據(jù)偿乖,溫度顯示器只顯示溫度數(shù)據(jù)击罪,并且把歷史變化數(shù)據(jù)都展示出來。 思路:...
    ouyangbro閱讀 349評論 1 1
  • 【學(xué)習(xí)難度:★★★☆☆贪薪,使用頻率:★★★★★】直接出處:觀察者模式梳理和學(xué)習(xí):https://github.com...
    BruceOuyang閱讀 1,515評論 1 5
  • 觀察者模式媳禁,被觀察物自身屬性通知觀察者。
    蝦想家閱讀 281評論 0 0