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

news/2024/5/19 14:50:37 标签: 设计模式, 责任链模式, java

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

介绍
  • 意图:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
  • 主要解决问题:客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,总的来说就是职责链将请求的发送者和请求的处理者解耦。
  • 关键代码:抽象类里面聚合它自己(聚合和抽象类我在设计模式的六大原则-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,"绿色");
        }
    }


http://www.niftyadmin.cn/n/5163089.html

相关文章

【Qt之QSequentialIterable】使用

介绍 QSequentialIterable类是一个容器在QVariant中的可遍历接口。该类允许多种方法来访问存储在QVariant中容器的元素。如果一个QVariant可以转换为QVariantList&#xff0c;那么可以从其中提取出QSequentialIterable的实例。 QList<int> intList {7, 11, 42};QVarian…

Leetcode—剑指OfferII LCR 044.在每个树行中找最大值【中等】

2023每日刷题&#xff08;二十三&#xff09; Leetcode—LCR 044.在每个树行中找最大值 DFS实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ /*** Note: The returned …

帷幄内容管理系统:从立人设、做内容到定向投流,品牌 KOS 体系打造「百万导购」

随着公域流量越来越贵&#xff0c;获客成本越来越高&#xff0c;品牌们已经越来越不满足于高曝光&#xff0c;而是更多地关注起销售转化率。继 KOL、KOC&#xff08;关键意见消费者&#xff09; 之后&#xff0c;KOS&#xff08;关键意见销售&#xff09;营销模式走入品牌的视野…

Redis-----SSM整合redis及redis的注解式开发以及redis的击穿,穿透,雪崩三种解决方案

目录 SSM项目整合Redis 导入pom依赖 配置文件spring-redis.xml redis.properties 配置redis的key生成策略 redis的注解式开发及应用场景 什么是redis的注解式 redis注解式的场景应用 Cacheable 自定义策略 Cacheable可以指定三个属性&#xff0c;value、key和condition…

计网----数据库(一)

计网----数据库&#xff08;一&#xff09; 一.什么是数据库 数据库是”按照数据结构来组织、存储和管理数据的仓库“。是一个长期储存在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。 二.数据库的特点 1.规范化的本地存储 2.加密 3.共享 三.数据库的好处…

内网隧道搭建( 内网穿透)

一、使用代理工具 ew_for_win 1、环境准备&#xff1a; &#xff08;1&#xff09;一台双网卡虚拟机&#xff08;作为跳板&#xff09;&#xff0c;能同时与攻击者主机和受害者主机通信&#xff1a; &#xff08;2&#xff09;一台攻击者主机&#xff1a; &#xff08;3&…

《JavaScript设计模式》笔记

该篇文章用于记录阅读《JavaScript设计模式》后归纳的读书笔记&#xff0c;主要以代码形式进行展示&#xff0c;用于快速回顾对应设计模式的代码构造 1.面向对象编程 1.使用对象收编变量 // 优点&#xff1a;避免全局变量冲突与覆盖 // 缺点&#xff1a;不利于复用 var Chec…

软件测试/测试开发丨接口测试学习笔记,TcpDump与WireShark

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接&#xff1a;https://ceshiren.com/t/topic/27859 协议分析工具 网络监听&#xff1a;TcpDump WireShark 代理 Proxy 推荐工具&#xff1a;手工测试charles [全平台]、安全测试burpsuite [全平台 j…