淺談Python 責(zé)任鏈模式
介紹
責(zé)任鏈模式是一種行為型設(shè)計(jì)模式,它允許多個(gè)對象以鏈?zhǔn)降男问揭来翁幚碚埱?,直到請求被處理或者無處理對象為止
實(shí)現(xiàn)方式
責(zé)任鏈模式由多個(gè)處理器組成,每個(gè)處理器都可以處理一種請求。如果當(dāng)前處理器無法處理請求,它將把請求傳遞給下一個(gè)處理器,直到請求被處理或者沒有處理器可以處理為止。
案例
假設(shè)我們正在開發(fā)一個(gè)電子商務(wù)平臺(tái),現(xiàn)在需要實(shí)現(xiàn)一個(gè)購物車功能。當(dāng)用戶添加商品到購物車中時(shí),需要進(jìn)行以下驗(yàn)證
- 商品是否存在
- 商品庫存是否充足
- 商品是否已經(jīng)下架
我們可以使用責(zé)任鏈模式來實(shí)現(xiàn)這個(gè)購物車功能。首先定義一個(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)證請求傳遞給后繼處理器。
接下來,我們可以定義三個(gè)具體的驗(yàn)證處理器,分別驗(yàn)證商品是否存在、商品庫存是否充足以及商品是否已經(jīng)下架
# 模擬 is_product_exist = True ?# 判斷商品是否存在 is_product_stock_enough = True ?# 判斷商品庫存是否充足 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): ? ? ? ? # 判斷商品庫存是否充足 ? ? ? ? # if not is_product_stock_enough(item): ? ? ? ? if not is_product_stock_enough: ? ? ? ? ? ? print('庫存不足') ? ? ? ? ? ? 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): ? ? ? ? # 添加商品到購物車中 ? ? ? ? # 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)證請求傳遞給下一個(gè)處理器。
最后,我們可以將這三個(gè)處理器組成一個(gè)責(zé)任鏈:
product_validator_chain = ProductExistValidator(ProductStockValidator(ProductStatusValidator()))
測試
正常測試
add_to_cart("IPhone14 pro")
輸出結(jié)果
添加成功 IPhone14 pro
庫存不足測試
# 模擬庫存不足 is_product_stock_enough = False add_to_cart("IPhone14 pro")
輸出結(jié)果
庫存不足
商品驗(yàn)證失敗
使用場景
多個(gè)對象需要處理同一種請求,但處理的順序和方式不同。例如,一個(gè)在線商店需要對訂單進(jìn)行風(fēng)險(xiǎn)評估,評估過程包括多個(gè)步驟,如檢查訂單是否來自欺詐用戶、檢查收貨地址是否存在風(fēng)險(xiǎn)等。每個(gè)步驟可以使用一個(gè)處理器來處理,這些處理器可以組成一個(gè)責(zé)任鏈,對訂單進(jìn)行逐步風(fēng)險(xiǎn)評估。
對象不知道該由哪個(gè)處理器處理請求,需要?jiǎng)討B(tài)確定處理器。java中的web框架的過濾器,需要根據(jù)請求的URL來選擇合適的處理器,處理器可以根據(jù)自身能力來決定是否能夠處理請求。
動(dòng)態(tài)擴(kuò)展。在系統(tǒng)中需要?jiǎng)討B(tài)添加或刪除處理器,同時(shí)保證請求可以被正確處理。例如,一個(gè)安全檢查系統(tǒng)需要根據(jù)系統(tǒng)的安全策略來動(dòng)態(tài)添加或刪除安全檢查處理器,同時(shí)保證請求可以被正確處理。
到此這篇關(guān)于淺談Python 責(zé)任鏈模式的文章就介紹到這了,更多相關(guān)Python 責(zé)任鏈模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
VSCODE配置Markdown及Markdown基礎(chǔ)語法詳解
這篇文章主要介紹了VSCODE配置Markdown及Markdown基礎(chǔ)語法詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01Python?pyecharts實(shí)時(shí)畫圖自定義可視化經(jīng)緯度熱力圖
這篇文章主要為大家介紹了Python?pyecharts實(shí)時(shí)畫圖自定義經(jīng)緯度熱力圖實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06tensorflow 重置/清除計(jì)算圖的實(shí)現(xiàn)
今天小編就為大家分享一篇tensorflow 重置/清除計(jì)算圖的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01PyQt5高級界面控件之QTableWidget的具體使用方法
這篇文章主要介紹了PyQt5高級界面控件之QTableWidget的具體使用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02python使用jenkins發(fā)送企業(yè)微信通知的實(shí)現(xiàn)
公司使用的是企業(yè)微信,因此考慮Jenkins通知企業(yè)微信機(jī)器人的實(shí)現(xiàn)方式,本文主要介紹了python使用jenkins發(fā)送企業(yè)微信通知的實(shí)現(xiàn),感興趣的可以了解一下2021-06-06python調(diào)用接口的4種方式代碼實(shí)例
這篇文章主要介紹了python調(diào)用接口的4種方式代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11