行为型设计模式-责任链(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)

总结

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

相关推荐
姑苏老陈8 分钟前
【Python基础】Python文件处理
开发语言·python·python文件操作
yukai0800816 分钟前
Python 全栈系列271 微服务踩坑记
python·微服务·php
学步_技术36 分钟前
Python编码系列—Python工厂方法模式:构建灵活对象的秘诀
开发语言·python·工厂方法模式
kimloner37 分钟前
工厂模式(二):工厂方法模式
java·设计模式·工厂方法模式
秋秋秋叶1 小时前
Python学习——【2.3】for循环
python·学习
会发paper的学渣1 小时前
python 单例模式实现
开发语言·python·单例模式
学步_技术1 小时前
Python编码系列—Python桥接模式:连接抽象与实现的桥梁
开发语言·python·桥接模式
柴华松1 小时前
GPU训练代码
开发语言·python
Echo_Lee01 小时前
C#与Python脚本使用共享内存通信
开发语言·python·c#
python之行2 小时前
python 环境问题
开发语言·python