一分钟了解python的责任链模式 今日视点

2023-04-25 07:16:26

在 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,用于处理不同的付款方式。我们将这些处理器类链接起来,形成一个链式结构。当用户发起订单请求时,我们将其传递给链式结构的第一个处理器类,如果这个处理器类无法处理当前请求,则将其传递给下一个处理器类,直到有一个处理器类能够处理为止。这个模式可以帮助我们更好地组织代码,提高程序的灵活性和可维护性。

关闭
精彩放送