最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談Python 責(zé)任鏈模式

 更新時(shí)間:2023年04月17日 15:58:43   作者:倦~  
本文主要介紹了淺談Python 責(zé)任鏈模式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

介紹

責(zé)任鏈模式是一種行為型設(shè)計(jì)模式,它允許多個(gè)對(duì)象以鏈?zhǔn)降男问揭来翁幚碚?qǐng)求,直到請(qǐng)求被處理或者無(wú)處理對(duì)象為止

實(shí)現(xiàn)方式

責(zé)任鏈模式由多個(gè)處理器組成,每個(gè)處理器都可以處理一種請(qǐng)求。如果當(dāng)前處理器無(wú)法處理請(qǐng)求,它將把請(qǐng)求傳遞給下一個(gè)處理器,直到請(qǐng)求被處理或者沒有處理器可以處理為止。

案例

假設(shè)我們正在開發(fā)一個(gè)電子商務(wù)平臺(tái),現(xiàn)在需要實(shí)現(xiàn)一個(gè)購(gòu)物車功能。當(dāng)用戶添加商品到購(gòu)物車中時(shí),需要進(jìn)行以下驗(yàn)證

  • 商品是否存在
  • 商品庫(kù)存是否充足
  • 商品是否已經(jīng)下架

我們可以使用責(zé)任鏈模式來(lái)實(shí)現(xiàn)這個(gè)購(gòu)物車功能。首先定義一個(gè)處理器基類

class CartValidator:
? ? def __init__(self, next_validator=None):
? ? ? ? self.next_validator = next_validator

? ? def validate(self, item):
? ? ? ? if self.next_validator:
? ? ? ? ? ? return self.next_validator.validate(item)
? ? ? ? return True

這個(gè)基類包含了一個(gè)next_validator屬性,表示后繼處理器,以及一個(gè)validate方法,用于驗(yàn)證商品是否合法。如果存在后繼處理器,則將驗(yàn)證請(qǐng)求傳遞給后繼處理器。

接下來(lái),我們可以定義三個(gè)具體的驗(yàn)證處理器,分別驗(yàn)證商品是否存在、商品庫(kù)存是否充足以及商品是否已經(jīng)下架

# 模擬
is_product_exist = True ?# 判斷商品是否存在
is_product_stock_enough = True ?# 判斷商品庫(kù)存是否充足
is_product_on_sale = True ?# 判斷商品是否已經(jīng)下架
class ProductExistValidator(CartValidator):
? ? def validate(self, item):
? ? ? ? # 判斷商品是否存在
? ? ? ? # if not is_product_exist(item):
? ? ? ? if not is_product_exist:
? ? ? ? ? ? print('商品不存在')
? ? ? ? ? ? return False
? ? ? ? return super().validate(item)

class ProductStockValidator(CartValidator):
? ? def validate(self, item):
? ? ? ? # 判斷商品庫(kù)存是否充足
? ? ? ? # if not is_product_stock_enough(item):
? ? ? ? if not is_product_stock_enough:
? ? ? ? ? ? print('庫(kù)存不足')
? ? ? ? ? ? return False
? ? ? ? return super().validate(item)

class ProductStatusValidator(CartValidator):
? ? def validate(self, item):
? ? ? ? # 判斷商品是否已經(jīng)下架
? ? ? ? # if not is_product_on_sale(item):
? ? ? ? if not is_product_on_sale:
? ? ? ? ? ? print('商品已下架')
? ? ? ? ? ? return False
? ? ? ? return super().validate(item)

product_validator_chain = ProductExistValidator(ProductStockValidator(ProductStatusValidator()))

def add_to_cart(item):
? ? if product_validator_chain.validate(item):
? ? ? ? # 添加商品到購(gòu)物車中
? ? ? ? # add_item_to_cart(item)
? ? ? ? print("添加成功", item)
? ? ? ? pass
? ? else:
? ? ? ? # 商品驗(yàn)證失敗
? ? ? ? print("商品驗(yàn)證失敗")

這三個(gè)處理器都繼承自CartValidator類,并覆蓋了validate方法,實(shí)現(xiàn)了具體的商品驗(yàn)證邏輯。如果商品驗(yàn)證通過,則調(diào)用super()
.validate(item)方法,將驗(yàn)證請(qǐng)求傳遞給下一個(gè)處理器。

最后,我們可以將這三個(gè)處理器組成一個(gè)責(zé)任鏈:

product_validator_chain = ProductExistValidator(ProductStockValidator(ProductStatusValidator()))

測(cè)試

正常測(cè)試

add_to_cart("IPhone14 pro")

輸出結(jié)果

添加成功 IPhone14 pro

庫(kù)存不足測(cè)試

# 模擬庫(kù)存不足
is_product_stock_enough = False
add_to_cart("IPhone14 pro")

輸出結(jié)果

庫(kù)存不足
商品驗(yàn)證失敗

使用場(chǎng)景

多個(gè)對(duì)象需要處理同一種請(qǐng)求,但處理的順序和方式不同。例如,一個(gè)在線商店需要對(duì)訂單進(jìn)行風(fēng)險(xiǎn)評(píng)估,評(píng)估過程包括多個(gè)步驟,如檢查訂單是否來(lái)自欺詐用戶、檢查收貨地址是否存在風(fēng)險(xiǎn)等。每個(gè)步驟可以使用一個(gè)處理器來(lái)處理,這些處理器可以組成一個(gè)責(zé)任鏈,對(duì)訂單進(jìn)行逐步風(fēng)險(xiǎn)評(píng)估。

對(duì)象不知道該由哪個(gè)處理器處理請(qǐng)求,需要?jiǎng)討B(tài)確定處理器。java中的web框架的過濾器,需要根據(jù)請(qǐng)求的URL來(lái)選擇合適的處理器,處理器可以根據(jù)自身能力來(lái)決定是否能夠處理請(qǐng)求。

動(dòng)態(tài)擴(kuò)展。在系統(tǒng)中需要?jiǎng)討B(tài)添加或刪除處理器,同時(shí)保證請(qǐng)求可以被正確處理。例如,一個(gè)安全檢查系統(tǒng)需要根據(jù)系統(tǒng)的安全策略來(lái)動(dòng)態(tài)添加或刪除安全檢查處理器,同時(shí)保證請(qǐng)求可以被正確處理。

到此這篇關(guān)于淺談Python 責(zé)任鏈模式的文章就介紹到這了,更多相關(guān)Python 責(zé)任鏈模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何利用Python matplotlib繪制雷達(dá)圖

    如何利用Python matplotlib繪制雷達(dá)圖

    這篇文章主要給大家介紹了關(guān)于如何利用Python matplotlib繪制雷達(dá)圖的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • python flask框架詳解

    python flask框架詳解

    這篇文章主要介紹了python flask框架詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • Pygame實(shí)戰(zhàn)練習(xí)之炸彈人學(xué)院游戲

    Pygame實(shí)戰(zhàn)練習(xí)之炸彈人學(xué)院游戲

    炸彈人學(xué)院想必是很多人童年時(shí)期的經(jīng)典游戲,我們依舊能記得抱個(gè)老人機(jī)娛樂的場(chǎng)景,下面這篇文章主要給大家介紹了關(guān)于如何利用python寫一個(gè)簡(jiǎn)單的炸彈人學(xué)院小游戲的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • Python3數(shù)據(jù)庫(kù)操作包pymysql的操作方法

    Python3數(shù)據(jù)庫(kù)操作包pymysql的操作方法

    這篇文章主要介紹了Python3數(shù)據(jù)庫(kù)操作包pymysql的操作方法,文章通過實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2018-07-07
  • Python如何篩選序列中的元素的方法實(shí)現(xiàn)

    Python如何篩選序列中的元素的方法實(shí)現(xiàn)

    這篇文章主要介紹了Python如何篩選序列中的元素的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • python實(shí)現(xiàn)排序算法解析

    python實(shí)現(xiàn)排序算法解析

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)排序算法的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • python利用while求100內(nèi)的整數(shù)和方式

    python利用while求100內(nèi)的整數(shù)和方式

    這篇文章主要介紹了 python利用while求100內(nèi)的整數(shù)和方式,下面文章要描述的內(nèi)容有1到100的和、1到100內(nèi)的偶數(shù)和、1到100內(nèi)的奇數(shù)和,具體詳細(xì)內(nèi)容,需要的朋友可以參考一下
    2021-11-11
  • python中super().__init__()的用法

    python中super().__init__()的用法

    python里的super().__init__()有什么作用?很多同學(xué)沒有弄清楚。super()用來(lái)調(diào)用父類(基類)的方法,__init__()是類的構(gòu)造方法,感興趣的小伙伴可以參考閱讀本文
    2023-03-03
  • python 含子圖的gif生成時(shí)內(nèi)存溢出的方法

    python 含子圖的gif生成時(shí)內(nèi)存溢出的方法

    今天小編就為大家分享一篇python 含子圖的gif生成時(shí)內(nèi)存溢出的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2019-07-07
  • Python通用循環(huán)的構(gòu)造方法實(shí)例分析

    Python通用循環(huán)的構(gòu)造方法實(shí)例分析

    這篇文章主要介紹了Python通用循環(huán)的構(gòu)造方法,結(jié)合實(shí)例形式分析了Python常見的交互循環(huán)、哨兵循環(huán)、文件循環(huán)、死循環(huán)等實(shí)現(xiàn)與處理技巧,需要的朋友可以參考下
    2018-12-12

最新評(píng)論

太保市| 胶州市| 嫩江县| 读书| 辽宁省| 两当县| 普安县| 乌拉特中旗| 定西市| 麻城市| 多伦县| 杭州市| 渝北区| 乌恰县| 黎川县| 龙山县| 土默特左旗| 东安县| 景宁| 湖口县| 疏附县| 新疆| 开化县| 瑞昌市| 怀安县| 高台县| 吉林省| 磐石市| 英吉沙县| 铅山县| 东乌珠穆沁旗| 文登市| 金乡县| 宁乡县| 盐边县| 石景山区| 鸡泽县| 龙川县| 电白县| 苍山县| 论坛|