责任链模式包含以下主要角色:
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/设计模式