摘要:監(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)的處理(即在被觀察者的監(jiān)聽(tīng)中調(diào)用)。模式框架
""" 觀察者模式 """ class Observable(object): """ 被監(jiān)聽(tīng)的對(duì)象,實(shí)現(xiàn)類(lèi)需要具體增加被監(jiān)聽(tīng)的資源 """ def __init__(self): self.__observers = [] @property def observers(self): return self.__observers def has_observer(self): return False if not self.__observers else True def add_observer(self, observer): self.__observers.append(observer) def remove_observer(self, observer): self.__observers.remove(observer) def listener(self, obj=None): for observer in self.__observers: observer.update(self, obj) class Observer(object): """ 觀察者,當(dāng)觀察的對(duì)象發(fā)生變化時(shí),依據(jù)變化情況增加處理邏輯 """ def update(self, observable, obj): passUML圖 示例
""" 基于觀察者模式,實(shí)現(xiàn)一個(gè)簡(jiǎn)單的消息隊(duì)列,當(dāng)隊(duì)列中有消息時(shí),將消息發(fā)送給監(jiān)聽(tīng)者 """ class MyQueue(Observable): def __init__(self): super().__init__() self.__resource = [] def has_message(self): return True if self.__resource else False def queue_size(self): return len(self.__resource) def add_resource(self, res): self.__resource.append(res) print("新消息進(jìn)入,推送...") self.listener(obj=res) class MySubOdd(Observer): def update(self, observable, obj): if isinstance(observable, MyQueue) and int(obj) % 2 != 0: print("I"m MySubOdd, Get Message {} from MyQueue.".format(obj)) class MySubEven(Observer): def update(self, observable, obj): if isinstance(observable, MyQueue) and int(obj) % 2 == 0: print("I"m MySubEven, Get Message {} from MyQueue.".format(obj)) if __name__ == "__main__": my_queue = MyQueue() # 初始化一個(gè)隊(duì)列 my_sub_odd = MySubOdd() # 初始化奇數(shù)監(jiān)聽(tīng)者 my_sub_even = MySubEven() # 初始化偶數(shù)監(jiān)聽(tīng)者 # 將兩個(gè)監(jiān)聽(tīng)者加入監(jiān)聽(tīng)隊(duì)列 my_queue.add_observer(my_sub_odd) my_queue.add_observer(my_sub_even) # 添加資源進(jìn)隊(duì)列 my_queue.add_resource("1") my_queue.add_resource("3") my_queue.add_resource("2") my_queue.add_resource("4")
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/43174.html
摘要:讓你收獲滿(mǎn)滿(mǎn)碼個(gè)蛋從年月日推送第篇文章一年過(guò)去了已累積推文近篇文章,本文為年度精選,共計(jì)篇,按照類(lèi)別整理便于讀者主題閱讀。本篇文章是今年的最后一篇技術(shù)文章,為了讓大家在家也能好好學(xué)習(xí),特此花了幾個(gè)小時(shí)整理了這些文章。 showImg(https://segmentfault.com/img/remote/1460000013241596); 讓你收獲滿(mǎn)滿(mǎn)! 碼個(gè)蛋從2017年02月20...
摘要:建造者模式實(shí)現(xiàn)建造者模式實(shí)現(xiàn)創(chuàng)建抽象建造者類(lèi)創(chuàng)建具體建造者類(lèi)。建造者模式使用場(chǎng)景建造者模式使用場(chǎng)景相同的方法,不同的執(zhí)行順序,產(chǎn)生不同的事件結(jié)果時(shí),可以采用建造者模式。1、什么是建造者模式 Separate the construction of a complex object from its representation so that the same constructi...
1、什么是建造者模式Separate the construction of a complex object from its representation so that the same construction process can create different representations.將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離, 使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。 說(shuō)人話:將構(gòu)...
摘要:觀察者模式維護(hù)單一事件對(duì)應(yīng)多個(gè)依賴(lài)該事件的對(duì)象關(guān)系發(fā)布訂閱維護(hù)多個(gè)事件主題及依賴(lài)各事件主題的對(duì)象之間的關(guān)系觀察者模式是目標(biāo)對(duì)象直接觸發(fā)通知全部通知,觀察對(duì)象被迫接收通知。 觀察者模式(Observer) 觀察者模式:定義了對(duì)象間一種一對(duì)多的依賴(lài)關(guān)系,當(dāng)目標(biāo)對(duì)象 Subject 的狀態(tài)發(fā)生改變時(shí),所有依賴(lài)它的對(duì)象 Observer 都會(huì)得到通知。 簡(jiǎn)單點(diǎn):女神有男朋友了,朋友圈曬個(gè)圖,甜...
摘要:作者按每天一個(gè)設(shè)計(jì)模式旨在初步領(lǐng)會(huì)設(shè)計(jì)模式的精髓,目前采用和兩種語(yǔ)言實(shí)現(xiàn)。誠(chéng)然,每種設(shè)計(jì)模式都有多種實(shí)現(xiàn)方式,但此小冊(cè)只記錄最直截了當(dāng)?shù)膶?shí)現(xiàn)方式原文地址是每天一個(gè)設(shè)計(jì)模式之裝飾者模式歡迎關(guān)注個(gè)人技術(shù)博客。 作者按:《每天一個(gè)設(shè)計(jì)模式》旨在初步領(lǐng)會(huì)設(shè)計(jì)模式的精髓,目前采用javascript和python兩種語(yǔ)言實(shí)現(xiàn)。誠(chéng)然,每種設(shè)計(jì)模式都有多種實(shí)現(xiàn)方式,但此小冊(cè)只記錄最直截了當(dāng)?shù)膶?shí)現(xiàn)方式...
閱讀 2985·2023-04-26 02:29
閱讀 592·2019-08-30 15:54
閱讀 1672·2019-08-29 13:13
閱讀 609·2019-08-28 17:51
閱讀 2731·2019-08-26 13:58
閱讀 1543·2019-08-26 13:27
閱讀 2829·2019-08-26 11:39
閱讀 3454·2019-08-26 10:46