AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁 > 科技  > 軟件

Python實(shí)現(xiàn)策略模式、觀察者模式和責(zé)任鏈模式

來源: 責(zé)編: 時(shí)間:2024-06-05 17:44:00 120觀看
導(dǎo)讀今天我們將介紹三種行為型設(shè)計(jì)模式:策略模式、觀察者模式和責(zé)任鏈模式。1.策略模式策略模式是一種行為設(shè)計(jì)模式,它允許在運(yùn)行時(shí)選擇算法的行為。它將算法封裝在獨(dú)立的策略類中,使得它們可以互相替換,而不會影響到客戶端代

今天我們將介紹三種行為型設(shè)計(jì)模式:策略模式、觀察者模式和責(zé)任鏈模式。ICp28資訊網(wǎng)——每日最新資訊28at.com

ICp28資訊網(wǎng)——每日最新資訊28at.com

1.策略模式

策略模式是一種行為設(shè)計(jì)模式,它允許在運(yùn)行時(shí)選擇算法的行為。它將算法封裝在獨(dú)立的策略類中,使得它們可以互相替換,而不會影響到客戶端代碼。在Python中,我們可以使用函數(shù)或者類來實(shí)現(xiàn)策略模式。ICp28資訊網(wǎng)——每日最新資訊28at.com

(1) 策略模式的結(jié)構(gòu)ICp28資訊網(wǎng)——每日最新資訊28at.com

策略模式的核心是定義一個(gè)策略接口,所有的具體策略都要實(shí)現(xiàn)這個(gè)接口。然后,我們可以在客戶端代碼中使用策略對象,而不需要關(guān)心具體的實(shí)現(xiàn)細(xì)節(jié)。ICp28資訊網(wǎng)——每日最新資訊28at.com

以下是策略模式的基本結(jié)構(gòu):ICp28資訊網(wǎng)——每日最新資訊28at.com

# 策略接口class Strategy:    def do_operation(self):        pass# 具體策略類class ConcreteStrategyA(Strategy):    def do_operation(self):        print("執(zhí)行策略A的操作")class ConcreteStrategyB(Strategy):    def do_operation(self):        print("執(zhí)行策略B的操作")# 上下文類class Context:    def __init__(self, strategy):        self.strategy = strategy    def execute_strategy(self):        self.strategy.do_operation()# 客戶端代碼if __name__ == "__main__":    strategy_a = ConcreteStrategyA()    strategy_b = ConcreteStrategyB()    context = Context(strategy_a)    context.execute_strategy()    context.strategy = strategy_b    context.execute_strategy()

(2) 策略模式的應(yīng)用場景ICp28資訊網(wǎng)——每日最新資訊28at.com

策略模式適用于以下場景:ICp28資訊網(wǎng)——每日最新資訊28at.com

  • 當(dāng)一個(gè)系統(tǒng)有多個(gè)算法,并且需要在運(yùn)行時(shí)根據(jù)不同情況選擇其中一個(gè)算法時(shí)。
  • 當(dāng)一個(gè)類有多個(gè)行為,并且這些行為可以通過繼承來擴(kuò)展時(shí)。
  • 當(dāng)一個(gè)類的行為在運(yùn)行時(shí)可以動態(tài)改變時(shí)。

(3) 策略模式的優(yōu)點(diǎn)ICp28資訊網(wǎng)——每日最新資訊28at.com

  • 策略模式將算法的實(shí)現(xiàn)與使用算法的客戶端代碼分離,使得它們可以獨(dú)立地變化。
  • 策略模式遵循開閉原則,新的策略可以很容易地添加到系統(tǒng)中,而不會影響到原有的代碼。

(4) 策略模式的缺點(diǎn)ICp28資訊網(wǎng)——每日最新資訊28at.com

  • 策略模式增加了系統(tǒng)中類的數(shù)量,增加了代碼的復(fù)雜度。
  • 客戶端需要了解所有的策略類,才能選擇合適的策略。

2.觀察者模式

它定義了一種一對多的依賴關(guān)系,讓多個(gè)觀察者對象同時(shí)監(jiān)聽一個(gè)主題對象。當(dāng)主題對象的狀態(tài)發(fā)生變化時(shí),它會通知所有的觀察者對象,使得它們能夠自動更新。ICp28資訊網(wǎng)——每日最新資訊28at.com

(1) 觀察者模式的結(jié)構(gòu)ICp28資訊網(wǎng)——每日最新資訊28at.com

觀察者模式的核心是主題對象和觀察者對象之間的關(guān)系。主題對象維護(hù)一個(gè)觀察者列表,當(dāng)主題對象的狀態(tài)發(fā)生變化時(shí),它會遍歷觀察者列表,通知每個(gè)觀察者對象進(jìn)行更新。ICp28資訊網(wǎng)——每日最新資訊28at.com

以下是觀察者模式的基本結(jié)構(gòu):ICp28資訊網(wǎng)——每日最新資訊28at.com

# 主題接口class Subject:    def attach(self, observer):        pass    def detach(self, observer):        pass    def notify(self):        pass# 具體主題類class ConcreteSubject(Subject):    def __init__(self):        self.observers = []    def attach(self, observer):        self.observers.append(observer)    def detach(self, observer):        self.observers.remove(observer)    def notify(self):        for observer in self.observers:            observer.update()# 觀察者接口class Observer:    def update(self):        pass# 具體觀察者類class ConcreteObserverA(Observer):    def update(self):        print("觀察者A收到通知")class ConcreteObserverB(Observer):    def update(self):        print("觀察者B收到通知")# 客戶端代碼if __name__ == "__main__":    subject = ConcreteSubject()    observer_a = ConcreteObserverA()    observer_b = ConcreteObserverB()    subject.attach(observer_a)    subject.attach(observer_b)    subject.notify()    subject.detach(observer_b)    subject.notify()

(2) 觀察者模式的應(yīng)用場景ICp28資訊網(wǎng)——每日最新資訊28at.com

觀察者模式適用于以下場景:ICp28資訊網(wǎng)——每日最新資訊28at.com

  • 當(dāng)一個(gè)對象的改變需要同時(shí)改變其他對象時(shí)。
  • 當(dāng)一個(gè)對象的改變需要通知一組對象時(shí)。
  • 當(dāng)一個(gè)對象的改變需要讓其他對象自動更新時(shí)。

(3) 觀察者模式的優(yōu)點(diǎn)ICp28資訊網(wǎng)——每日最新資訊28at.com

  • 觀察者模式將主題對象和觀察者對象解耦,使得它們可以獨(dú)立地變化。
  • 觀察者模式遵循開閉原則,新的觀察者可以很容易地添加到系統(tǒng)中,而不會影響到原有的代碼。

(4) 觀察者模式的缺點(diǎn)ICp28資訊網(wǎng)——每日最新資訊28at.com

  • 觀察者模式可能會導(dǎo)致系統(tǒng)中觀察者對象過多,增加了代碼的復(fù)雜度。
  • 觀察者模式中,觀察者對象與主題對象之間存在循環(huán)依賴的關(guān)系,可能會導(dǎo)致循環(huán)引用的問題。

3.責(zé)任鏈模式

它將請求的發(fā)送者和接收者解耦,使得多個(gè)對象都有機(jī)會處理請求。將這些對象串成一條鏈,并沿著這條鏈傳遞請求,直到有一個(gè)對象能夠處理它為止。ICp28資訊網(wǎng)——每日最新資訊28at.com

(1) 責(zé)任鏈模式的結(jié)構(gòu)ICp28資訊網(wǎng)——每日最新資訊28at.com

責(zé)任鏈模式的核心是責(zé)任鏈對象和處理對象之間的關(guān)系。責(zé)任鏈對象維護(hù)一個(gè)處理對象列表,當(dāng)收到請求時(shí),它會遍歷處理對象列表,直到找到能夠處理請求的對象。ICp28資訊網(wǎng)——每日最新資訊28at.com

以下是責(zé)任鏈模式的基本結(jié)構(gòu):ICp28資訊網(wǎng)——每日最新資訊28at.com

# 處理對象接口class Handler:    def set_successor(self, successor):        pass    def handle_request(self, request):        pass# 具體處理對象類class ConcreteHandlerA(Handler):    def __init__(self):        self.successor = None    def set_successor(self, successor):        self.successor = successor    def handle_request(self, request):        if request == "A":            print("處理對象A處理請求")        elif self.successor is not None:            self.successor.handle_request(request)class ConcreteHandlerB(Handler):    def __init__(self):        self.successor = None    def set_successor(self, successor):        self.successor = successor    def handle_request(self, request):        if request == "B":            print("處理對象B處理請求")        elif self.successor is not None:            self.successor.handle_request(request)# 客戶端代碼if __name__ == "__main__":    handler_a = ConcreteHandlerA()    handler_b = ConcreteHandlerB()    handler_a.set_successor(handler_b)    handler_a.handle_request("A")    handler_a.handle_request("B")    handler_a.handle_request("C")

(2) 責(zé)任鏈模式的應(yīng)用場景ICp28資訊網(wǎng)——每日最新資訊28at.com

責(zé)任鏈模式適用于以下場景:ICp28資訊網(wǎng)——每日最新資訊28at.com

  • 多個(gè)對象可以處理同一個(gè)請求,但具體由哪個(gè)對象處理是在運(yùn)行時(shí)動態(tài)決定的。
  • 需要將請求的發(fā)送者和接收者解耦,使得多個(gè)對象都有機(jī)會處理請求。

(3) 責(zé)任鏈模式的優(yōu)點(diǎn)ICp28資訊網(wǎng)——每日最新資訊28at.com

  • 責(zé)任鏈模式將請求的發(fā)送者和接收者解耦,使得它們可以獨(dú)立地變化。
  • 責(zé)任鏈模式遵循開閉原則,新的處理對象可以很容易地添加到系統(tǒng)中,而不會影響到原有的代碼。

(4) 責(zé)任鏈模式的缺點(diǎn)ICp28資訊網(wǎng)——每日最新資訊28at.com

  • 責(zé)任鏈模式中,請求可能會在責(zé)任鏈上被多次處理,可能會導(dǎo)致性能問題。

本文鏈接:http://www.tebozhan.com/showinfo-26-92133-0.htmlPython實(shí)現(xiàn)策略模式、觀察者模式和責(zé)任鏈模式

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: C# 異常處理:每個(gè) .NET 開發(fā)者都應(yīng)掌握的核心知識點(diǎn)

下一篇: 實(shí)用 Python:文件與目錄管理的 17 個(gè)技巧

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 對標(biāo)蘋果的靈動島 華為帶來實(shí)況窗功能

    繼蘋果的靈動島之后,華為也在今天正式推出了“實(shí)況窗”功能。據(jù)今天鴻蒙OS 4.0的現(xiàn)場演示顯示,華為的實(shí)況窗可以更高效的展現(xiàn)出實(shí)時(shí)通知,比如鎖屏上就能看到外賣、打車、銀行
  • 7月安卓手機(jī)性能榜:紅魔8S Pro再奪榜首

    7月份的手機(jī)市場風(fēng)平浪靜,除了紅魔和努比亞帶來了兩款搭載驍龍8Gen2領(lǐng)先版處理器的新機(jī)之外,別的也想不到有什么新品了,這也正常,通常6月7月都是手機(jī)廠商修整的時(shí)間,進(jìn)入8月份之
  • 一加首款折疊屏!一加Open渲染圖出爐:罕見單手可握小尺寸

    8月5日消息,此前就有爆料稱,一加首款折疊屏手機(jī)將會在第三季度上市,如今隨著時(shí)間臨近,新機(jī)的各種消息也開始浮出水面。據(jù)悉,這款新機(jī)將會被命名為“On
  • 多線程開發(fā)帶來的問題與解決方法

    使用多線程主要會帶來以下幾個(gè)問題:(一)線程安全問題  線程安全問題指的是在某一線程從開始訪問到結(jié)束訪問某一數(shù)據(jù)期間,該數(shù)據(jù)被其他的線程所修改,那么對于當(dāng)前線程而言,該線程
  • 一文搞定Java NIO,以及各種奇葩流

    大家好,我是哪吒。很多朋友問我,如何才能學(xué)好IO流,對各種流的概念,云里霧里的,不求甚解。用到的時(shí)候,現(xiàn)百度,功能雖然實(shí)現(xiàn)了,但是為什么用這個(gè)?不知道。更別說效率問題了~下次再遇到,
  • ESG的面子與里子

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之三伏大幕拉起,各地高溫預(yù)警不絕,但處于厄爾尼諾大“烤”之下的除了眾生,還有各大企業(yè)發(fā)布的ESG報(bào)告。ESG是“環(huán)境保
  • 華為Mate60標(biāo)準(zhǔn)版細(xì)節(jié)曝光:經(jīng)典星環(huán)相機(jī)模組回歸

    這段時(shí)間以來,關(guān)于華為新旗艦的爆料日漸密集。據(jù)此前多方爆料,今年華為將開始恢復(fù)一年雙旗艦戰(zhàn)略,除上半年推出的P60系列外,往年下半年的Mate系列也將
  • Windows 11發(fā)布,微軟一改往常對老機(jī)型開放的態(tài)度

    距離 Windows 11 發(fā)布已經(jīng)過去一周,在過去一周里,很多數(shù)碼愛好者圍繞其對 Android 應(yīng)用的支持、對老機(jī)型的升級問題展開了激烈討論。與以往不同的是,在這次大
  • 聯(lián)想小新Pad Pro 12.6將要推出,搭載高通驍龍 870 處理器

    聯(lián)想小新Pad Pro 12.6將于秋季新品會上推出,官方按照慣例直接在發(fā)布會前給出了機(jī)型的所有參數(shù)。聯(lián)想小新 Pad Pro 12.6 將搭載高通驍龍 870 處理器,重量為 5
Top