国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Python觀察者模式介紹、使用方法

這篇具有很好參考價(jià)值的文章主要介紹了Python觀察者模式介紹、使用方法。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一、Python觀察者模式介紹

Python觀察者模式是一種行為型設(shè)計(jì)模式,它將對(duì)象分成兩個(gè)部分:觀察者和主題。觀察者在主題狀態(tài)改變時(shí)被通知并且更新自己。

功能:

  • 通過解耦來實(shí)現(xiàn)可重用性和靈活性。
  • 提供了一種對(duì)象間的一對(duì)多依賴關(guān)系,當(dāng)一個(gè)對(duì)象改變狀態(tài)時(shí),所有依賴對(duì)象都會(huì)收到通知。
  • 主題和觀察者之間是松散耦合的,它們可以獨(dú)立地改變。

優(yōu)點(diǎn):

  • 提供靈活性,減少類間的耦合度。
  • 可以實(shí)現(xiàn)動(dòng)態(tài)的發(fā)布-訂閱機(jī)制,并且觀察者可在運(yùn)行時(shí)動(dòng)態(tài)地加入或離開主題。
  • 實(shí)現(xiàn)開放-封閉原則,使得主題和觀察者可以獨(dú)立地?cái)U(kuò)展和修改。

缺點(diǎn):

  • 觀察者過多會(huì)導(dǎo)致通知效率等性能問題。
  • 如果觀察者與主題相互依賴,修改其中任意一方的代碼都需要修改對(duì)方的代碼,不利于系統(tǒng)的擴(kuò)展和維護(hù)。

應(yīng)用場(chǎng)景:

  • 當(dāng)一個(gè)對(duì)象的改變需要同時(shí)改變其他對(duì)象時(shí),比如消息訂閱模型。
  • 當(dāng)一個(gè)抽象模型有兩個(gè)方面,其中一個(gè)方面需要依賴另外一個(gè)方面時(shí)。

使用方式:

  • 定義觀察者類,包含需要執(zhí)行的方法。
  • 定義主題類,包含觀察者列表和通知觀察者的方法。
  • 在主題類的方法中通知觀察者。

在應(yīng)用程序開發(fā)中的應(yīng)用:

  • GUI界面中的控件更新。
  • 消息訂閱模型。
  • 日志記錄器。

二、觀察者模式使用

工作原理:

  • 觀察者將自己注冊(cè)到主題中。
  • 主題維護(hù)一個(gè)觀察者列表。
  • 當(dāng)主題狀態(tài)發(fā)生改變時(shí),通知所有觀察者。
  • 觀察者執(zhí)行相應(yīng)的操作。

示例一:實(shí)現(xiàn)信息通知功能

假設(shè)我們要實(shí)現(xiàn)一個(gè)天氣預(yù)報(bào)系統(tǒng),當(dāng)天氣發(fā)生變化時(shí),需要將信息通知給所有的觀察者。這是一個(gè)常見的觀察者模式的應(yīng)用場(chǎng)景,下面舉例詳細(xì)說明 Python觀察者模式的工作原理和使用方法。

首先,我們需要定義兩個(gè)類:主題類和觀察者類。主題類包含一個(gè)觀察者列表和通知觀察者的方法,觀察者類包含需要執(zhí)行的方法。WeatherSubject類為天氣主題類,包含observers列表和register_observer、remove_observer、notify_observers、set_temperature等方法。WeatherObserver類為觀察者類,包含name屬性和update方法。在update方法中,觀察者會(huì)執(zhí)行相應(yīng)的操作,例如打印收到通知的信息。

接下來,我們可以創(chuàng)建主題對(duì)象和觀察者對(duì)象,并將觀察者對(duì)象注冊(cè)到主題對(duì)象中。創(chuàng)建了一個(gè)主題對(duì)象subject和兩個(gè)觀察者對(duì)象observer_1和observer_2,并將觀察者對(duì)象注冊(cè)到主題對(duì)象中。

現(xiàn)在,我們可以改變天氣信息,然后通知所有的觀察者。代碼如下:

# *********************************觀察者模式實(shí)現(xiàn)信息通知功能
# 主題類
class WeatherSubject():
    def __init__(self):
        self.observers = [] # 初始化觀察者數(shù)組
        self.temperature = None # 初始化溫度
    def register_observer(self, observer):
        self.observers.append(observer)

    def remove_observer(self, observer):
        self.observers.remove(observer)

    def notify_observer(self):
        for observer in self.observers:
            observer.update(self.temperature) # 通知觀察者溫度

    def set_temperature(self, temperature):
        self.temperature = temperature # 設(shè)置溫度
        self.notify_observer() # 通知觀察者

# 觀察者類
class WeatherObserver():
    def __init__(self, name):
        self.name = name
    def update(self, temperature):
        print(f"{self.name}收到溫度通知:溫度為{temperature}℃")

subject = WeatherSubject()

observer1 = WeatherObserver("name1")
observer2 = WeatherObserver("name2")

subject.register_observer(observer1)
subject.register_observer(observer2)

subject.set_temperature(20)

運(yùn)行結(jié)果

name1收到溫度通知:溫度為20℃
name2收到溫度通知:溫度為20℃

在上述代碼中,我們將溫度設(shè)置為20℃,然后調(diào)用set_temperature方法通知所有的觀察者。觀察者會(huì)收到通知并執(zhí)行相應(yīng)的操作,例如打印收到通知的信息。

這就是 Python觀察者模式的工作原理和使用方法。當(dāng)主題狀態(tài)發(fā)生變化時(shí),通知所有的觀察者,執(zhí)行相應(yīng)的操作,實(shí)現(xiàn)了對(duì)象間的一對(duì)多依賴關(guān)系。

示例二:實(shí)現(xiàn)消息訂閱功能

下面我們以一個(gè)簡單的消息訂閱系統(tǒng)為例,詳細(xì)說明 Python觀察者模式實(shí)現(xiàn)消息訂閱功能。

首先,我們需要定義兩個(gè)類:主題類和觀察者類。主題類包含一個(gè)觀察者列表和通知觀察者的方法,觀察者類包含需要執(zhí)行的方法。,NewsSubject類為新聞主題類,包含observers字典和register_observer、remove_observer、notify_observers、set_news等方法。其中,observers字典的鍵為訂閱主題,值為觀察者列表。NewsObserver類為觀察者類,包含name屬性和update方法。

接下來,我們可以創(chuàng)建主題對(duì)象和觀察者對(duì)象,并將觀察者對(duì)象注冊(cè)到主題對(duì)象中。創(chuàng)建了一個(gè)主題對(duì)象subject和三個(gè)觀察者對(duì)象observer_1、observer_2和observer_3,并將觀察者對(duì)象注冊(cè)到主題對(duì)象中,每個(gè)觀察者訂閱不同的新聞主題。

現(xiàn)在,我們可以發(fā)布新聞消息,然后通知訂閱相應(yīng)主題的觀察者。具體代碼如下:

# *********************************觀察者模式實(shí)現(xiàn)消息訂閱功能

# 新聞主題類
class NewsSubject():
    def __init__(self):
        self.observers = {} # 字典
        self.news = None

    def register_observer(self, observer, topic):
        if topic not in self.observers:
            self.observers[topic] = []
        self.observers[topic].append(observer)

    def remove_observer(self, observer, topic):
        if topic in self.observers:
            self.observers[topic].remove(observer)

    def notify_observers(self,topic):
        if topic in self.observers: # if語句,存在觀察者訂閱的主題新聞,通知觀察者
            for observer in self.observers[topic]:
                observer.update(self.news)  # 通知觀察者新聞

    def set_news(self, news, topic):
        self.news = news
        self.notify_observers(topic)



class NewsObserver():
    def __init__(self, name):
        self.name = name

    def update(self, news):
        print(f"{self.name}收到新聞:{news}")

subject = NewsSubject()

observer_1 = NewsObserver("name1")
observer_2 = NewsObserver("name2")
observer_3 = NewsObserver("name3")

subject.register_observer(observer_1, "國內(nèi)新聞")
subject.register_observer(observer_2, "國外新聞")
subject.register_observer(observer_3, "娛樂新聞")

subject.set_news("中國的新聞,中國......", "國內(nèi)新聞")
subject.set_news("外國的新聞,美國......", "國外新聞")
subject.set_news("明星...","娛樂新聞")
subject.set_news("歌星...","娛樂新聞")

運(yùn)行結(jié)果:

name1收到新聞:中國的新聞,中國......
name2收到新聞:外國的新聞,美國......
name3收到新聞:明星...
name3收到新聞:歌星...

在上述代碼中,我們發(fā)布了三條新聞消息,并使用set_news方法通知訂閱相應(yīng)主題的觀察者。觀察者會(huì)收到通知并執(zhí)行相應(yīng)的操作,例如打印收到通知的信息。

這就是 Python觀察者模式實(shí)現(xiàn)消息訂閱功能的方法。當(dāng)主題狀態(tài)發(fā)生變化時(shí),通知所有訂閱該主題的觀察者,執(zhí)行相應(yīng)的操作,實(shí)現(xiàn)了消息訂閱功能。

示例三:實(shí)現(xiàn)日志記錄器功能

下面我們以一個(gè)簡單的日志記錄器系統(tǒng)為例,詳細(xì)說明 Python觀察者模式實(shí)現(xiàn)日志記錄器功能。

首先,我們需要定義兩個(gè)類:主題類和觀察者類。主題類包含一個(gè)觀察者列表和通知觀察者的方法,觀察者類包含需要執(zhí)行的方法。LoggerSubject類為日志主題類,包含observers字典和register_observer、remove_observer、notify_observers等方法。其中,observers字典的鍵為日志級(jí)別,值為觀察者列表。FileLoggerObserver類為觀察者類,包含log_file屬性和update方法。在update方法中,我們將收到的日志消息寫入指定的日志文件中。

接下來,我們可以創(chuàng)建主題對(duì)象和觀察者對(duì)象,并將觀察者對(duì)象注冊(cè)到主題對(duì)象中。創(chuàng)建了一個(gè)主題對(duì)象subject和三個(gè)觀察者對(duì)象observer_1、observer_2和observer_3,并將觀察者對(duì)象注冊(cè)到主題對(duì)象中,每個(gè)觀察者訂閱不同的日志級(jí)別。

現(xiàn)在,我們可以記錄日志消息,然后通知訂閱相應(yīng)級(jí)別的觀察者。具體代碼如下:

# *********************************觀察者模式實(shí)現(xiàn)日志記錄功能

# 日志主題類
class LoggerSubject():
    def __init__(self):
        self.observers = {} # 字典: 日志級(jí)別

    def register_observer(self, observer, level):
        if level not in self.observers:
            self.observers[level] = []
        self.observers[level].append(observer)

    def remove_observer(self, observer, level):
        if level in self.observers:
            self.observers[level].remove(observer)

    def notify_observers(self,message,level):
        if level in self.observers: # if語句,存在觀察者訂閱的主題新聞,通知觀察者
            for observer in self.observers[level]:
                observer.update(message)  # 通知觀察者新聞

# 觀察者類
class FileLoggerObserver():
    def __init__(self, log_file):
        self.log_file = log_file

    def update(self, message):
        print(f"{self.log_file}寫入日志:{message}")
        with open(self.log_file, "a") as f:
            f.write(message + "\n")

subject = LoggerSubject()

observer_1 = FileLoggerObserver("log_debug.txt")
observer_2 = FileLoggerObserver("log_info.txt")
observer_3 = FileLoggerObserver("log_error.txt")

subject.register_observer(observer_1,"debug")
subject.register_observer(observer_2, "info")
subject.register_observer(observer_3, "error")

subject.notify_observers("調(diào)試信息","debug")
subject.notify_observers("普通信息","info")
subject.notify_observers("錯(cuò)誤信息","error")
subject.notify_observers("錯(cuò)誤信息1","error")

運(yùn)行結(jié)果:

log_debug.txt寫入日志:調(diào)試信息
log_info.txt寫入日志:普通信息
log_error.txt寫入日志:錯(cuò)誤信息
log_error.txt寫入日志:錯(cuò)誤信息1

在上述代碼中,我們記錄了三條日志消息,并使用notify_observers方法通知訂閱相應(yīng)級(jí)別的觀察者。觀察者會(huì)收到通知并將收到的消息寫入指定的日志文件中。

這就是 Python觀察者模式實(shí)現(xiàn)日志記錄器功能的方法。當(dāng)主題狀態(tài)發(fā)生變化時(shí),通知所有訂閱該主題的觀察者,執(zhí)行相應(yīng)的操作,實(shí)現(xiàn)了日志記錄器功能。文章來源地址http://www.zghlxwxcb.cn/news/detail-610806.html

到了這里,關(guān)于Python觀察者模式介紹、使用方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【C++ 觀察者模式 思想理解】C++中的觀察者模式:松耦合設(shè)計(jì)與動(dòng)態(tài)交互的藝術(shù),合理使用智能指針觀察者

    【C++ 觀察者模式 思想理解】C++中的觀察者模式:松耦合設(shè)計(jì)與動(dòng)態(tài)交互的藝術(shù),合理使用智能指針觀察者

    在進(jìn)入技術(shù)細(xì)節(jié)之前,理解觀察者模式(Observer Pattern)的基本概念和它在現(xiàn)代編程中的重要性是至關(guān)重要的。 觀察者模式是一種設(shè)計(jì)模式,它定義了對(duì)象間的一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都得到通知并自動(dòng)更新。在C++中,這個(gè)

    2024年01月24日
    瀏覽(47)
  • 【設(shè)計(jì)模式——學(xué)習(xí)筆記】23種設(shè)計(jì)模式——觀察者模式Observer(原理講解+應(yīng)用場(chǎng)景介紹+案例介紹+Java代碼實(shí)現(xiàn))

    【設(shè)計(jì)模式——學(xué)習(xí)筆記】23種設(shè)計(jì)模式——觀察者模式Observer(原理講解+應(yīng)用場(chǎng)景介紹+案例介紹+Java代碼實(shí)現(xiàn))

    有一個(gè)天氣預(yù)報(bào)項(xiàng)目,需求如下: 氣象站可以將每天測(cè)量到的溫度、濕度、氣壓等等以公告的形式發(fā)布出去(比如發(fā)布到自己的網(wǎng)站或第三方) 需要設(shè)計(jì)開放型API,便于其他第三方也能接入氣象站獲取數(shù)據(jù) 提供溫度、氣壓、濕度的接口 測(cè)量數(shù)據(jù)更新時(shí),要能實(shí)時(shí)的通知給第三

    2024年02月14日
    瀏覽(19)
  • 觀察者模式(上):詳解各種應(yīng)用場(chǎng)景下觀察者模式的不同實(shí)現(xiàn)方式

    ????????從今天起,我們開始學(xué)習(xí)行為型設(shè)計(jì)模式。我們知道,創(chuàng)建型設(shè)計(jì)模式主要解決“對(duì)象的創(chuàng)建”問題,結(jié)構(gòu)型設(shè)計(jì)模式主要解決“類或?qū)ο蟮慕M合或組裝”問題,那行為型設(shè)計(jì)模式主要解決的就是“ 類或?qū)ο笾g的交互 ”問題。 原理及應(yīng)用場(chǎng)景剖析 在對(duì)象之間

    2024年02月16日
    瀏覽(82)
  • 【觀察者設(shè)計(jì)模式詳解】C/Java/JS/Go/Python/TS不同語言實(shí)現(xiàn)

    【觀察者設(shè)計(jì)模式詳解】C/Java/JS/Go/Python/TS不同語言實(shí)現(xiàn)

    觀察者模式(Observer Pattern)是一種行為型模式。它定義對(duì)象間的一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都得到通知并被自動(dòng)更新。 觀察者模式使用三個(gè)類Subject、Observer和Client。Subject對(duì)象帶有綁定觀察者到Client對(duì)象和從Client對(duì)象解綁觀察

    2023年04月21日
    瀏覽(24)
  • 行為型模式 | 觀察者模式

    行為型模式 | 觀察者模式

    觀察者模式又叫做發(fā)布-訂閱(Publish/Subscribe)模式,定義了一種一對(duì)多的依賴關(guān)系 。讓多個(gè)觀察者對(duì)象同時(shí)監(jiān)聽某一個(gè)主題對(duì)象,這個(gè)主題對(duì)象在狀態(tài)上發(fā)生變化時(shí),會(huì)通知所有觀察者對(duì)象,使它們能夠自動(dòng)更新自己。 軟件系統(tǒng)常常要求在某一個(gè)對(duì)象的狀態(tài)發(fā)生變化的時(shí)候

    2024年01月22日
    瀏覽(53)
  • 設(shè)計(jì)模式-觀察者模式

    觀察者模式是一種行為型設(shè)計(jì)模式,它定義了一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),其所有依賴者都會(huì)收到通知并自動(dòng)更新。當(dāng)對(duì)象間存在一對(duì)多關(guān)系時(shí),則使用觀察者模式(Observer Pattern)。比如,當(dāng)一個(gè)對(duì)象被修改時(shí),則會(huì)自動(dòng)通知依賴它的對(duì)象。觀察者

    2024年02月15日
    瀏覽(21)
  • 【設(shè)計(jì)模式】觀察者模式

    【設(shè)計(jì)模式】觀察者模式

    觀察者模式(又被稱為發(fā)布-訂閱(Publish/Subscribe)模式,屬于行為型模式的一種,它定義了一種一對(duì)多的依賴關(guān)系,讓多個(gè)觀察者對(duì)象同時(shí)監(jiān)聽某一個(gè)主題對(duì)象。這個(gè)主題對(duì)象在狀態(tài)變化時(shí),會(huì)通知所有的觀察者對(duì)象,使他們能夠自動(dòng)更新自己。 Subject:抽象主題(被觀察者

    2024年02月13日
    瀏覽(19)
  • 設(shè)計(jì)模式---觀察者模式

    1,概念 ????????屬于行為模式的一種,定義了一種一對(duì)多的依賴關(guān)系,讓多個(gè)觀察者對(duì)象同時(shí)監(jiān)聽某一對(duì)象主題對(duì)象,這個(gè)主題對(duì)象在狀態(tài)變化時(shí),會(huì)通知所有的觀察者對(duì)象,使他們能夠自動(dòng)更新自己。 在觀察者模式中有如下角色: Subject:抽象主題(抽象被觀察者),

    2024年02月15日
    瀏覽(17)
  • 設(shè)計(jì)模式——觀察者模式

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

    觀察者模式可以分為觀察者和被觀察者,觀察者通過注冊(cè)到一個(gè)被觀察者中,也可視為訂閱,當(dāng)被觀察者的數(shù)據(jù)發(fā)生改變時(shí),會(huì)通知到觀察者,觀察者可以據(jù)此做出反應(yīng)。 可以類比訂閱報(bào)紙,報(bào)社就是被觀察者,訂閱者就是觀察者,訂閱者通過訂閱報(bào)紙與報(bào)社建立聯(lián)系,而報(bào)

    2024年02月15日
    瀏覽(17)
  • 設(shè)計(jì)模式:觀察者模式

    定義 觀察者模式(Observer Pattern)是一種行為設(shè)計(jì)模式,允許一個(gè)對(duì)象(稱為“主題”或“可觀察對(duì)象”)維護(hù)一組依賴于它的對(duì)象(稱為“觀察者”),當(dāng)主題的狀態(tài)發(fā)生變化時(shí),會(huì)自動(dòng)通知所有觀察者對(duì)象。 應(yīng)用場(chǎng)景 觀察者模式適用于以下場(chǎng)景: 聯(lián)動(dòng)反應(yīng) :當(dāng)一個(gè)對(duì)象

    2024年04月08日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包