首页 > 其他分享 >一个个顺序挨着来 - 责任链模式(Chain of Responsibility Pattern)

一个个顺序挨着来 - 责任链模式(Chain of Responsibility Pattern)

时间:2025-01-09 13:04:35浏览次数:3  
标签:Chain 处理 Pattern void Approver request Responsibility ApprovalRequest public

责任链模式(Chain of Responsibility Pattern)

责任链模式(Chain of Responsibility Pattern)

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许你将请求沿着处理者链条传递,直到有一个处理者能够处理它为止。这种模式避免了请求发送者和接收者之间的耦合,并且可以动态地指定一组处理者来处理请求。每个处理者都包含对下一个处理者的引用,如果当前处理者不能处理请求,它会将请求转发给下一个处理者。

太抽象了,举个现实生活中的例子
生活中,我们可能会遇到需要报销的生活场景。但是报销的时候,每个人的报销权限不一样。比如金额比较小的时候,你的领导就可以帮你审批;但是如果金额超过了你领导的审核范围,你的领导可能就把报销的交给他的上一层领导处理;他的上一层领导如果能处理就处理,处理不了,就沿着审批链条再往上进行审批。

责任链模式(Chain of Responsibility Pattern)概述

责任链结构图

在这里插入图片描述

责任链模式概述

  • 定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。
  • 目的:解耦请求的发送者与接收者,提供一个灵活的方式来处理请求,支持动态添加或移除处理逻辑。

责任链模式涉及的角色

  1. 抽象处理者(Handler):声明了所有具体处理者必须实现的方法,通常是handle()方法。此外,它还可能包含一个指向下一个处理者的引用。
public abstract class Handler {
    protected Handler successor;

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

    public abstract void handleRequest(String request);
}
  1. 具体处理者(ConcreteHandler):实现了Handler接口的具体类。
public class ConcreteHandlerA extends Handler {
    @Override
    public void handleRequest(String request) {
        if ("A".equals(request)) {
            System.out.println("Handled by ConcreteHandlerA");
        } else {
            if (successor != null) {
                successor.handleRequest(request);
            }
        }
    }
}

public class ConcreteHandlerB extends Handler {
    @Override
    public void handleRequest(String request) {
        if ("B".equals(request)) {
            System.out.println("Handled by ConcreteHandlerB");
        } else {
            if (successor != null) {
                successor.handleRequest(request);
            }
        }
    }
}
  1. 客户端(Client):客户端创建具体的处理者对象,并根据需要将它们链接起来形成一条责任链。然后,客户端将请求传递给链中的第一个处理者。
public class Client {
    public static void main(String[] args) {
        Handler handlerA = new ConcreteHandlerA();
        Handler handlerB = new ConcreteHandlerB();

        // 构建责任链
        handlerA.setSuccessor(handlerB);

        // 发送请求
        handlerA.handleRequest("A"); // Handled by ConcreteHandlerA
        handlerA.handleRequest("B"); // Handled by ConcreteHandlerB
        handlerA.handleRequest("C"); // Not handled, no output or error
    }
}

talk is cheap, show you my code

我们还是利用本次要介绍的设计模式来实现我们给出的例子。

  1. 首先,我们定义一个ApprovalRequest类来表示审批请求:
public class ApprovalRequest {
    private double amount;
    private String description;
    private boolean isApproved = false;

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

    public double getAmount() {
        return amount;
    }

    public String getDescription() {
        return description;
    }

    public boolean isApproved() {
        return isApproved;
    }

    public void setApproved(boolean approved) {
        isApproved = approved;
    }
}
  1. 接下来,我们定义一个Approver接口,所有审批者都将实现这个接口:
public interface Approver {
    void processRequest(ApprovalRequest request);
    Approver getNextApprover();
    void setNextApprover(Approver nextApprover);
}
  1. 我们为不同的审批级别创建具体的审批者类。例如,部门经理(DepartmentManager)、总监(Director)和CEO(ChiefExecutiveOfficer)
public class DepartmentManager implements Approver {
    private Approver nextApprover;
    private static final double LIMIT = 5000.0;

    public DepartmentManager() {
    }

    @Override
    public void processRequest(ApprovalRequest request) {
        if (request.getAmount() <= LIMIT) {
            System.out.println(request.getDescription() + " is approved by Department Manager.");
            request.setApproved(true);
        } else {
            if (nextApprover != null) {
                nextApprover.processRequest(request);
            } else {
                System.out.println(request.getDescription() + " was rejected.");
                request.setApproved(false);
            }
        }
    }

    @Override
    public Approver getNextApprover() {
        return nextApprover;
    }

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

public class Director implements Approver {
    private Approver nextApprover;
    private static final double LIMIT = 20000.0;

    // Similar methods as in DepartmentManager
    // ...
}

public class ChiefExecutiveOfficer implements Approver {
    private Approver nextApprover;

    // No limit for CEO, all requests will be approved or rejected here
    // Similar methods as in DepartmentManager and Director
    // ...
}
  1. 最后,我们可以编写一个客户端类来测试这个责任链:
public class Client {
    public static void main(String[] args) {
        ApprovalRequest request1 = new ApprovalRequest(4500, "Office supplies");
        ApprovalRequest request2 = new ApprovalRequest(12000, "New computer");
        ApprovalRequest request3 = new ApprovalRequest(25000, "Conference room renovation");

        Approver departmentManager = new DepartmentManager();
        Approver director = new Director();
        Approver ceo = new ChiefExecutiveOfficer();

        departmentManager.setNextApprover(director);
        director.setNextApprover(ceo);

        departmentManager.processRequest(request1);
        System.out.println("Request1 approved? " + request1.isApproved());

        departmentManager.processRequest(request2);
        System.out.println("Request2 approved? " + request2.isApproved());

        departmentManager.processRequest(request3);
        System.out.println("Request3 approved? " + request3.isApproved());
    }
}

在这个客户端类中,我们创建了三个审批请求,并设置了审批链。然后,我们依次处理这些请求,并打印出它们是否被批准。

总结

责任链可以帮助我们降低耦合度;增加灵活性;可以帮助我们更好地组织代码。我们上面实现地责任链模式是类似与拦截器的那种方式。责任链还可以设计为一些别的方式。责任链模式一般适用于日志记录;审批流程等等。

标签:Chain,处理,Pattern,void,Approver,request,Responsibility,ApprovalRequest,public
From: https://blog.csdn.net/Zongkunxue/article/details/145019953

相关文章

  • Structural Pattern Matching(match 语句)
    StructuralPatternMatching:翻译过来应该是结构化的模式匹配。从python3.10开始提供了matchstatement。它远比简单的其它语言中的那种switch语句功能强大的多。通过一个例子来了解一下这种语句的用法。假设我们有一个函数,用来区分用户做的操作,并将其打印出来。我们使用js......
  • 玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南
    系列文章目录01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南文章目录系列文章目录前言一、LangChain环境搭建与初始配置1.1安装依赖1.2环境变量加载1.2.1具体步骤1.2.2注意事项1.3初始化模型客户端二、基础示例:与模型交互2.1直接调用模型2.1.1......
  • 使用LangChain模板在Amazon Bedrock上配置Anthropic‘s Claude作为聊天机器人
    文章目录概要整体架构流程技术名词解释技术细节小结概要提示:这里可以添加技术概要例如:openAI的GPT大模型的发展历程。整体架构流程提示:这里可以添加技术整体架构例如:在语言模型中,编码器和解码器都是由一个个的Transformer组件拼接在一起形成的。技术......
  • Java设计模式 —— 【行为型模式】命令模式(Command Pattern) 详解
    文章目录模式介绍优缺点适用场景结构案例实现注意事项模式介绍有时候需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是什么。此时希望用一种松耦合的方式来设计程序,使得请求发送者和请求接收者能够消除彼此之间的耦合关系。拿订餐来说......
  • 使用LangChain集成ChatLlamaAPI进行文本情感分析
    近年来,随着大语言模型(LLM)的兴起,文本情感分析的应用场景越来越丰富。在本篇文章中,我们将探讨如何使用LangChain集成ChatLlamaAPI,一个支持函数调用的托管版本Llama2,来实现文本情感分析。我们将通过具体的代码示例来进行演示,帮助开发者快速上手。技术背景介绍LangChain是用......
  • 了解Langchain的核心--Chain,掌握Chain的概念
    Chains指的是将一系列的调用组装成序列--包括大语言模型(LLM),工具tool,还有数据预处理步骤的调用等等。目前最新的实现是通过LangChainExpressionLanguage(LCEL)实现的Chains。LCEL非常适合构建您自己的Chains,也有一些已经封装好的Chains也可以拿来就用。LangChain支持两种类型......
  • 复杂对象的创建与组装 - 建造者模式(Builder Pattern)
    建造者模式(BuilderPattern)建造者模式(BuilderPattern)建造者模式(BuilderPattern)概述建造者模式结构图代码talkischeap,showyoumycode总结建造者模式(BuilderPattern)建造者模式(BuilderPattern)是一种创建型设计模式,它允许你分步骤构建复杂对象。该模式将一个......
  • 你内部啥样跟我没关系 - 迭代器模式(Iterator Pattern)
    迭代器模式(IteratorPattern)迭代器模式(IteratorPattern)迭代器模式概述迭代器模式结构图迭代器模式涉及的角色talkischeap,showyoumycode总结迭代器模式(IteratorPattern)迭代器模式(IteratorPattern)是一种行为型设计模式,它提供了一种方法顺序访问一个聚合对象......
  • CanvasContext.createPattern
    CanvasContext.createPattern(stringimage,stringrepetition)CanvasContext是旧版的接口,新版Canvas2D接口与Web一致从基础库2.9.0开始,本接口停止维护,请使用RenderingContext代替基础库1.9.90开始支持,低版本需做兼容处理。小程序插件:支持相关文档:旧版画......
  • 【题解】AT agc057A Antichain of Integer Strings
    记\(f(x)\)为最小的大于\(x\)的\(y\),使得\(x\)是\(y\)的子串。易得:\[f(x)=\min(10x,x+10^{|x|})\]其中\(|x|\)表示\(x\)的位数。可以发现,\(f(x)\)为一个严格单调递增的函数。考虑贪心策略,显然选小的数不如选大的数优,因为小的数更有可能成为别的数的子串。于是,我......