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

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

目录
相关文章
|
JavaScript 中间件 API
nuxt3:我们开始吧-开发-配置-部署(一)
nuxt3:我们开始吧-开发-配置-部署(一)
1416 0
|
存储 JSON 网络协议
阿里巴巴FastJSON使用实例
阿里巴巴FastJSON使用实例
1279 0
|
Ubuntu 网络安全
ubuntu开启/关闭防火墙
ubuntu开启/关闭防火墙
3811 0
ubuntu开启/关闭防火墙
|
3月前
|
测试技术 数据库 uml
软考中级软件设计师专项-UML图篇
UML(统一建模语言)是一种用于软件系统建模的标准化语言,能够清晰表达系统的静态结构与动态行为。其核心包括三类构造块:事物、关系和图。事物分为结构事物、行为事物、分组事物和注释事物;关系包括依赖、关联、泛化和实现;图则涵盖了类图、对象图、用例图、序列图、通信图、状态图、活动图、构件图和部署图等,分别用于静态建模、动态建模和物理建模。
399 1
软考中级软件设计师专项-UML图篇
|
Java
java基础(8)数据类型的分类
Java数据类型分为基本数据类型(8种)和引用数据类型。基本类型包括byte, short, int, long, float, double, boolean, char。每种类型有固定占用空间大小,如int占用4字节。字符编码如ASCII和Unicode用于将文字转换为计算机可识别的二进制形式。
415 2
|
网络协议
Netty实现TCP通信
Netty实现TCP通信
289 0
如何访问GitHub快的飞起?两步解决访问超时GitHub,无法访问GitHub的问题
这篇文章提供了几种方法来解决访问GitHub时速度慢或超时的问题,包括使用代理服务器、下载加速工具,以及考虑使用国内代码管理网站如码云(gitee)来加速下载GitHub上的资源。
如何访问GitHub快的飞起?两步解决访问超时GitHub,无法访问GitHub的问题
|
监控 开发者 UED
鸿蒙5.0版开发:订阅资源泄漏事件(ArkTS)
在HarmonyOS 5.0中,资源泄漏是常见问题,尤其在多线程和复杂应用逻辑下。ArkTS提供了hiAppEvent模块来订阅和处理资源泄漏事件,帮助开发者监控和优化应用性能。本文详细介绍了如何在ArkTS中订阅资源泄漏事件,并提供了示例代码。通过导入hiAppEvent和hilog模块,添加事件观察者并实现回调函数,可以在资源泄漏事件发生时进行自定义处理,如记录日志、发送通知或执行资源清理操作。
275 4
|
安全
如何设置Burpsuite中的代理,及安装安全证书
如何设置Burpsuite中的代理,及安装安全证书
335 0
|
算法 计算机视觉
OpenCV4图像处理-图像交互式分割-GrabCut
1.理论介绍 用户指定前景的大体区域,剩下为背景区域,还可以明确指出某些地方为前景或者背景,GrabCut算法采用分段迭代的方法分析前景物体形成模型树,最后根据权重决定某个像素是前景还是背景。
282 0

热门文章

最新文章