设计模式之责任链模式

文章目录

责任链模式(Chain of Responsibility)

问题

在某些情况下,一个请求需要在多个对象之间传递,每个对象都可能处理该请求或将其传递给下一个对象。在这种情况下,需要避免将发送者与接收者之间的耦合,以及确定请求的处理方式。问题在于如何设计一个机制,使得多个对象都有机会处理请求,而且可以根据需要动态地改变它们之间的顺序和职责。

解决方案

责任链模式提供了一种通过一系列处理对象来处理请求的方法。每个处理对象都包含一个对下一个处理对象的引用,形成一个链式结构。当一个请求到达时,它首先被传递给链中的第一个处理对象,如果该对象不能处理该请求,它会将请求传递给下一个处理对象,依此类推,直到找到能够处理请求的对象为止。

责任链模式的解决方案包括以下关键点:

  • 定义一个抽象处理者(Handler)类,该类包含一个对下一个处理者的引用,并声明一个处理请求的方法。
  • 具体的处理者类继承自抽象处理者类,实现处理请求的方法。在该方法中,处理者可以决定是否处理请求,如果不能处理,则将请求传递给下一个处理者。
  • 客户端创建一个处理链,将处理者按照一定的顺序连接起来。

效果:

责任链模式的应用可以带来多个效果:

  • 降低耦合度:发送者不需要知道哪个对象会处理请求,只需将请求发送到链的起始点
  • 灵活性:可以根据需要动态地改变处理链中处理者的顺序,以及每个处理者的职责。
  • 可扩展性:可以很容易地添加新的处理者,而不会影响现有代码。
  • 可维护性:每个处理者关注单一的责任,使得代码更易于理解和维护。

然而,责任链模式也有一些潜在的限制,比如可能导致请求无法被处理或者处理链太长而导致性能问题。因此,在使用责任链模式时需要谨慎权衡权衡利弊。

总之,责任链模式是一种有助于将请求与处理者解耦,并支持动态调整处理顺序和职责的设计模式。

代码实例

java 复制代码
// 首先,我们需要创建一个表示请求的类 ReimbursementRequest
public class ReimbursementRequest {
    private double amount;
    private String description;

    public ReimbursementRequest(double amount, String description) {
        this.amount = amount;
        this.description = description;
    }

    public double getAmount() {
        return amount;
    }

    public String getDescription() {
        return description;
    }
}
// 然后,创建一个抽象处理者类 ReimbursementHandler
public abstract class ReimbursementHandler {
    protected ReimbursementHandler successor;

    public void setSuccessor(ReimbursementHandler successor) {
        this.successor = successor;
    }

    public abstract void handleRequest(ReimbursementRequest request);
}

// 接下来,实现具体的处理者类:经理、部门主管和财务部门处理者。
public class ManagerHandler extends ReimbursementHandler {
    @Override
    public void handleRequest(ReimbursementRequest request) {
        if (request.getAmount() <= 1000) {
            System.out.println("经理处理报销请求:" + request.getDescription());
        } else if (successor != null) {
            successor.handleRequest(request);
        }
    }
}

public class DepartmentHeadHandler extends ReimbursementHandler {
    @Override
    public void handleRequest(ReimbursementRequest request) {
        if (request.getAmount() <= 5000) {
            System.out.println("部门主管处理报销请求:" + request.getDescription());
        } else if (successor != null) {
            successor.handleRequest(request);
        }
    }
}

public class FinanceHandler extends ReimbursementHandler {
    @Override
    public void handleRequest(ReimbursementRequest request) {
        System.out.println("财务部门处理报销请求:" + request.getDescription());
    }
}

// 在这个示例中,报销请求会依次被经理、部门主管和财务部门处理。根据报销金额的不同,请求会被传递到适当的处理者。
public class Main {
    public static void main(String[] args) {
        ReimbursementHandler manager = new ManagerHandler();
        ReimbursementHandler departmentHead = new DepartmentHeadHandler();
        ReimbursementHandler finance = new FinanceHandler();

        manager.setSuccessor(departmentHead);
        departmentHead.setSuccessor(finance);

        ReimbursementRequest request1 = new ReimbursementRequest(800, "购买办公用品");
        ReimbursementRequest request2 = new ReimbursementRequest(3000, "参加培训");
        ReimbursementRequest request3 = new ReimbursementRequest(10000, "举办团建活动");

        manager.handleRequest(request1);
        manager.handleRequest(request2);
        manager.handleRequest(request3);
    }
}

本人水平有限,有错的地方还请批评指正。

什么是精神内耗?

简单地说,就是心理戏太多,自己消耗自己。

所谓:

言未出,结局已演千百遍;

身未动,心中已过万重山;

行未果,假想灾难愁不展;

事已闭,过往仍在脑中演。

相关推荐
闲不住的李先森3 小时前
乐观更新
前端·react.js·设计模式
数据智能老司机6 小时前
数据工程设计模式——实时摄取与处理
大数据·设计模式·架构
Asort9 小时前
JavaScript设计模式(七)——桥接模式:解耦抽象与实现的优雅之道
前端·javascript·设计模式
原则猫10 小时前
单例模式工程运用
前端·设计模式
charlie11451419120 小时前
精读C++20设计模式:行为型设计模式:中介者模式
c++·学习·设计模式·c++20·中介者模式
虫师c1 天前
分布式系统设计模式:从理论到实践
微服务·设计模式·系统架构·高可用·分布式系统
半旧夜夏1 天前
【设计模式】核心设计模式实战
java·spring boot·设计模式
ThisIsMirror1 天前
设计模式简要介绍
设计模式
Lei活在当下1 天前
【业务场景架构实战】7. 多代智能手表适配:Android APP 表盘编辑页的功能驱动设计
android·设计模式·架构