行为型设计模式-责任链(chain of responsibility)模式-python实现

设计模式汇总:查看

通俗示例

想象一下你在一个客服中心工作,当一个客户的问题提交给客服中心时,这个问题可能会被第一个可用的客服人员处理。如果这位客服人员无法解决问题,那么问题会被转发给更高级别的客服。这个过程可能会一直持续到问题被解决或者达到最高级别的支持。这种处理问题的方式就是一个责任链的例子。

通俗解释

责任链模式是一种行为型设计模式,它允许将请求沿着处理者链进行传递,直到有一个处理者能够处理它为止。在责任链模式中,多个对象都有机会处理请求,将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它或者请求到达链的末端。

责任链模式的组成包括:

  • 处理者(Handler):定义处理请求的接口,通常还包含一个指向下一个处理者的引用。
  • 具体处理者(Concrete Handler):处理它所负责的请求,如果无法处理,则将请求传递给链中的下一个处理者。

责任链模式的优点

  • 降低耦合度:请求的发送者和接收者之间无需知道对方的详细信息。
  • 增加灵活性:可以动态地添加或者删除处理者,无需修改现有代码。
  • 增强可扩展性:可以很容易地扩展新的处理者类。

Python代码示例

以下是一个责任链模式的简单实现:

python 复制代码
class Manager:
    """经理类"""
    successor = None
    name = ''

    def __init__(self, name):
        self.name = name

    def setSuccessor(self, successor):
        # 设置上级
        self.successor = successor

    def handleRequest(self, request):
        # 处理请求
        pass


class LineManager(Manager):
    """直属经理"""
    def handleRequest(self, request):
        if request.requestType == 'DaysOff' and request.number <= 3:
            return '%s:%s Num:%d Accepted OVER' % (self.name, request.requestContent, request.number)
        else:
            print('%s:%s Num:%d Accepted CONTINUE' % (self.name, request.requestContent, request.number))
            if self.successor is not None:
                return self.successor.handleRequest(request)


class DepartmentManager(Manager):
    """部门经理"""
    def handleRequest(self, request):
        if request.requestType == 'DaysOff' and request.number <= 7:
            return '%s:%s Num:%d Accepted OVER' % (self.name, request.requestContent, request.number)
        else:
            print('%s:%s Num:%d Accepted CONTINUE' % (self.name, request.requestContent, request.number))
            if self.successor is not None:
                return self.successor.handleRequest(request)


class GeneralManager(Manager):
    """总经理"""
    def handleRequest(self, request):
        if request.requestType == 'DaysOff':
            return '%s:%s Num:%d Accepted OVER' % (self.name, request.requestContent, request.number)


class Request:
    """
    请求类,用于封装请求信息和处理请求。

    Attributes:
        requestType: 请求的类型。
        requestContent: 请求的内容。
        number: 请求的编号,默认为0。
    """

    def __init__(self, requestType, requestContent, number=0):
        """
        初始化请求对象。

        Args:
            requestType: 请求的类型。
            requestContent: 请求的内容。
            number: 请求的编号,默认为0。
        """
        self.requestType = requestType
        self.requestContent = requestContent
        self.number = number

    def commit(self, generalManager):
        """
        提交请求,由请求者调用,将请求交给管理者处理。

        Args:
            generalManager: 管理者对象,用于处理请求。

        Returns:
            处理请求后的返回值。
        """
        ret = generalManager.handleRequest(self)
        print(ret)
        return ret


# 当模块作为主程序运行时,以下代码块将被执行
if __name__ == '__main__':
    # 创建一线经理、部门经理和总经理的实例
    line_manager = LineManager('LINE MANAGER')
    department_manager = DepartmentManager('DEPARTMENT MANAGER')
    general_manager = GeneralManager('GENERAL MANAGER')

    # 设置一线经理的继任者为部门经理,部门经理的继任者为总经理
    line_manager.setSuccessor(department_manager)
    department_manager.setSuccessor(general_manager)

    # 创建请假申请实例并提交给一线经理审批
    # 申请一天假期
    request = Request(requestContent="'Ask 1 day off'", requestType='DaysOff', number=1)
    request.commit(line_manager)

    # 创建请假申请实例并提交给一线经理审批
    # 申请五天假期
    request = Request(requestContent="'Ask 5 day off'", requestType='DaysOff', number=5)
    request.commit(line_manager)

    # 创建请假申请实例并提交给一线经理审批
    # 申请十天假期
    request = Request(requestContent="'Ask 10 day off'", requestType='DaysOff', number=10)
    request.commit(line_manager)

总结

责任链模式通过将请求的发送者和接收者解耦,允许动态地构建处理者链,使得请求可以在多个对象之间传递,直到被处理。这种方式特别适用于那些需要多个对象共同处理一个请求的场景,比如异常处理、工作流处理等。

相关推荐
API快乐传递者1 小时前
淘宝反爬虫机制的主要手段有哪些?
爬虫·python
阡之尘埃3 小时前
Python数据分析案例61——信贷风控评分卡模型(A卡)(scorecardpy 全面解析)
人工智能·python·机器学习·数据分析·智能风控·信贷风控
捕鲸叉5 小时前
MVC(Model-View-Controller)模式概述
开发语言·c++·设计模式
wrx繁星点点5 小时前
享元模式:高效管理共享对象的设计模式
java·开发语言·spring·设计模式·maven·intellij-idea·享元模式
凉辰6 小时前
设计模式 策略模式 场景Vue (技术提升)
vue.js·设计模式·策略模式
菜菜-plus6 小时前
java设计模式之策略模式
java·设计模式·策略模式
暗黑起源喵6 小时前
设计模式-迭代器
设计模式
丕羽6 小时前
【Pytorch】基本语法
人工智能·pytorch·python
bryant_meng6 小时前
【python】Distribution
开发语言·python·分布函数·常用分布
lexusv8ls600h7 小时前
微服务设计模式 - 网关路由模式(Gateway Routing Pattern)
spring boot·微服务·设计模式