首页 > 其他分享 >责任链模式详解

责任链模式详解

时间:2025-01-10 14:06:10浏览次数:3  
标签:请求 处理 Request 模式 责任 详解 handleRequest Handler public

责任链模式详解
1. 定义
责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许将请求沿着处理者链进行传递,直到某个处理者能够处理该请求为止。这种模式通过将请求的发送者和接收者解耦,将请求沿着一条链传递,直到链上的某个节点能够处理该请求。
2. 主要角色
•  抽象处理者(Handler):定义一个处理请求的接口,并且可以定义一个后继链接。
•  具体处理者(ConcreteHandler):实现抽象处理者的接口,具体处理请求的对象。
•  客户端(Client):负责创建处理链,并向链中的处理者提交请求。
3. 工作原理
1.  定义处理者接口:所有处理者必须实现同一个接口,该接口包含一个处理请求的方法和一个指向链中下一个处理者的引用。
2.  创建具体处理者:实现接口的具体类,包含请求处理逻辑和对下一个处理者的引用。
3.  客户端创建处理链:客户端创建处理者对象并设置它们之间的顺序,然后向链的起点提交请求。
4.  请求传递:请求从链的一端开始传递,每个处理者根据自身逻辑决定是否处理请求,如果不能处理则将请求传递给链中的下一个处理者。
4. 代码示例
以下是一个简单的责任链模式的Java代码示例:
// 抽象处理者
public abstract class Handler {
    protected Handler nextHandler;

    public void setNextHandler(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }

    public abstract void handleRequest(Request request);
}

// 具体处理者1
public class ConcreteHandler1 extends Handler {
    @Override
    public void handleRequest(Request request) {
        if (request.getType().equals("Type1")) {
            System.out.println("ConcreteHandler1 处理请求");
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
}

// 具体处理者2
public class ConcreteHandler2 extends Handler {
    @Override
    public void handleRequest(Request request) {
        if (request.getType().equals("Type2")) {
            System.out.println("ConcreteHandler2 处理请求");
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        Handler handler1 = new ConcreteHandler1();
        Handler handler2 = new ConcreteHandler2();
        handler1.setNextHandler(handler2);

        Request request1 = new Request("Type1");
        Request request2 = new Request("Type2");
        Request request3 = new Request("Type3");

        handler1.handleRequest(request1); // ConcreteHandler1 处理请求
        handler1.handleRequest(request2); // ConcreteHandler2 处理请求
        handler1.handleRequest(request3); // 无处理者处理请求
    }
}

// 请求类
public class Request {
    private String type;

    public Request(String type) {
        this.type = type;
    }

    public String getType() {
        return type;
    }
}

5. 优点
•  解耦:请求发送者不需要知道具体哪个对象会处理该请求,只需要将请求发送到链的起点即可。
•  灵活性:可以通过动态配置或编程方式调整处理者的顺序和数量。
•  扩展性:容易添加新的处理者,不影响现有的处理者。
•  责任分担:每个类只需要处理自己该处理的工作,不该处理的传递给下一个对象完成,明确各类的责任范围,符合类的单一职责原则。
6. 缺点
•  调试困难:由于请求可能经过多个处理者,调试时需要跟踪整个链路。
•  性能开销:如果链很长,可能会增加请求处理的时间。
7. 应用场景
•  多个对象可能处理同一个请求:当请求的处理不是固定的,或者需要动态决定哪个对象处理请求时。
•  处理者对象集合需要动态确定:在运行时根据需要动态调整处理者顺序的场景。
•  增强系统的灵活性:通过责任链模式,可以灵活地增加或移除责任链中的处理者。
总结
责任链模式通过将请求的发送者和接收者解耦,将请求沿着一条链传递,直到链上的某个节点能够处理该请求。这种模式具有解耦、灵活性和扩展性等优点,但也存在调试困难和性能开销等问题。适用于多个对象可能处理同一个请求的场景,如请假审批流程、日志记录系统等。

标签:请求,处理,Request,模式,责任,详解,handleRequest,Handler,public
From: https://blog.csdn.net/silver687/article/details/144962655

相关文章

  • [读书日志]从零开始学习Chisel 第十篇:Scala的模式匹配(敏捷硬件开发语言Chisel与数字系
    7.Scala的模式匹配7.1样例类和对象定义类时,如果在最前面加上关键字case,则这个类就被称为样例类。Scala的编译器自动对样例类添加一些语法便利:添加一个与类同名的工厂方法,可以通过类名(参数)来构造对象,而不需要使用new类名(参数)来构造;参数列表的每个参数都隐式地获得......
  • 详解SonarQube Web API的使用方法以及典型应用场景(内附python代码)
    SonarQubeWebAPISonarQube的WebAPI是一组HTTPRESTAPI,允许开发人员与SonarQube服务器进行交互。这些API涵盖了SonarQube的各个方面,包括项目管理、问题管理、质量规则和指标等。我们可以在SonarQube的帮助菜单中查看相关使用信息,如下图所示:典型应用场景SonarQubeAPI可......
  • For循环详解
    有错请指出for本是一个单词,意思有:给,对;为了;关于;代表;受雇于;意思是;支持;因为;为得到;换取;就……而言;……后(更好、更快乐等);(表示去向)往;(安排或预定)在……时;对(某人)来说(困难、必需、愉快等);以……为价格;(表示一段时间)计;表示一系列事件之一在C++中,它的格式是这样的:for(init;conditio......
  • 大闹天宫更始版H5网页游戏一键端+GM模式+安装教程
    今天为大家带来一款怀旧网单《大闹天宫更始版H5网页游戏》的游戏架设,仅供怀旧,本人已经安装游戏成功,特此带来详细安装教程。视频演示https://githubs.xyz/show/331.mp4 亲测截图   架设步骤关闭默认杀毒软件和其它自己下的杀毒软件 ,一定要检查关闭!!!!  打开windows......
  • 开关不一定是开关灯用 - 命令模式(Command Pattern)
    命令模式(CommandPattern)命令模式(CommandPattern)命令设计模式命令设计模式结构图命令设计模式涉及的角色talkischeap,showyoumycode总结命令模式(CommandPattern)命令模式(CommandPattern)是一种行为型设计模式,它将请求封装为对象,从而使你可以用不同的请求对客......
  • 详解GaussDB事务和并发控制机制,提升事务并发处理效率
    摘要:本文着重介绍了GaussDB的事务管理和并发控制机制,GaussDB采用多版本并发控制和两阶段锁相结合的机制。本文分享自华为云社区《华为云开发者云主机体验【玩转华为云】》,作者:GaussDB数据库。 事务是数据库的核心功能之一,其主要目的是保障数据库系统在并发处......
  • 浏览器隐身模式
    隐身模式(也称为隐身窗口或隐私模式)在浏览器自动化和爬虫应用中提供了几个关键好处:避免跟踪:隐身模式不会保存浏览历史、Cookie或站点数据。这意味着每次启动隐身会话时,都是一个全新的、无痕迹的会话,有助于避免跨站点的跟踪。减少检测:许多网站使用Cookie和本地存储来识别和......
  • cesium小知识:PostProcess(后处理)详解及示例
    Cesium的PostProcess(后处理)功能允许开发者在场景渲染完成后对图像进行额外的处理,以实现各种视觉效果。通过后处理,可以添加诸如抗锯齿、景深、辉光、色调映射等特效,从而增强最终图像的质量和视觉吸引力。以下是关于Cesium后处理的更详细说明:1.PostProcessStagePostP......
  • ThreeJS入门(217):THREE.DRACOExporter 知识详解,示例代码
    作者:还是大剑师兰特,曾为美国某知名大学计算机专业研究生,现为国内GIS领域高级前端工程师,CSDN知名博主,深耕openlayers、leaflet、mapbox、cesium,webgl,ThreeJS,canvas,echarts等技术开发,欢迎加微信(gis-dajianshi),一起交流。查看本专栏目录-本文是第217篇入门文章......
  • docker update 参数详解
    https://www.cnblogs.com/zwh0910/p/16386029.htmldockerupdate--restart=alwayscontainer一、dockerupdatedockerupdate:更新一个或多个容器的配置。语法dockerupdate[OPTIONS]CONTAINER[CONTAINER...]OPTIONS说明名称描述--blkio-weight阻塞IO(......