在 Python 中,Chain of Responsibility Pattern 是一种常用的设计模式。它是一种行为性模式,通常被用于处理多个对象之间的请求。该模式可以帮助我们更好地组织代码,提高程序的灵活性和可维护性。下面我们将通过一个例子来说明 Chain of Responsibility Pattern 的应用。
假设我们正在开发一个电商网站,这个网站需要处理用户的订单请求。用户可以选择不同的付款方式来支付订单,比如信用卡、支付宝和微信支付等。我们需要设计一个程序,用于处理用户的订单请求,并选择合适的付款方式进行支付。
【资料图】
我们首先定义一个订单类 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,它是一个抽象类,用于处理付款请求。每个付款处理器类都应该实现一个 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,它们分别用于处理信用卡、支付宝和微信支付的请求。每个具体的付款处理器类都实现了 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,并实现了 process 方法。如果处理器无法处理当前订单的付款方式,则将请求传递给下一个处理器,直到有一个处理器能够处理为止。
接下来我们需要组织具体的付款处理器类,形成一个链式结构。我们可以使用一个简单的函数来实现这个过程。首先我们创建所有具体的付款处理器类的实例,然后按照它们能够处理的付款方式的顺序依次链接它们。
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
在这个函数中,我们创建了 CreditCardPaymentHandler、AlipayPaymentHandler 和 WeChatPaymentHandler 三个具体的付款处理器类的实例,并将它们链接在一起,形成一个链式结构。
现在我们可以使用这个链式结构来处理用户的订单请求了。例如:
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)
这个程序将输出如下内容:
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,用于处理付款请求,并创建了具体的付款处理器类 CreditCardPaymentHandler、AlipayPaymentHandler 和 WeChatPaymentHandler,用于处理不同的付款方式。我们将这些处理器类链接起来,形成一个链式结构。当用户发起订单请求时,我们将其传递给链式结构的第一个处理器类,如果这个处理器类无法处理当前请求,则将其传递给下一个处理器类,直到有一个处理器类能够处理为止。这个模式可以帮助我们更好地组织代码,提高程序的灵活性和可维护性。