前言

责任链模式属于行为型模式,关于行为型模式共计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)

 

参考

posted on 2024-02-17 21:03  Martin8866  阅读(7)  评论(0编辑  收藏  举报