Python設(shè)計(jì)模式 - 觀察者模式

"""

觀察者模式:又叫發(fā)布-訂閱模式。

????它定義了一種一對(duì)多的依賴關(guān)系帮坚,讓多個(gè)觀察者對(duì)象同時(shí)鑒定某一個(gè)主題對(duì)象萤晴。這個(gè)主題對(duì)象在狀態(tài)發(fā)生變化時(shí)胀茵,

會(huì)通知所有的觀察者對(duì)象社露,使它們能夠自動(dòng)更新自己。

觀察者模式所做的工作實(shí)際上就是解耦琼娘,根據(jù)“依賴倒轉(zhuǎn)原則”峭弟,讓耦合的雙方都依賴于抽象,而不是依賴于具體脱拼,

從而使得各自的變化都不會(huì)影響另一邊的變化瞒瘸。

實(shí)際場(chǎng)景中存在的問題:現(xiàn)實(shí)中實(shí)際觀察者不一定有實(shí)現(xiàn)觀察者的通知回調(diào)方法。

解決之道:

1熄浓、為其封裝一個(gè)觀察類出來情臭,實(shí)現(xiàn)相應(yīng)的接口。

2赌蔑、修改通知類俯在,讓具體觀察者的Notify函數(shù)直接去調(diào)用相應(yīng)的接口。

"""

class?Subject(object):

????def?__init__(self):

????????self._observers?=?[]

????def?attach(self,?observer):

????????if?observer?not?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:

????????????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?HexViewer:

????def?update(self,?subject):

????????print('十六進(jìn)制查看器:?主題?%s?有數(shù)據(jù)?0x%x'?%?(subject.name,?subject.data))

class?DecimalViewer:

????def?update(self,?subject):

????????print('十進(jìn)制查看器:?主題?%s?有數(shù)據(jù)?%d'?%

??????????????(subject.name,?subject.data))

#?用法示例...

def?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("設(shè)置數(shù)據(jù)1變量?=?10")

????data1.data?=?10

????print("設(shè)置數(shù)據(jù)2變量?=?15")

????data2.data?=?15

????print("設(shè)置數(shù)據(jù)1變量?=?3")

????data1.data?=?3

????print("設(shè)置數(shù)據(jù)2變量?=?5")

????data2.data?=?5

????print("從data1和data2分離HexViewer娃惯。")

????data1.detach(view2)

????data2.detach(view2)

????print("設(shè)置數(shù)據(jù)1變量?=?10")

????data1.data?=?10

????print("設(shè)置數(shù)據(jù)2變量?=?15")

????data2.data?=?15

if?__name__?==?'__main__':

????main()

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末跷乐,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子趾浅,更是在濱河造成了極大的恐慌愕提,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件皿哨,死亡現(xiàn)場(chǎng)離奇詭異浅侨,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)证膨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門如输,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人椎例,你說我怎么就攤上這事挨决。” “怎么了订歪?”我有些...
    開封第一講書人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵脖祈,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我刷晋,道長(zhǎng)盖高,這世上最難降的妖魔是什么慎陵? 我笑而不...
    開封第一講書人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任闪湾,我火速辦了婚禮窍侧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘屑彻。我一直安慰自己撞蚕,他們只是感情好润梯,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著甥厦,像睡著了一般纺铭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上刀疙,一...
    開封第一講書人閱讀 51,727評(píng)論 1 305
  • 那天舶赔,我揣著相機(jī)與錄音,去河邊找鬼谦秧。 笑死竟纳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的疚鲤。 我是一名探鬼主播锥累,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼石咬!你這毒婦竟也來了揩悄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤鬼悠,失蹤者是張志新(化名)和其女友劉穎删性,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體焕窝,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蹬挺,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了它掂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巴帮。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖虐秋,靈堂內(nèi)的尸體忽然破棺而出榕茧,到底是詐尸還是另有隱情,我是刑警寧澤客给,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布用押,位于F島的核電站,受9級(jí)特大地震影響靶剑,放射性物質(zhì)發(fā)生泄漏蜻拨。R本人自食惡果不足惜池充,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缎讼。 院中可真熱鬧收夸,春花似錦、人聲如沸血崭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽功氨。三九已至序苏,卻和暖如春手幢,著一層夾襖步出監(jiān)牢的瞬間捷凄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來泰國打工围来, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留跺涤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓监透,卻偏偏與公主長(zhǎng)得像桶错,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子胀蛮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

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