设计模式 -- 责任链模式(Chain of Responsibility Pattern)

责任链模式:和上一篇策略模式一样也是行为型模式。创建一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它****会把相同的请求传给下一个接收者,依此类推

介绍
  • 意图:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
  • 主要解决问题:客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,总的来说就是职责链将请求的发送者和请求的处理者解耦。
  • 关键代码:抽象类里面聚合它自己(聚合和抽象类我在设计模式的六大原则-CSDN博客有介绍和示例),在里面判断是否满足条件,如果没达到条件则向下传递。
  • 优点:1、降低耦合度。它将请求的发送者和接收者解耦。 2、简化了对象。使得对象不需要知道链的结构。 3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。 4、增加新的请求处理类很方便。
  • 缺点:1、不能保证请求一定被接收。 2、系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。 3、可能不容易观察运行时的特征,有碍于除错。

还这个绘制三角形、圆形、矩形图案例子

  1. 创建抽象的绘制类。

    java 复制代码
    public abstract class AbstractDraw {
        public static String TRIANGLE = "三角形";
        public static String CIRCULAR = "圆形";
        public static String RECTANGLE = "矩形";
    
        protected String shape;
    
        //责任链中的下一个接收者
        protected AbstractDraw nextDraw;
        public void setNextDraw(AbstractDraw nextDraw){
            this.nextDraw = nextDraw;
        }
        public void draw(String shape, String colour){
            if(this.shape.equals(shape)){
                drawing(colour);
            }
            if(nextDraw !=null){
                nextDraw.draw(shape, colour);
            }
        }
    
        abstract protected void drawing(String colour);
    
    }
  2. 创建扩展该绘制类的
    三角形责任实体类

    java 复制代码
    public class TriangleDraw extends AbstractDraw{
    
        public TriangleDraw(String shape) {
            this.shape = shape;
        }
    
        @Override
        protected void drawing(String colour) {
            //绘制一个colour颜色的三角形逻辑
        }
    }

    圆形责任实体类

    java 复制代码
    public class CircularDraw extends AbstractDraw{
    
        public CircularDraw(String shape) {
            this.shape = shape;
        }
    
        @Override
        protected void drawing(String colour) {
            //绘制一个colour颜色的圆形逻辑
        }
    }

    矩形责任实体类

    java 复制代码
    public class RectangleDraw extends AbstractDraw{
    
        public RectangleDraw(String shape) {
            this.shape = shape;
        }
    
        @Override
        protected void drawing(String colour) {
            //绘制一个colour颜色的距形逻辑
        }
    }
  3. 创建不同类型的责任编排成链

    java 复制代码
    public class ChainPatternDemo {
    
        //编排成链
        static AbstractDraw getChainOfDraw(){
            AbstractDraw triangleDraw = new TriangleDraw(AbstractDraw.TRIANGLE);
            AbstractDraw circularDraw = new CircularDraw(AbstractDraw.CIRCULAR);
            AbstractDraw rectangleDraw = new RectangleDraw(AbstractDraw.RECTANGLE);
            triangleDraw.setNextDraw(circularDraw);
            circularDraw.setNextDraw(rectangleDraw);
            return triangleDraw;
        }
    
        //使用示例
        public static void main(String[] args) {
            AbstractDraw drawChain = getChainOfDraw();
            drawChain.draw(AbstractDraw.TRIANGLE,"红色");
            drawChain.draw(AbstractDraw.CIRCULAR,"蓝色");
            drawChain.draw(AbstractDraw.RECTANGLE,"绿色");
        }
    }
相关推荐
码兄科技1 小时前
Java AI智能体开发实战:从零构建智能对话系统指南
java·开发语言·人工智能
折哥的程序人生 · 物流技术专研2 小时前
第8篇:六大设计原则在工厂模式中的体现
java·设计模式·设计原则·工厂模式·编程进阶·扩充系列
小明bishe182 小时前
计算机毕业设计之基于JAVA的植物科普网站
java·spring boot·spring·架构·课程设计
r_oo_ki_e_2 小时前
Java Map 集合学习笔记
java·笔记·学习
SL-staff3 小时前
智慧园区2000+设备统一管理:JVS-IoT如何降低运维成本40%
java·开发语言·物联网·智慧园区·设备管理·运维优化·jvs-iot
咖啡八杯3 小时前
GoF设计模式——模板方法模式
java·后端·spring·设计模式
爱笑的源码基地4 小时前
一款全开源的信创云PACS影像云平台解决方案,支持多模态医学影像处理(CT/MR/DR/超声/病理等)
java·源码·国产化·pacs·云影像·区域pacs
我命由我123454 小时前
Android 开发问题:ClickableSpan 的点击事件没有生效
java·java-ee·android studio·android jetpack·android-studio·android runtime
万亿少女的梦1685 小时前
基于Python的高考志愿填报辅助系统设计与实现
java·spring boot·python·mysql·vue
微信开发api-视频号协议5 小时前
企业微信外部群开发自动化实践过程
java·前端·微信·自动化·企业微信·ipad