责任链模式(Chain of Responsibility Pattern)

简介: 责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。在责任链模式中,请求沿着一个链传递,直到有一个对象处理它为止。

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。在责任链模式中,请求沿着一个链传递,直到有一个对象处理它为止。

在责任链模式中,通常有两种角色:请求者和处理者。请求者是发出请求的对象,处理者是处理请求的对象。处理者通常是一个抽象类或接口,它包含一个处理请求的方法和一个指向下一个处理者的引用。具体处理者是实现了处理请求方法的对象,它可以决定是否处理请求,如果不能处理,则将请求传递给下一个处理者。

下面是一个简单的责任链模式的Demo,假设有一个请假系统,可以通过责任链模式来实现请假审批流程:

# 处理者接口
class Approver:
    def set_next(self, next_approver):
        pass

    def process_request(self, request):
        pass

# 具体处理者类
class TeamLeader(Approver):
    def __init__(self):
        self._next_approver = None

    def set_next(self, next_approver):
        self._next_approver = next_approver

    def process_request(self, request):
        if request.get_days() < 3:
            print("Team leader approved the request")
            return True
        elif self._next_approver:
            return self._next_approver.process_request(request)
        else:
            return False

class DepartmentManager(Approver):
    def __init__(self):
        self._next_approver = None

    def set_next(self, next_approver):
        self._next_approver = next_approver

    def process_request(self, request):
        if request.get_days() < 7:
            print("Department manager approved the request")
            return True
        elif self._next_approver:
            return self._next_approver.process_request(request)
        else:
            return False

class CEO(Approver):
    def __init__(self):
        self._next_approver = None

    def set_next(self, next_approver):
        self._next_approver = next_approver

    def process_request(self, request):
        if request.get_days() < 14:
            print("CEO approved the request")
            return True
        elif self._next_approver:
            return self._next_approver.process_request(request)
        else:
            return False

# 请求类
class LeaveRequest:
    def __init__(self, days):
        self._days = days

    def get_days(self):
        return self._days

# 客户端代码
team_leader = TeamLeader()
department_manager = DepartmentManager()
ceo = CEO()

team_leader.set_next(department_manager)
department_manager.set_next(ceo)

request1 = LeaveRequest(2)
request2 = LeaveRequest(5)
request3 = LeaveRequest(10)
request4 = LeaveRequest(20)

team_leader.process_request(request1)
team_leader.process_request(request2)
team_leader.process_request(request3)
team_leader.process_request(request4)

在这个Demo中,Approver是处理者接口,定义了处理请求的方法和指向下一个处理者的引用。TeamLeader、DepartmentManager和CEO是具体处理者类,实现了处理者接口,负责具体的业务逻辑。LeaveRequest是请求类,包含请假天数的属性。客户端代码组装了处理者链,然后向处理者链发出请求。

当客户端使用责任链模式时,需要先定义一个处理者接口和一个具体处理者类。具体处理者类负责实现处理者接口,它包含了一个指向下一个处理者的引用,并实现了处理请求方法来处理具体的请求。请求类负责封装请求的数据。客户端代码则组装处理者链,并向处理者链发出请求。

责任链模式的应用场景非常广泛,例如:

  1. Web开发中的过滤器:在Web开发中,可以使用责任链模式来实现过滤器,例如过滤请求、过滤响应等。
  2. Java Exception机制:Java Exception机制中的异常处理机制就是一种责任链模式,当一个异常被抛出时,会按照一定的顺序依次尝试处理它,直到被处理或者没有处理者为止。
  3. Android事件分发机制:Android中的事件分发机制也是一种责任链模式,当一个事件发生时,会按照特定的顺序依次传递给各个View进行处理,直到被处理或者没有View可以处理为止。

以下是关于责任链模式的一些推荐资源:

1.《设计模式:可复用面向对象软件的基础》(原书名:Design Patterns: Elements of Reusable Object-Oriented Software),Gang of Four等著,是责任链模式的经典参考书之一。

2.《Head First设计模式》(原书名:Head First Design Patterns),Eric Freeman等著,是一本通俗易懂的设计模式入门书籍,其中介绍了责任链模式以及其他设计模式的基本理念和实现方法。

3.《大话设计模式》(原书名:大话设计模式),程杰著,是一本通俗易懂的设计模式入门书籍,其中介绍了责任链模式以及其他设计模式的基本理念和实现方法。

以下是一些关于责任链模式的推荐文章和博客:

1.《深入理解Java设计模式之责任链模式》:这是一篇深入浅出的介绍责任链模式的博客文章,其中包含了责任链模式的基本概念、实现方式以及应用场景等内容。

2.《什么是责任链模式?如何使用它?》:这是一篇介绍责任链模式基本概念和实现方式的博客文章,适合初学者阅读。

3.《设计模式之责任链模式》:这是一篇介绍责任链模式基本概念和实现方式的博客文章,其中包含了一些实际应用案例,适合了解责任链模式的读者阅读。

希望这些推荐资料可以帮助你更好地了解责任链模式的基本概念和实现方式。

目录
相关文章
|
5天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
16天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1316 5
|
3天前
|
监控 JavaScript Java
基于大模型技术的反欺诈知识问答系统
随着互联网与金融科技发展,网络欺诈频发,构建高效反欺诈平台成为迫切需求。本文基于Java、Vue.js、Spring Boot与MySQL技术,设计实现集欺诈识别、宣传教育、用户互动于一体的反欺诈系统,提升公众防范意识,助力企业合规与用户权益保护。
|
15天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
1372 87
|
3天前
|
JavaScript Java 大数据
基于JavaWeb的销售管理系统设计系统
本系统基于Java、MySQL、Spring Boot与Vue.js技术,构建高效、可扩展的销售管理平台,实现客户、订单、数据可视化等全流程自动化管理,提升企业运营效率与决策能力。
|
4天前
|
弹性计算 安全 数据安全/隐私保护
2025年阿里云域名备案流程(新手图文详细流程)
本文图文详解阿里云账号注册、服务器租赁、域名购买及备案全流程,涵盖企业实名认证、信息模板创建、域名备案提交与管局审核等关键步骤,助您快速完成网站上线前的准备工作。
211 82
2025年阿里云域名备案流程(新手图文详细流程)