前言
责任链模式属于行为型模式,关于行为型模式共计11种其中
解释器模式:主要用于编译器开发
命令模式:主要用于开发桌面程序的命令
迭代器模式:一种数据结构,Python中已经实现
已经脱离了当前开发需求,所以主要不在深入研究。
一、责任链模式
责任链模式应用非常广泛,可以帮我们优化if分支过多的代码。
例如:员工请假---->直线经理---->部门经理---->总经理,用户认证多重if分支判断,还有Scrapy的pipeline。
为什么在程序设计中在员工和总经理直接增加1条流程链呢?是为了避免员工请假逻辑直接和总经理这个进行耦合,不易于维护。
1.概念
使多个对象都有机会处理请求,从而避免请求发送者------》接收者之间形成直接耦合关系。
将多个对象连接成1条链,并沿着这1条链传递该请求,直到有1个对象处理请求为止。
2.角色
抽象处理者(Handler)
具体处理者(ConcreteHandler)
客户端(Client)
3.适用场景
- 有多个对象可以处理同1个请求,到底由哪个对象处理需要运行时动态决定。
- 在不明确接收者的情况下,需要向多个对象中1个提交请求。
4.优点
降低耦合度,请求发送者(Client):无需知道到底是哪1个请求处理者对象处理的当前请求。
5.代码
from abc import ABC, abstractmethod # 抽象处理者:Handler接口 class Handler(ABC): @abstractmethod def handle_leave(self, day): pass # 具体处理者 class GeneralManager(Handler): def handle_leave(self, day): if day <= 5: print(f"总经理准假{day}天") else: print("总经理:不需要Next,你还是离职吧") # 具体处理者 class DepartmentManager(Handler): def __init__(self): self.next = GeneralManager() def handle_leave(self, day): if day <= 4: print(f"部门经理准假{day}天") else: print("部门经理职权不足") self.next.handle_leave(day) # 具体处理者 class DirectManager(Handler): def __init__(self): self.next = DepartmentManager() def handle_leave(self, day): if day <= 3: print(f"直线经理准假{day}天") else: print("直线经理职权不足") self.next.handle_leave(day) # 高层代码(Client) if __name__ == '__main__': day = 350 DirectManager().handle_leave(day)
参考