首页 > 其他分享 >设计模式之职责链模式

设计模式之职责链模式

时间:2024-07-11 18:55:56浏览次数:14  
标签:职责 getNumber 处理 模式 Handler trouble 设计模式 public Trouble

1. 职责链模式(Chain of Responsibility Pattern)

        在职责链模式中,多个处理器依次处理同一个请求。一个请求先经过 A 处理器处理,然后再把请求传递给 B 处理器,B处理器处理完后再传递给 C 处理器,以此类推,形成一个链条。链条上的每个处理器各自承担各自的处理职责,所以叫作职责链模式。

1.1. 模式架构

  • 抽象处理者(Handler):定义一个处理请求的接口,包含抽象处理方法一个后继连接(链上的每个处理者都有一个成员变量来保存对于下一处理者的引用) 。
  • 具体处理者(Concrete Handler):实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。
  • 请求者(Client):创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。

1.2. 示例实现代码

        Trouble类是表示发生问题的类,number是问题编号。通过getNumber来获取问题编号。

        问题的大小从升序排序为:1 < 2 < 3 < 4

        处理者处理问题的能力升序排序为:HandlerA < HandlerB < HandlerC < HandlerD

public class Trouble {
    private String number;//问题编号

    public Trouble(String number) {
        this.number = number;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    @Override
    public String toString() {
        return "Trouble{" +
                "number='" + number + '\'' +
                '}';
    }
}

抽象处理者(Handler):

Handler

public abstract class Handler{
    //处理器执行链路
    protected Handler successor = null;

    //设置下一个处理请求的处理者对象
    public void setSuccessor(Handler successor){
        this.successor = successor;
    }

    //处理的方法,具体处理者需根据不同需求进行实现
    public abstract void handle(Trouble trouble);
}

具体处理者(Concrete Handler):

HandlerA

public class HandlerA extends Handler {
   //具体处理者的实现方法
    @Override
    public void handle(Trouble trouble) {
        System.out.print("HandlerA 执行代码逻辑! 处理: " +
                trouble.getNumber());
        trouble.setNumber(trouble.getNumber().replace("1", ""));
        System.out.println(",处理完的结果为:" + trouble.getNumber());
        if (successor != null) {
            successor.handle(trouble);
        }else {
            System.out.println("执行终止");
        }
    }
}

HandlerB

public class HandlerB extends Handler {
    //具体处理者的实现方法
    @Override
    public void handle(Trouble trouble) {
        System.out.print("HandlerB 执行代码逻辑! 处理: " +
                trouble.getNumber());
        trouble.setNumber(trouble.getNumber().replace("2", ""));
        System.out.println(",处理完的结果为:" + trouble.getNumber());
        if (successor != null) {
            successor.handle(trouble);
        }else {
            System.out.println("执行终止");
        }
    }
}

HandlerC

public class HandlerC extends Handler {
   //具体处理者的实现方法
    @Override
    public void handle(Trouble trouble) {
        System.out.print("HandlerC 执行代码逻辑! 处理: " +
                trouble.getNumber());
        trouble.setNumber(trouble.getNumber().replace("3", ""));
        System.out.println(",处理完的结果为:" + trouble.getNumber());
        if (successor != null) {
            successor.handle(trouble);
        }else {
            System.out.println("执行终止");
        }
    }
}

HandlerD

public class HandlerD extends Handler {
   //具体处理者的实现方法
    @Override
    public void handle(Trouble trouble) {
        System.out.print("HandlerD 执行代码逻辑! 处理: " +
                trouble.getNumber());
        trouble.setNumber(trouble.getNumber());
        System.out.println(",处理完的结果为:" + trouble.getNumber());
        if (successor != null) {
            successor.handle(trouble);
        }else {
            System.out.println("执行终止");
        }
    }
}

请求者(Client):

public class Client {
    public static void main(String[] args) {
        //包含1234的问题
        Trouble trouble = new Trouble("1234");
        //包含123的问题
        Trouble trouble2 = new Trouble("123");
        
        Handler h1 = new HandlerA();
        Handler h2 = new HandlerB();
        Handler h3 = new HandlerC();
        //设置处理器执行链路
        h1.setSuccessor(h2);
        h2.setSuccessor(h3);
        //执行
        h1.handle(trouble);
    }
}

执行结果:

HandlerA 执行代码逻辑! 处理: 1234,处理完的结果为:234

HandlerB 执行代码逻辑! 处理: 234,处理完的结果为:34

HandlerC 执行代码逻辑! 处理: 34,处理完的结果为:4

执行终止

        在以上示例代码中,Handler抽象类定义了处理的抽象方法和后续的执行连接处理对象,而HandlerA~D是对应不同的具体处理类,每个类可以解决不同级别的问题,请求者可以设置执行链路,当一个含有不同等级的问题要处理时,会根据执行链路进行执行,若当前处理类无法处理该问题,则让下一个处理对象判断是否能处理,执行全部处理完毕。

1.3. 优缺点

优点

  • 降低耦合度:请求者不需要知道是哪个具体的处理者处理请求,降低了发送者和接收者之间的耦合度。
  • 灵活性增强:可以动态地增加或修改处理请求的链条,更容易地根据需要改变处理流程。
  • 简化对象:每个具体处理者只需关注自己责任范围内的处理逻辑,符合单一职责原则。

缺点

  • 请求不一定被处理:如果请求到达链条末端仍然没有处理者能够处理,可能会导致请求未被处理的情况。
  • 性能问题:请求可能会经过多个处理者才能被处理,特别是在链条较长时,可能会影响性能。
  • 调试复杂:链条中每个具体处理者的执行顺序不确定,难以调试。

在生活中比较常见的应用模式有:

1、在运行时需要动态使用多个关联对象来处理同一次请求时,比如各种流程执行:请假流程、员工入职流程。

2、需要动态更换处理对象时。比如,工单处理系统、网关 API 过滤规则系统等。

3、电商网站活动方式,一般分为满减送、限时折扣、包邮活动,拼团等可以采用策略模式

        职责链模式常被用在框架开发中,用来实现框架的过滤器、拦截器功能,让框架的使用者在不修改源码的情况下,添加新的过滤拦截功能。

标签:职责,getNumber,处理,模式,Handler,trouble,设计模式,public,Trouble
From: https://blog.csdn.net/weixin_43287459/article/details/140275883

相关文章

  • 华贝甄选绿色积分模式的可信赖之处揭秘
        华贝甄选是天贝集团旗下的数字产融生态领先品牌,业务涵盖PPP产业、金融生态、国际投资、智慧能源、数字产业、智慧产业、三农产业、生物科技等领域。其优势在于通过多维系统助力DAO组织系统打造,实现财富与健康双丰收;打造全新生态体系,实现生态链条和生态联盟,线上线下......
  • 常见的设计模式-java实现
    设计模式的目的代码从重用性(相同的功能可以复用)代码的可读性(编程的规范性,便于其他人的阅读)可扩展性(程序添加新功能不会很困难)可靠性(添加新功能后对原有的功能没有影响)使程序高内聚低耦合七大设计原则1.单一职责原则介绍一个类应该只负责一个职责,降低类的耦合度。提高......
  • 海狐外卖O2O商城系统:技术架构与运营模式的深度解析
    摘要:本文深入探讨了海狐外卖O2O商城系统的技术架构、功能特性以及运营模式。海狐外卖作为一款专注于细分市场领域的外卖餐饮解决方案,不仅拥有先进的技术栈支持,还通过丰富的系统插件和灵活的运营模式,为商户和用户提供高效、便捷的服务。本文将从技术角度对其架构进行详细解析,并......
  • java设计模式--创建型模式
    一、设计原则1.1设计模式的目的编写软件过程中,程序员面临着来自耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性等多方面的挑战,设计模式是为了让程序(软件),具有更好的1)代码重用性(即:相同功能的代码,不用多次编写)2)可读性(即:编程规范性,便于其他程序员的阅读和理解)......
  • 手写一个单例模式然后问如何破坏这个单例模式
    手写一个单例模式然后问如何破坏这个单例模式美团到店的原题,手写一个单例模式然后问如何破坏这个单例模式?单例模式谁都会,懒汉、饿汉、双重校验锁、匿名内部类、Enum,倒背如流了都,那如何破坏单例呢?以最简单的饿汉式写法为例:所谓单例,就是保证一个类只有一个实例对象,那想要破坏单......
  • Linux (10) 配置HAProxy,实现负载均衡器的主备模式
    《WindowsAzurePlatform系列文章目录》 最近有1个客户需求,在这里记录一下。客户提出需要使用Azure负载均衡器(四层负载均衡器),实现主备模式。场景是负载均衡器后有2台虚拟机-平时100%的流量都发送到第一台虚拟机-如果第一台虚拟机发生......
  • 设计模式使用场景实现示例及优缺点(创建型模式——单例模式、建造者模式、原型模式)
    创建型模式单例模式(SingletonPattern)单例模式(SingletonPattern)在Java中的使用场景与在其他编程语言中类似,其主要目的是确保一个类只有一个实例,并提供一个全局的访问点。以下是单例模式的一些常见使用场景及详细讲解:使用场景控制资源的使用:数据库连接池:数据库连接是......
  • 设计模式使用场景实现示例及优缺点(结构型模式——代理模式、外观模式)
    结构型模式代理模式(ProxyPattern)代理模式(ProxyPattern)是一种结构型设计模式,它通过引入一个代理对象来控制对另一个对象的访问。这个代理对象可以为被代理的对象提供额外的功能,例如访问控制、延迟初始化、日志记录、或网络访问等。适用场景远程代理:为一个对象在不同......
  • Xubuntu24.04之设置高性能模式两种方式(二百六十一)
    简介:CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!优质专栏:Audio工程师进阶系列【原创干货持续更新中……】......
  • go并发模式 o-channel
    packagemainimport("fmt""time")funcmain(){varorfunc(channels...<-chaninterface{})<-chaninterface{}or=func(channels...<-chaninterface{})<-chaninterface{}{switchlen(channels)......