Java设计模式 _行为型模式_责任链模式

news2024/11/16 9:19:59

一、责任链模式

1、责任链模式
责任链模式(Chain of Responsibility Pattern)是一种行为型模式。该模式会为请求创建一个接收者对象的链。在这个责任链里,通常每个接收者都包含对另一个接收者的引用,如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推而形成的链式响应。

2、优点
(1)、降低耦合度:请求发送方无需关注处理请求体,直接使用链处理。
(2)、代码更灵活,可扩展能力比较强。

3、实现思路
(1)、定义规范接口(包含目标方法,和设置下一个接收对象的方法)
(2)、编写各种实现类,实现目标方法(逻辑:本级能处理就处理,处理不了转发给下一级处理)
(3)、创建链路类,也要实现规范接口,同时构造生成链路的方法
(4)、使用链路调用方法

二、代码示例

1、代码场景
卖商品的场景:销售员最多卖5个,商店最多可卖100个,区域总部最多可卖10000个,中国总部不限制数量。要求不管用户买多少个都能实现。

// 1、定义规范
public abstract class Sailer {
    public Sailer nestSailer;    // 定义下一接收对象属性
    public void setNest(Sailer nestSailer) {   // 设置下一个接收对象
        this.nestSailer = nestSailer;
    }

    abstract void sail(int num);  // 目标方法
}
// 2.1、销售员实现类
public class PersonSailer extends Sailer {
    public static int MAX_NUM = 5;

    @Override
    public void sail(int num) {
        if (num < MAX_NUM) {
            System.out.println("销售员最大可卖数量为" + MAX_NUM + ",本次卖出数量为:" + num);
        } else {
            this.nestSailer.sail(num);
        }
    }
}
// 2.2、商店实现类
public class ShopSailer extends Sailer {
    public static int MAX_NUM = 100;

    @Override
    public void sail(int num) {
        if (num < MAX_NUM) {
            System.out.println("商店最大可卖数量为" + MAX_NUM + ",本次卖出数量为:" + num);
        } else {
            this.nestSailer.sail(num);
        }
    }
}
// 2.3、区域总部实现类
public class AreaSailer extends Sailer {
    public static int MAX_NUM = 10000;

    @Override
    public void sail(int num) {
        if (num < MAX_NUM) {
            System.out.println("地区总部最大可卖数量为" + MAX_NUM + ",本次卖出数量为:" + num);
        } else {
            this.nestSailer.sail(num);
        }
    }
}
// 2.4、中国总部实现类
public class ChinaSailer extends Sailer {
    @Override
    public void sail(int num) {
        System.out.println("中国总部售卖不限量,本次卖出数量为:" + num);
    }
}
// 3、生成销售链
public class SailerChain extends Sailer{
    private static Sailer sailerChain;   // 销售链

    static {    // 初始化生成销售链
        Sailer chinaSailer = new ChinaSailer();
        Sailer areaSailer = new AreaSailer();
        Sailer shopSailer = new ShopSailer();
        Sailer personSailer = new PersonSailer();
        personSailer.setNest(shopSailer);
        shopSailer.setNest(areaSailer);
        areaSailer.setNest(chinaSailer);
        sailerChain = personSailer;
    }

    @Override
    void sail(int num) {
        sailerChain.sail(num);
    }
}
// 4、测试,使用销售炼卖,而不是具体的实体对象卖
 public static void main(String[] args) {
        SailerChain chain = new SailerChain();

        chain.sail(3);
        chain.sail(30);
        chain.sail(3000);
        chain.sail(300000);
    }

运行结果:
在这里插入图片描述
可以看到,通过销售链可以根据卖出数量调用不同的方法。

2、总结
当多个实现类都可以处理某种类型请求时,可以根据请求的条件来决定最终由哪一个类去处理这个请求,如本例的责任链模式就是一种实现方式。责任链模式的链路生成思路是通过内置了下一个对象的引用来实现的。当条件满足时直接处理业务,不满足就放给下一个接收者去处理,或者某些场景下也可以是处理完业务也放给下一个链路去处理(如:错误日志和全量日志),具体需要根据业务去改造即可。

学海无涯苦作舟!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1656477.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux运维:centos环境变量

前言 在 Linux 运维工作中&#xff0c;管理环境变量是至关重要的一项任务。在 CentOS 环境下&#xff0c;正确配置环境变量可以使系统更加高效和易于管理。 本文将重点讨论 CentOS 环境下的环境变量设置&#xff0c;并就python的环境变量配置方案进行讲解&#xff08;不包含Ano…

汽车软件研发工具链丨怿星科技新产品重磅发布

“创新引领未来”聚焦汽车软件新基建&#xff0c;4月27日下午&#xff0c;怿星科技2024新产品发布会在北京圆满举行&#xff01;智能汽车领域的企业代表、知名大企业负责人、投资机构代表、研究机构代表齐聚现场&#xff0c;线上直播同步开启&#xff0c;共同见证怿星科技从单点…

ubuntu下载zotero

https://www.zotero.org/download/ 下载完安装包之后&#xff0c;打开到这个位置右键点击打开终端 打开终端输入 ./zotero 随后进入到zotero弹出窗口直接next安装即可

(1)AB_PLC Studio 5000软件与固件版本升级

AB_PLC Studio 5000软件与固件版本升级 1. 软件版本升级2. 固件版本升级1. 软件版本升级 使用将老程序从19版本升级到33版本。 step1:双击程序.ACD文件,打开界面如下。 step2:点击更改Controller,选择我们的新CPU的型号和版本号。点击确定 step3:点击确定,等待。 st…

21物联1班shift五次

1.选择推荐选项 2.等待 3.点击取消 4.选择查看问题详细信息 5.点击txt文件 6.找到system文件夹&#xff0c;将sethc改为qqq&#xff0c;将cmd文件改为sethc文件 7.单击完成。重新启动虚拟机。连续按五次shift出现cmd框&#xff0c;修改密码

【解疑】ZIP分卷压缩文件如何设置和取消密码?

压缩大文件&#xff0c;我们可以设置压缩成ZIP分卷文件&#xff0c;这样更利于传输和存储。如果分卷文件比较重要&#xff0c;还可以设置密码保护&#xff0c;那ZIP分卷压缩文件的密码如何设置和取消呢&#xff1f;下面一起来看看吧&#xff01; 设置ZIP分卷密码&#xff1a; …

AI时代:人工智能大模型引领科技创造新时代

目录 前言一. AI在国家战略中有着举足轻重的地位1.1 战略1.2 能源1.3 教育 二. AI在日常生活中扮演着重要角色2.1 医疗保健2.2 智能客服2.3 自动驾驶2.4 娱乐和媒体2.5 智能家居 三. AI的未来发展趋势 总结 前言 随着AI技术的进步&#xff0c;新一代的AI技术已经开始尝试摆脱依…

买入期权是什么意思?

今天期权懂带你了解买入期权是什么意思&#xff1f;买入期权&#xff1a;也称看涨期权。一种赋予其持有者以特定的价格、在特定的到期日当天或之前买入某种资产的权力的金融工具。 买入期权是什么意思&#xff1f; 买入期权也称看涨期权。即赋予其持有者在到期日或到期日之前按…

Java | Leetcode Java题解之第71题简化路径

题目&#xff1a; 题解&#xff1a; class Solution {public String simplifyPath(String path) {String[] names path.split("/");Deque<String> stack new ArrayDeque<String>();for (String name : names) {if ("..".equals(name)) {if …

vscode调试typescript(单文件)

环境 tsc: Version 5.4.5 ts-node: v10.9.2 node: v20.12.0 步骤 1.创建文件夹&#xff0c;下方创建一个index.ts。 function test() {let str: string Hello world.console.log(str) } test()2.安装ts调试插件。 3.点击VSCode的运行和调试Tab&#xff08;第三个&#xff…

C语言例题39、输入一个正整数,将其反方向逆序输出

#include <stdio.h>void main() {int x;int ge; //个位int result 0;printf("请输入一个正整数&#xff1a;");scanf("%d", &x);while (x > 0) {//解题原理ge x % 10;//每次分解取得个位的数字result result * 10 ge;//个十百千万顺序向左…

算法学习:递归

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、引言二、什么是递归&#xff1f;三、两大基本要素&#x1f3c1; 基线条件&#xff08;Base Case&#xff09;&#x1f501; 递归条件&#xff08;Recursive Case&#xff09;&#x1f4c3; 代码示例&#xff1a;计算斐波…

Unity曲线插件Dreamteck Splines生成曲线Mesh

一、需求 脱离编辑器&#xff0c;运行时添加点&#xff0c;动态生成管道、线缆等曲线Mesh。 二、Dreamteck Splines简单运用 这方面资料不多&#xff0c;只有官方文档全英参考&#xff0c;而且又介绍得不详细。 2个重要组件介绍&#xff1a; SplineComputer&#xff1a; 最…

GRU模块:nn.GRU层

摘要&#xff1a; 如果需要深入理解GRU的话&#xff0c;内部实现的详细代码和计算公式就比较重要&#xff0c;中间的一些过程及中间变量的意义需要详细关注。只有这样&#xff0c;才能准备把握这个模块的内涵和意义&#xff0c;设计初衷和使用方式等等。所以&#xff0c;仔细研…

药品管理系统的设计与实现

互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对药品信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差&#xff0…

学习笔记:【QC】Android Q : telephony-phone 模块

一、phone init 流程图 高清的流程图参考&#xff1a;【高清图&#xff0c;保存后可以放大看】 二、phone MO 流程图 高清的流程图参考&#xff1a;【高清图&#xff0c;保存后可以放大看】 三、phone MT 流程图 高清的流程图参考&#xff1a;【高清图&#xff0c;保存后可以…

C 深入指针(3)

目录 一、关于数组名 1 数组名的理解 2 数组名 与 &数组名 的区别 二、使用数组访问指针 三、一维数组传参的本质 四、二级指针 五、指针数组 六、指针数组模拟二维数组 一、关于数组名 1 数组名的理解 //VS2022 x64 #include <stdio.h> int main() {int a…

Cesium 问题:billboard 加载未出来

文章目录 问题分析问题 接上篇 Cesium 展示——图标的依比例和不依比例缩放,使用加载 billboard 时,怀疑是路径的原因导致未加载成功 分析 原先

知名专业定制线缆知名智造品牌品牌推荐-精工电联:如何实现清扫机器人线缆产品的精益求精

在科技日新月异的今天&#xff0c;智能清扫机器人已经融入我们的日常生活。然而&#xff0c;其背后不可或缺的一部分&#xff0c;就是那些被称为机器人血管的精密线缆。精工电联作为高科技智能化产品及自动化设备专用连接线束和连接器配套服务商&#xff0c;致力于通过精益求精…

用户行为分析与内容创新:Kompas.ai的数据驱动策略

在数字化营销的今天&#xff0c;用户行为数据分析已成为内容创新和策略调整的核心。通过深入理解用户的行为模式和偏好&#xff0c;品牌能够创造出更具吸引力和相关性的内容&#xff0c;从而实现精准营销。本文将探讨用户行为数据分析在内容创新和策略调整中的价值&#xff0c;…