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

总结

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

相关推荐
岑梓铭13 分钟前
(CentOs系统虚拟机)Standalone模式下安装部署“基于Python编写”的Spark框架
linux·python·spark·centos
shinelord明22 分钟前
【再谈设计模式】享元模式~对象共享的优化妙手
开发语言·数据结构·算法·设计模式·软件工程
游客52027 分钟前
opencv中的各种滤波器简介
图像处理·人工智能·python·opencv·计算机视觉
Eric.Lee202130 分钟前
moviepy将图片序列制作成视频并加载字幕 - python 实现
开发语言·python·音视频·moviepy·字幕视频合成·图像制作为视频
Dontla35 分钟前
vscode怎么设置anaconda python解释器(anaconda解释器、vscode解释器)
ide·vscode·python
qq_529025291 小时前
Torch.gather
python·深度学习·机器学习
数据小爬虫@1 小时前
如何高效利用Python爬虫按关键字搜索苏宁商品
开发语言·爬虫·python
Cachel wood2 小时前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架
終不似少年遊*2 小时前
pyecharts
python·信息可视化·数据分析·学习笔记·pyecharts·使用技巧
Python之栈2 小时前
【无标题】
数据库·python·mysql