Python 设计模式之责任链模式

2023-04-03 00:00:00 模式 设计 责任

责任链模式是一种行为型设计模式,它允许将请求沿着处理链传递,直到有一个处理者能够处理请求为止。这种模式将请求的发送者和接收者解耦,从而使多个对象都有机会处理请求。在责任链模式中,每个处理者都有一个对下一个处理者的引用,形成一个处理链。

以下是责任链模式的实现步骤:

创建一个抽象处理者类(Handler),定义一个抽象方法来处理请求,同时持有对下一个处理者的引用。
创建具体处理者类(ConcreteHandler),实现抽象方法来处理请求,如果自己无法处理请求,则将请求转发给下一个处理者。
客户端创建一个请求,并将请求发送给第一个处理者。如果第一个处理者无法处理请求,则将请求传递给下一个处理者,直到有一个处理者处理请求为止。
下面是使用Python实现责任链模式的示例代码,使用字符串“pidancode.com”、“皮蛋编程”作为范例:

class Handler:
    def __init__(self, successor=None):
        self._successor = successor

    def handle_request(self, request):
        if self._successor is not None:
            return self._successor.handle_request(request)
        return None


class ConcreteHandlerA(Handler):
    def handle_request(self, request):
        if 'pidancode.com' in request:
            return 'Handled by ConcreteHandlerA'
        else:
            return super().handle_request(request)


class ConcreteHandlerB(Handler):
    def handle_request(self, request):
        if '皮蛋编程' in request:
            return 'Handled by ConcreteHandlerB'
        else:
            return super().handle_request(request)


if __name__ == '__main__':
    handler_a = ConcreteHandlerA()
    handler_b = ConcreteHandlerB(handler_a)

    request1 = 'www.pidancode.com'
    result1 = handler_b.handle_request(request1)
    print(result1)

    request2 = '欢迎访问皮蛋编程'
    result2 = handler_b.handle_request(request2)
    print(result2)

    request3 = 'www.google.com'
    result3 = handler_b.handle_request(request3)
    print(result3)

在这个例子中,Handler是抽象处理者类,ConcreteHandlerA和ConcreteHandlerB是具体处理者类。客户端创建了一个请求,将请求传递给ConcreteHandlerB。如果ConcreteHandlerB无法处理请求,就将请求传递给下一个处理者ConcreteHandlerA。如果ConcreteHandlerA也无法处理请求,就返回None。

在这个示例中,如果请求包含“pidancode.com”,则ConcreteHandlerA将处理请求,并返回“Handled by ConcreteHandlerA”;如果请求包含“皮蛋编程”,则ConcreteHandlerB将处理请求,并返回“Handled by ConcreteHandlerB”;如果请求既不包含“pidancode.com”也不包含“皮蛋编程”,则处理者将继续传递请求,直到有一个处理者能够处理请求为止。

相关文章