• python 职责链模式


    模式定义

    责任链模式(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)
  • 相关阅读:
    CC学iOS杂记 001_Device
    低字节序和高字节序相互转换(Little Endian/Big Endian)
    wpf 控件复制 克隆
    压缩图片
    网络流转换为Byte数组
    JS屏蔽右键菜单,复制,粘帖xxxxx........
    记录详细错误信息
    Media Queries详解--转
    解决 asp.net 伪静态 IIS设置后 直正HTML无法显示的问题
    对C#泛型实例化对像--转
  • 原文地址:https://www.cnblogs.com/whnba/p/12013681.html
Copyright © 2020-2023  润新知