责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它通过一条处理链来处理请求,请求沿着链传递,直到有一个处理者能够处理它为止。责任链模式允许多个对象都有机会处理请求,而无需显式指定处理者。

责任链模式包含以下主要角色:

1. 处理者接口(Handler): 定义了处理请求的接口,通常包含一个指向下一个处理者的引用。

2. 具体处理者类(ConcreteHandler): 实现了处理者接口,负责处理请求。如果它能够处理请求,则处理之;否则,将请求传递给下一个处理者。

3. 客户端(Client): 创建责任链,并向责任链中的第一个处理者发送请求。

下面是一个简单的责任链模式的例子,假设有一个报销系统,需要按照一定规则来审批报销请求:
# 处理者接口
class Approver:
    def set_next_approver(self, next_approver):
        pass

    def process_request(self, amount):
        pass

# 具体处理者类
class Manager(Approver):
    def set_next_approver(self, next_approver):
        self._next_approver = next_approver

    def process_request(self, amount):
        if amount <= 1000:
            print(f"Manager approves the request for ${amount}")
        elif self._next_approver:
            self._next_approver.process_request(amount)
        else:
            print("Request cannot be approved.")

class Director(Approver):
    def set_next_approver(self, next_approver):
        self._next_approver = next_approver

    def process_request(self, amount):
        if amount <= 5000:
            print(f"Director approves the request for ${amount}")
        elif self._next_approver:
            self._next_approver.process_request(amount)
        else:
            print("Request cannot be approved.")

class VicePresident(Approver):
    def set_next_approver(self, next_approver):
        self._next_approver = next_approver

    def process_request(self, amount):
        if amount <= 10000:
            print(f"Vice President approves the request for ${amount}")
        elif self._next_approver:
            self._next_approver.process_request(amount)
        else:
            print("Request cannot be approved.")

# 客户端代码
if __name__ == "__main__":
    # 创建具体处理者对象
    manager = Manager()
    director = Director()
    vice_president = VicePresident()

    # 设置处理者链
    manager.set_next_approver(director)
    director.set_next_approver(vice_president)

    # 向处理者链发送请求
    manager.process_request(800)
    manager.process_request(4500)
    manager.process_request(12000)

在上述示例中,Approver 是处理者接口,Manager、Director、VicePresident 是具体处理者类。客户端代码创建具体处理者对象,并通过 set_next_approver 方法设置处理者链。然后,客户端向处理者链的第一个处理者发送请求,请求会沿着链传递,直到找到能够处理请求的处理者为止。

责任链模式的优点在于它可以动态地组织处理者链,灵活地添加、删除或修改处理者,而无需修改客户端代码。这种模式特别适用于处理复杂的请求处理逻辑,使得每个处理者专注于处理自己擅长的部分。


转载请注明出处:http://www.pingtaimeng.com/article/detail/11851/设计模式