模式定义

责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。 这种模式给予请求的类型,对请求的发送者和接收者进行解耦。

这种类型的设计模式属于行为型模式。 在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

UML类图

职责链模式

示例代码

天气冷了,小明今天起来的比较晚不想去上班了。准备给公司请个假,公司的请假流程是这样的:

0 < x < 3h 组长可以直接审批

3h < x < 48h 部门领导审批

48 < x 部门领导需要向boss汇报,让他审批

'''
代码示例

天气冷了,小明今天起来的比较晚不想去上班了。准备给公司请个假,公司的请假流程是这样的:
1:0 < x < 3h 组长可以直接审批
2:3h < x < 48h 部门领导审批
3:48 < x 部门领导需要向boss汇报,让他审批
'''

import abc


class AbsLeader(abc.ABC):

    def __init__(self):
        self._next = None

    # 请假
    @abc.abstractmethod
    def leave(self): ...

    # 下一位处理者
    @property
    def next(self):
        if (not self._next):
            raise Exception("无处理对象")
        return self._next

    @next.setter
    def next(self, process):
        self._next = process


class GroupLeader(AbsLeader):
    def leave(self, hour: float):
        if hour < 3:
            print("ok,请假组长批了")
        else:
            self.next.leave(hour)


class DepartmentLeader(AbsLeader):
    def leave(self, hour):
        if hour < 48:
            print("ok,请假部门主管批了")
        else:
            self.next.leave(hour)


class BossLeader(AbsLeader):
    def leave(self, hour):
        if hour >= 48:
            print("ok,请假boss批了")


if __name__ == "__main__":

    # 组建责任链
    groupleader = GroupLeader()
    department = DepartmentLeader()
    boos = BossLeader()

    groupleader.next = department
    department.next = boos

    # 请假1小时,组长处理
    groupleader.leave(1)

    # 请假45小时,部门处理
    groupleader.leave(45)

    # 请假66小时,boss处理
    groupleader.leave(66)
12-19 10:58