软件设计模式系列之十五——职责链模式

这篇具有很好参考价值的文章主要介绍了软件设计模式系列之十五——职责链模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 模式的定义

职责链模式(Chain of Responsibility Pattern)也称为责任链模式,是一种结构型设计模式,用于构建一条对象处理请求的责任链。在这个模式中,多个对象依次处理请求,直到其中一个对象能够处理该请求为止。职责链模式将请求的发送者和接收者解耦,允许多个对象都有机会处理请求,同时可以动态地配置责任链的顺序和组成。

职责链模式的核心思想是将请求沿着一条链传递,每个处理者都可以选择处理请求或将其传递给下一个处理者。这种方式类似于实现一个处理管道,每个管道元素可以选择执行任务或将任务传递给下一个元素。

2 举例说明

为了更好地理解职责链模式,让我们考虑一个实际的例子。审批系统。假设在一个公司中,员工可以提交报销申请,然后需要一系列审批人员逐级审批,包括直属领导、部门总监、人事部门、高层领导。每个审批人员都在自己的权限内考虑是否签字,签完之后将会继续传递给下一级审批人员。这种情况下,可以使用职责链模式来构建一个审批流程。
软件设计模式系列之十五——职责链模式
在这个示例中,每个审批人员都是责任链中的一个节点,他们可以选择批准或拒绝请求,并将请求传递给下一个审批人员,直到有人批准或拒绝为止。

3 结构

职责链模式的结构包括以下几个关键部分:
软件设计模式系列之十五——职责链模式
Handler(处理者):定义一个处理请求的接口,并包含一个指向下一个处理者的引用。处理者可以选择处理请求或将其传递给下一个处理者。

ConcreteHandler(具体处理者):实现处理请求的具体逻辑,如果自己无法处理请求,就将请求传递给下一个处理者。

Client(客户端):创建责任链并将请求发送到责任链的第一个处理者。客户端不需要知道责任链的具体结构,只需将请求发送给第一个处理者即可。

4 实现步骤

实现职责链模式时,通常遵循以下步骤:

定义处理请求的接口(Handler),并在接口中声明处理请求的方法。

创建具体处理者类(ConcreteHandler),实现处理请求的具体逻辑。每个具体处理者都需要包含一个指向下一个处理者的引用。

在具体处理者类中,实现处理请求的逻辑,并在必要时将请求传递给下一个处理者。

在客户端代码中创建责任链,并将请求发送给责任链的第一个处理者。

5 代码实现

现在,让我们通过 Java 代码来实现审批系统的职责链模式。

// 1. 定义处理请求的接口
interface Approver {
    void approveRequest(ExpenseRequest request);
}

// 2. 创建具体处理者类
class TeamLeader implements Approver {
    private Approver nextApprover;

    @Override
    public void approveRequest(ExpenseRequest request) {
        if (request.getAmount() <= 100) {
            System.out.println("Team Leader approved the expense request.");
        } else if (nextApprover != null) {
            nextApprover.approveRequest(request);
        }
    }

    public void setNextApprover(Approver nextApprover) {
        this.nextApprover = nextApprover;
    }
}

class Manager implements Approver {
    private Approver nextApprover;

    @Override
    public void approveRequest(ExpenseRequest request) {
        if (request.getAmount() <= 500) {
            System.out.println("Manager approved the expense request.");
        } else if (nextApprover != null) {
            nextApprover.approveRequest(request);
        }
    }

    public void setNextApprover(Approver nextApprover) {
        this.nextApprover = nextApprover;
    }
}

class FinanceDepartment implements Approver {
    @Override
    public void approveRequest(ExpenseRequest request) {
        System.out.println("Finance Department approved the expense request.");
    }
}

// 3. 客户端代码
public class Client {
    public static void main(String[] args) {
        Approver teamLeader = new TeamLeader();
        Approver manager = new Manager();
        Approver finance = new FinanceDepartment();

        // 构建责任链
        teamLeader.setNextApprover(manager);
        manager.setNextApprover(finance);

        // 提交报销请求
        ExpenseRequest request1 = new ExpenseRequest("John", 80);
        teamLeader.approveRequest(request1);

        ExpenseRequest request2 = new ExpenseRequest("Alice", 300);
        teamLeader.approveRequest(request2);

        ExpenseRequest request3 = new ExpenseRequest("Bob", 800);
        teamLeader.approveRequest(request3);
    }
}

6 典型应用场景

职责链模式在实际应用中有多种典型场景,以下是一些常见的应用。

审批流程:如报销审批、请假审批等,不同级别的审批人员构成责任链,依次处理请求。

事件处理:在图形用户界面(GUI)开发中,事件处理机制可以采用职责链模式,将事件从用户界面传递给各种控件,以便处理用户输入。

日志记录:不同级别的日志记录器可以组成责任链,根据日志级别决定是否记录日志以及如何记录。

异常处理:在程序中处理异常时,可以使用职责链模式来处理不同类型的异常,以便根据异常类型采取不同的处理策略。

权限控制:在系统中控制用户访问权限时,可以使用职责链模式来构建权限控制链,根据用户的权限级别逐级检查并授权。

HTTP请求处理:Web框架中的中间件(Middleware)可以使用职责链模式来处理HTTP请求,例如身份验证、日志记录、缓存等中间件可以依次处理请求。

7 优缺点

优点:

松耦合:职责链模式将请求的发送者和接收者解耦,允许多个对象都有机会处理请求,使系统更加灵活。

动态配置责任链:责任链的顺序和组成可以在运行时动态配置,不需要修改代码即可调整责任链。

可扩展性:可以轻松地添加新的处理者类,扩展责任链,不会影响现有代码。

缺点:

性能问题:如果责任链过长或者处理请求的逻辑复杂,可能会导致性能问题,因为每个请求都需要遍历整个责任链。

请求未处理:如果责任链没有正确配置或者没有合适的处理者来处理请求,可能导致请求无法被处理。

难以调试:责任链模式中,请求的处理路径可能会变得不透明,难以调试和理解。

8 类似模式

与职责链模式类似的模式包括策略模式、装饰器模式和命令模式。这些模式都有一定的相似之处,但它们各自有不同的关注点和应用场景。

策略模式(Strategy Pattern):

策略模式和职责链模式都允许动态地选择不同的对象来处理请求或任务。它们都关注于将请求发送者和接收者解耦,使系统更加灵活。策略模式关注于选择不同的算法或策略来处理特定的任务,它将不同的策略封装成独立的对象,并允许在运行时切换策略。职责链模式关注于多个对象依次处理请求,直到其中一个对象能够处理为止,每个对象都有机会处理请求。

装饰器模式(Decorator Pattern):

装饰器模式和职责链模式都允许动态地包装对象以增强其功能。它们都通过组合来实现,可以链式地将多个装饰器或处理者组合在一起。装饰器模式关注于在不改变接口的情况下增强对象的功能,通常用于为单个对象添加功能。职责链模式关注于将请求从一个对象传递到另一个对象,每个对象都可以选择处理或传递请求。

命令模式(Command Pattern):

命令模式和职责链模式都可以用于将请求的发送者和接收者解耦。它们都关注于将请求封装成对象,允许将请求传递给不同的对象。命令模式关注于将请求封装成命令对象,允许撤销和重做操作,以及延迟执行请求。职责链模式关注于多个对象依次处理请求,直到其中一个对象能够处理为止,不一定涉及命令的封装和执行。

总的来说,这些模式有一些共同之处,包括解耦请求的发送者和接收者,以及支持动态配置和组合对象。然而,它们的关注点和应用场景不同,应根据具体需求来选择合适的模式。在一些情况下,这些模式甚至可以组合使用,以实现更复杂的功能。

9 小结

职责链模式是一种有用的设计模式,它可以帮助构建灵活的责任链,使多个对象能够依次处理请求。通过将请求的发送者和接收者解耦,职责链模式可以实现松耦合的设计,允许在运行时动态配置责任链的顺序和组成。然而,需要注意在设计时考虑性能问题,确保责任链不会过长或过于复杂。职责链模式在实际应用中有多种典型场景,包括审批流程、事件处理、日志记录等。希望本文能够帮助你更好地理解和应用职责链模式。文章来源地址https://www.toymoban.com/news/detail-710114.html

到了这里,关于软件设计模式系列之十五——职责链模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 软件设计模式系列之十六——命令模式

    命令模式(Command Pattern)是一种行为型设计模式,旨在将请求发送者和接收者解耦,将一个请求封装为一个对象,从而允许您参数化客户端对象以进行不同的请求、排队请求或记录请求,并支持可撤销操作。 命令模式的核心思想是将一个请求包装成一个对象,包括请求的参数

    2024年02月08日
    浏览(33)
  • 软件设计模式系列之十八——迭代器模式

    迭代器模式是一种行为型设计模式,它允许客户端逐个访问一个聚合对象中的元素,而不暴露该对象的内部表示。迭代器模式提供了一种统一的方式来遍历不同类型的集合,使客户端代码更加简洁和可复用。 为了更好地理解迭代器模式,让我们考虑一个简单的例子:一个图书

    2024年02月08日
    浏览(38)
  • 软件设计模式系列之十三——享元模式

    享元模式(Flyweight Pattern)是一种结构型设计模式,它旨在减少内存占用或计算开销,通过共享大量细粒度对象来提高系统的性能。这种模式适用于存在大量相似对象实例,但它们的状态可以外部化(extrinsic),并且可以在多个对象之间共享的情况。 为了更好地理解享元模式

    2024年02月08日
    浏览(47)
  • 软件设计模式系列之十七——解释器模式

    解释器模式是一种行为型设计模式,它用于将一种语言或表达式解释为对象。该模式通过定义语言的文法规则,并使用解释器来解释和执行这些规则,将复杂的语言转换为对象的操作。 在软件开发中,解释器模式常用于处理类似于编程语言、查询语言、正则表达式等需要解释

    2024年02月08日
    浏览(26)
  • 软件设计模式系列之十九——中介者模式

    @ 目录 1 模式的定义 2 举例说明 3 结构 4 实现步骤 5 代码实现 6 典型应用场景 7 优缺点 8 类似模式 9 小结 中介者模式是一种行为型设计模式,它用于降低对象之间的直接通信,通过引入一个中介者对象来管理对象之间的交互。这种模式有助于减少对象之间的耦合性,使系统更

    2024年02月08日
    浏览(36)
  • 软件设计模式系列之二十五——访问者模式

    访问者模式(Visitor Pattern)是一种强大的行为型设计模式,它允许你在不改变被访问对象的类的前提下,定义新的操作和行为。本文将详细介绍访问者模式,包括其定义、举例说明、结构、实现步骤、Java代码实现、典型应用场景、优缺点、类似模式以及最后的小结。 访问者

    2024年02月08日
    浏览(77)
  • 软件工程(十五) 行为型设计模式(一)

    简要说明 通过多个对象处理的请求,减少请求的发送者与接收者之间的耦合。将接受对象 链接 起来,在链中传递请求,直到有一个对象处理这个请求。 速记 传递职责 类图如下 由类图可以比较容易的看出来,其实就是自己关联自己,形成了一个链,并且自己有不同的

    2024年02月11日
    浏览(45)
  • 设计模式-职责链模式

      将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递这个请求,直到链上的某个接收对象能够处理它为止。   这么说比较抽象,我用更加容易理解的话来进一步解读一下。   在职责链模式中,多个处理

    2024年02月04日
    浏览(36)
  • 设计模式(20)职责链模式

    一、介绍: 1、定义:责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。在责任链模式中,当一个对

    2024年02月07日
    浏览(32)
  • 设计模式之~职责链模式

    简述:         职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。这里发出这个请求的客户端并不知道这当中的哪一个对象

    2024年02月07日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包