一分鐘了解python的責任鏈模式
在 Python 中,Chain of Responsibility Pattern 是一種常用的設計模式。它是一種行為性模式,通常被用于處理多個對象之間的請求。該模式可以幫助我們更好地組織代碼,提高程序的靈活性和可維護性。下面我們將通過一個例子來說明 Chain of Responsibility Pattern 的應用。
?假設我們正在開發(fā)一個電商網(wǎng)站,這個網(wǎng)站需要處理用戶的訂單請求。用戶可以選擇不同的付款方式來支付訂單,比如信用卡、支付寶和微信支付等。我們需要設計一個程序,用于處理用戶的訂單請求,并選擇合適的付款方式進行支付。
?我們首先定義一個訂單類 Order,它包含一些基本的訂單信息,比如訂單編號、訂單金額和付款方式等。
class Order:
? ? def __init__(self, order_number, amount, payment_method):
? ? ? ? self.order_number = order_number
? ? ? ? self.amount = amount
? ? ? ? self.payment_method = payment_method
我們接下來定義一個付款處理器類 PaymentHandler,它是一個抽象類,用于處理付款請求。每個付款處理器類都應該實現(xiàn)一個 process 方法,用于處理付款請求。
from abc import ABC, abstractmethod
?class PaymentHandler(ABC):
? ? def __init__(self, successor=None):
? ? ? ? self.successor = successor
? ? ?@abstractmethod
? ? def process(self, order):
? ? ? ? pass
接下來我們定義具體的付款處理器類 CreditCardPaymentHandler、AlipayPaymentHandler 和 WeChatPaymentHandler,它們分別用于處理信用卡、支付寶和微信支付的請求。每個具體的付款處理器類都實現(xiàn)了 process 方法,用于處理付款請求。
class CreditCardPaymentHandler(PaymentHandler):
? ? def process(self, order):
? ? ? ? if order.payment_method == 'Credit Card':
? ? ? ? ? ? print(f"Payment processed with credit card. Order number: {order.order_number}")
? ? ? ? elif self.successor is not None:
? ? ? ? ? ? self.successor.process(order)
?class AlipayPaymentHandler(PaymentHandler):
? ? def process(self, order):
? ? ? ? if order.payment_method == 'Alipay':
? ? ? ? ? ? print(f"Payment processed with Alipay. Order number: {order.order_number}")
? ? ? ? elif self.successor is not None:
? ? ? ? ? ? self.successor.process(order)
?class WeChatPaymentHandler(PaymentHandler):
? ? def process(self, order):
? ? ? ? if order.payment_method == 'WeChat':
? ? ? ? ? ? print(f"Payment processed with WeChat. Order number: {order.order_number}")
? ? ? ? elif self.successor is not None:
? ? ? ? ? ? self.successor.process(order)
注意,每個具體的付款處理器類都繼承自抽象類 PaymentHandler,并實現(xiàn)了 process 方法。如果處理器無法處理當前訂單的付款方式,則將請求傳遞給下一個處理器,直到有一個處理器能夠處理為止。
?接下來我們需要組織具體的付款處理器類,形成一個鏈式結(jié)構。我們可以使用一個簡單的函數(shù)來實現(xiàn)這個過程。首先我們創(chuàng)建所有具體的付款處理器類的實例,然后按照它們能夠處理的付款方式的順序依次鏈接它們。
def create_chain():
? ? credit_card_handler = CreditCardPaymentHandler()
? ? alipay_handler = AlipayPaymentHandler()
? ? wechat_handler = WeChatPaymentHandler()
? ? credit_card_handler.successor = alipay_handler
? ? alipay_handler.successor = wechat_handler
? ? return credit_card_handler
在這個函數(shù)中,我們創(chuàng)建了 CreditCardPaymentHandler、AlipayPaymentHandler 和 WeChatPaymentHandler 三個具體的付款處理器類的實例,并將它們鏈接在一起,形成一個鏈式結(jié)構。
?現(xiàn)在我們可以使用這個鏈式結(jié)構來處理用戶的訂單請求了。例如:
chain = create_chain()
order1 = Order("0001", 50, "Credit Card")
order2 = Order("0002", 100, "Alipay")
order3 = Order("0003", 150, "WeChat")
chain.process(order1)
chain.process(order2)
chain.process(order3)
這個程序?qū)⑤敵鋈缦聝?nèi)容:
Payment processed with credit card. Order number: 0001
Payment processed with Alipay. Order number: 0002
Payment processed with WeChat. Order number: 0003
這個例子中,我們使用 Chain of Responsibility Pattern 來處理用戶的訂單請求。我們定義了一個抽象類 PaymentHandler,用于處理付款請求,并創(chuàng)建了具體的付款處理器類 CreditCardPaymentHandler、AlipayPaymentHandler 和 WeChatPaymentHandler,用于處理不同的付款方式。我們將這些處理器類鏈接起來,形成一個鏈式結(jié)構。當用戶發(fā)起訂單請求時,我們將其傳遞給鏈式結(jié)構的第一個處理器類,如果這個處理器類無法處理當前請求,則將其傳遞給下一個處理器類,直到有一個處理器類能夠處理為止。這個模式可以幫助我們更好地組織代碼,提高程序的靈活性和可維護性。