一、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ì)收到通知并將收到的消息寫入指定的日志文件中。文章來源:http://www.zghlxwxcb.cn/news/detail-610806.html
這就是 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)!