觀察者模式(python版)

來源:互聯網
上載者:User

觀察者模式:又叫發布-訂閱模式。
    它定義了一種一對多的依賴關係,讓多個觀察者對象同時評鑑某一個主題對象。這個主題對象在狀態發生變化時,會通知所有的觀察者對象,使它們能夠自動更新自己。

觀察者模式所做的工作實際上就是解耦,根據“依賴倒轉原則”,讓耦合的雙方都依賴於抽象,而不是依賴於具體,從而使得各自的變化都不會影響另一邊的變化。

實際情境中存在的問題:現實中實際觀察者不一定有實現觀察者的通知回調方法。

解決之道:
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();

類圖

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.