觀察者模式:又叫發布-訂閱模式。
它定義了一種一對多的依賴關係,讓多個觀察者對象同時評鑑某一個主題對象。這個主題對象在狀態發生變化時,會通知所有的觀察者對象,使它們能夠自動更新自己。
觀察者模式所做的工作實際上就是解耦,根據“依賴倒轉原則”,讓耦合的雙方都依賴於抽象,而不是依賴於具體,從而使得各自的變化都不會影響另一邊的變化。
實際情境中存在的問題:現實中實際觀察者不一定有實現觀察者的通知回調方法。
解決之道:
1、為其封裝一個觀察類出來,實現相應的介面。
2、修改通知類,讓具體觀察者的Notify函數直接去調用相應的介面。
#encoding=utf-8##by panda#觀察者模式def printInfo(info): print unicode(info, 'utf-8').encode('gbk') #抽象的通知者class Informer(): observers = [] action = '' def Attach(self, observer): self.observers.append(observer) def Notify(self): for o in self.observers: o.Update()#秘書class Secretary(Informer): observers = [] action = "老闆回來了!!!" #老闆class Boss(Informer): observers = [] update = [] #更新函數介面列表 action = "我胡漢三回來了!!!" def AddEventCB(self,eventCB): self.update.append(eventCB) def Notify(self): for o in self.update: o() #抽象的觀察者class Observer(): name = '' nformer = None; def __init__(self, name, secretary): self.name = name self.secretary = secretary def Update(self): pass#看股票的同事class StockObserver(Observer): name = '' secretary = None; def __init__(self, name, secretary): Observer.__init__(self, name, secretary) def Update(self): printInfo("%s, %s, 不要看股票了,繼續工作" % (self.secretary.action,self.name)) def CloseStock(self): printInfo("%s, %s, 不要看股票了,快點工作" % (self.secretary.action,self.name))#看NBA的同事class NBAObserver(Observer): name = '' secretary = None; def __init__(self, name, secretary): Observer.__init__(self, name, secretary) def Update(self): printInfo("%s, %s, 不要看NBA了,繼續工作" % (self.secretary.action,self.name))def clientUI(): secretary = Secretary() stockObserver1 = StockObserver('張三',secretary) nbaObserver1 = NBAObserver('王五',secretary) secretary.Attach(stockObserver1) secretary.Attach(nbaObserver1) secretary.Notify() huHanShan = Boss() stockObserver2 = StockObserver('李四',huHanShan) huHanShan.AddEventCB(stockObserver2.CloseStock) huHanShan.Notify() returnif __name__ == '__main__': clientUI();
類圖: