1 概述
使多个对象有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象链成一条链,并沿着这条链传递该请求,直至有一个对象处理它为止
生活中的实例:公司员工请假的处理流程:
如果请假小于等于三天,可以找项目经理请假
请假小于等于五天,可以找部门经理请假
请假小于等于十天,可以找总经理请假
对于请假这个类,定义一个处理器请假的接口类,总经理,部门经理和项目经理都要继承这个接口,在运行时决定哪个类处理这个请求
角色
- 抽象处理者
- 具体处理者
- 客户端
优势
- 有多个对象可以处理同一个请求,哪个对象处理由运行时决定
- 在不明确接收者的情况下,向多个对象中的一个提交一个请求,一般都是把请求给到第一个级别的类,比如请假的例子,把所有请假信息先给项目经理
- 降低耦合度:一个对象无需知道是其他哪个对象处理其请求
2 代码实现
from abc import ABCMeta,abstractmethod
class Handler(metaclass=ABCMeta):
@abstractmethod
def handle_leave(self,day):
pass
class GeneralManager(Handler):
def handle_leave(self,day):
if day <= 10:
print("总经理准假%d天"%day)
else:
print("你还是辞职吧")
class DepartmentManager(Handler):
def __init__(self):
self.next = GeneralManager()
def handle_leave(self,day):
if day <= 5:
print("部门经理准假%d天"%day)
else:
print("部门经理职权不足")
self.next.handle_leave(day)
class ProjectManager(Handler):
def __init__(self):
self.next = DepartmentManager()
def handle_leave(self,day):
if day <= 3:
print("项目经理准假%d天"%day)
else:
print("项目经理职权不足")
self.next.handle_leave(day)
pm = ProjectManager()
pm.handle_leave(3)
print(" ")
pm.handle_leave(7)
print(" ")
pm.handle_leave(11)
"""
OUT:
项目经理准假3天
项目经理职权不足
部门经理职权不足
总经理准假7天
项目经理职权不足
部门经理职权不足
你还是辞职吧
"""