淺談Python 責任鏈模式

介紹

責任鏈模式是一種行為型設計模式,它允許多個對象以鏈式的形式依次處理請求,直到請求被處理或者無處理對象為止

實現方式

責任鏈模式由多個處理器組成,每個處理器都可以處理一種請求。如果當前處理器無法處理請求,它將把請求傳遞給下一個處理器,直到請求被處理或者沒有處理器可以處理為止。

案例

假設我們正在開發一個電子商務平臺,現在需要實現一個購物車功能。當用戶添加商品到購物車中時,需要進行以下驗證

  • 商品是否存在
  • 商品庫存是否充足
  • 商品是否已經下架

我們可以使用責任鏈模式來實現這個購物車功能。首先定義一個處理器基類

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

這個基類包含瞭一個next_validator屬性,表示後繼處理器,以及一個validate方法,用於驗證商品是否合法。如果存在後繼處理器,則將驗證請求傳遞給後繼處理器。

接下來,我們可以定義三個具體的驗證處理器,分別驗證商品是否存在、商品庫存是否充足以及商品是否已經下架

# 模擬
is_product_exist = True  # 判斷商品是否存在
is_product_stock_enough = True  # 判斷商品庫存是否充足
is_product_on_sale = True  # 判斷商品是否已經下架
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):
        # 判斷商品是否已經下架
        # 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:
        # 商品驗證失敗
        print("商品驗證失敗")

這三個處理器都繼承自CartValidator類,並覆蓋瞭validate方法,實現瞭具體的商品驗證邏輯。如果商品驗證通過,則調用super()
.validate(item)方法,將驗證請求傳遞給下一個處理器。

最後,我們可以將這三個處理器組成一個責任鏈:

product_validator_chain = ProductExistValidator(ProductStockValidator(ProductStatusValidator()))

測試

正常測試

add_to_cart("IPhone14 pro")

輸出結果

添加成功 IPhone14 pro

庫存不足測試

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

輸出結果

庫存不足
商品驗證失敗

使用場景

多個對象需要處理同一種請求,但處理的順序和方式不同。例如,一個在線商店需要對訂單進行風險評估,評估過程包括多個步驟,如檢查訂單是否來自欺詐用戶、檢查收貨地址是否存在風險等。每個步驟可以使用一個處理器來處理,這些處理器可以組成一個責任鏈,對訂單進行逐步風險評估。

對象不知道該由哪個處理器處理請求,需要動態確定處理器。java中的web框架的過濾器,需要根據請求的URL來選擇合適的處理器,處理器可以根據自身能力來決定是否能夠處理請求。

動態擴展。在系統中需要動態添加或刪除處理器,同時保證請求可以被正確處理。例如,一個安全檢查系統需要根據系統的安全策略來動態添加或刪除安全檢查處理器,同時保證請求可以被正確處理。

到此這篇關於淺談Python 責任鏈模式的文章就介紹到這瞭,更多相關Python 責任鏈模式內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: