设计模式之责任链模式(Chain)

2023-10-27

设计模式之责任链模式(Chain)

本篇为 https://github.com/iluwatar/java-design-patterns/tree/master/chain 阅读笔记
意图

避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

优点

1、降低耦合度。它将请求的发送者和接收者解耦。
2、简化了对象。使得对象不需要知道链的结构。
3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
4、增加新的请求处理类很方便。

缺点

1、不能保证请求一定被接收。
2、系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。
3、可能不容易观察运行时的特征,有碍于除错。

场景

国王发布不同类型的命令,根据命令类型由指挥官,军官,士兵执行

国王请求枚举

public enum RequestType {
    DEFEND_CASTLE, TORTURE_PRISONER, COLLECT_TAX
}

请求

public class Request {

    private final RequestType type;

    private final String requestDescription;

    private boolean handled;

    public Request(final RequestType type, final String requestDescription) {
        this.type = Objects.requireNonNull(type);
        this.requestDescription = Objects.requireNonNull(requestDescription);
    }

    public RequestType getType() {
        return type;
    }

    public String getRequestDescription() {
        return requestDescription;
    }

    public void markHandled(){
        this.handled = true;
    }

    public boolean isHandled() {
        return handled;
    }

    @Override
    public String toString(){
        return getRequestDescription();
    }
}

请求处理抽象类

public abstract class RequestHandler {
    private RequestHandler next;

    public RequestHandler(RequestHandler next) {
        this.next = next;
    }

    public void handlerRequest(Request request) {
        if (request != null) {
            next.handlerRequest(request);
        }
    }

    protected void printHandling(Request request) {
        System.out.println(MessageFormat.format("{0} handling \"{1}\"", this, request));
    }

    @Override
    public abstract String toString();
}

指挥官

public class Commander extends RequestHandler {
    public Commander(RequestHandler next) {
        super(next);
    }

    @Override
    public void handlerRequest(Request request) {
        if (request.getType().equals(RequestType.DEFEND_CASTLE)) {
            printHandling(request);
            request.markHandled();
        } else {
            System.out.println("Commander can't handle");
            super.handlerRequest(request);
        }
    }

    @Override
    public String toString() {
        return null;
    }
}

军官

public class Officer extends RequestHandler {
    public Officer(RequestHandler next) {
        super(next);
    }

    @Override
    public void handlerRequest(Request request) {
        if (request.getType().equals(RequestType.TORTURE_PRISONER)){
            printHandling(request);
            request.markHandled();
        }else {
            System.out.println("Officer can't handle");
            super.handlerRequest(request);
        }
    }

    @Override
    public String toString() {
        return "Officer";
    }
}

士兵

public class Soldier extends RequestHandler {


    public Soldier(RequestHandler handler) {
        super(handler);
    }

    @Override
    public void handlerRequest(Request request) {
        if (request.getType().equals(RequestType.COLLECT_TAX)){
            printHandling(request);
            request.markHandled();
        }else {
            System.out.println("Soldier can't handle");
            super.handlerRequest(request);
        }
    }

    @Override
    public String toString() {
        return "Soldier";
    }
}

国王,确定执行链

public class King {

    RequestHandler chain;

    public King() {
        chain = buildChain();
    }

    private RequestHandler buildChain() {
        return new Commander(new Officer(new Soldier(null)));
    }

    public void markRequest(Request request) {
        chain.handlerRequest(request);
    }
}

测试

  @Test
    public void chainTest(){
        King king = new King();
        Request request = new Request(RequestType.COLLECT_TAX,"soldier handle");
        king.markRequest(request);
        System.out.println(request.isHandled());
    }

类图
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设计模式之责任链模式(Chain) 的相关文章

  • C++ 装饰器模式

    什么是装饰器模式 装饰器模式是一种结构型设计模式 实现了在不改变现有对象结构的的同时又拓展了新的功能 装饰器本质上是对现有对象的重新包装 同时装饰器又称为封装器 如何理解装饰器模式 以笔记本电脑为例 当我们购买了一台新笔记本电脑 但我们发现
  • 设计模式的 C++ 实现---工厂方法模式(二)

    前文回顾 单例模式 一 单例模式 二 观察者模式 简单工厂模式 工厂方法模式 一 前言 对于工厂方法模式 当增加新产品时 也需要对应增加一个工厂类 可以使用模版进行封装 减少代码工作量 实现举例 产品抽象基类 class Animal pu
  • java需会(转载)

    一 基础篇 1 1 Java基础 面向对象的特征 继承 封装和多态 final finally finalize 的区别 Exception Error 运行时异常与一般异常有何异同 请写出5种常见到的runtime exception i
  • 计算资源合并模式——云计算架构常用设计模式

    背景 云计算的解决方案中 最初设计可能有意遵循关注点分离的设计原则 把操作分解为独立的计算单元以便可以单独托管和部署 然而 虽然这种策略可以帮助简化解决方案的逻辑实现 但是在同一个应用程序中要部署大量的计算单元 这会增加运行时的托管成本 并
  • 设计模式——简单工厂模式

    简单工厂模式定义为 简单工厂模式又称为静态工厂方法模型 它属于类创建型模式 在简单工厂模式中 可以根据参数的不同返回不同类的实例 简单工厂专门定义一个类来负责创建其他类的实例 被创建的实例通常都具有共同的父类 简单工厂模式结构图 简单工厂模
  • 设计模式学习之装饰器模式

    装饰器 Decorator 模式跟适配器 Adapter 模式一样 属于构建型设计模式 在学习适配器模式的时候说过 适配器模式的重点在复用能力 装饰器模式的重点在扩展能力 换言之 装饰器模式是先复用后扩展 这也导致了很多人跟适配器模式混淆
  • 分享几个项目中用到的设计模式

    前言 之前项目中出于扩展性和有雅性的考虑 使用了多种设计模式进行项目框架的设计 主要的一些设计模式是单例模式 工厂模式 策略模式 责任链模式 代理模式这几种 现在依次讲讲这几个的主要是实现方式和在我们项目中的应用场景 核心设计模式分享 单例
  • [设计模式]模板方法模式(Template Method)

    1 意图 定义一个操作中的算法的骨架 而将一些步骤延迟到子类中 TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 2 动机 其实就是如意图所描述的 算法的骨架是一样的 就是有些特殊步骤不一样 就可以
  • 设计模式(不懂)

    面试中经常问到设计模式 我才对这个东西了解了一下 才发现他是没有开发的新大陆 是oo设计的更高级别 能把设计模式搞懂 那oo你就搞的差不多了 随便看了还是很有意思的 虽然不怎么懂 百科名片 相关书籍 设计模式 Design pattern
  • 如何在 JavaScript 中创建可链接函数?

    让我们想象一下这样的函数 function foo x x return x 它的用法如下 var x y x Notepad y foo x console log y Prints Notepad 我正在寻找一种方法来创建可与其他函数链
  • servlet中filter和chain有什么用?

    chain doFilter req res 我们在 servlet 程序中使用了它 我想知道这个方法有什么用doFilter 在 servlet 中 另外 Java servlet 中的过滤器和链概念有什么用 Servlet 过滤器是责任
  • 执行流程链

    public void ExecuteProcessChain string asProcesses string sInRedirect string sOutRedirect Process p1 new Process p1 Star
  • 设计模式—迭代器模式解析

    本文参考学习了 图解设计模式 中的代码实现和原理解释 迭代器模式 简介 Iterator 模式用于在数据集合中按照顺序遍历集合 就类似于我们的循环 一个个去遍历一个集合中的所有元素 示例代码 首先我们思考一个书本和书架的关系 显然 书架可以
  • 谁能想到Java多线程设计模式竟然能被图解,大佬就是大佬,太牛了

    设计模式 Design pattern 代表了最佳的实践 通常被有经验的面向对象的软件开发人员所采用 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案 这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的
  • 设计模式 原型模式 与 Spring 原型模式源码解析(包含Bean的创建过程)

    原创 疯狂的狮子Li 狮子领域 程序圈 2023 12 19 10 30 发表于辽宁 原型模式 原型模式 Prototype模式 是指 用原型实例指定创建对象的种类 并且通过拷贝这些原型 创建新的对象 原型模式是一种创建型设计模式 允许一个
  • 设计模式(3)--对象结构(5)--外观

    1 意图 为子系统中的一组接口提供一个一致的界面 Facade模式定义了一个高层接口 这个接口使得 这一子系统更加容易使用 2 两种角色 子系统 Subsystem 外观 Facade 3 优点 3 1 对客户屏蔽了子系统组件 减少了客户处
  • Typescript 和 __proto__ 属性

    因此 每次提到 proto 后通常都会提到 Brendan Eich 请求不要使用它 我一直在使用 Typescript 进行一些反射 使用它将类的原型链导航到提供的祖先类 并且希望注入保存类元数据的单个原型属性 有谁知道我可能产生的性能开
  • 如何在 C++ 中从向量中链接删除对?

    我有这个文本文件 我将每一行读入std vector
  • AngularJS 承诺链

    我的应用程序应该打开一个弹出窗口 要求用户确认 然后进行 ajax cal 并关闭弹出窗口 我尝试使用一链来做到这一点promise 我已经使用过它 我记得它应该以这种方式工作 但它似乎在调用后阻塞reservationService co
  • 如何Moq Fluent接口/链方法

    我正在使用 Daniel Cazzulino 的 moq 框架 kzu 版本 4 10 1 我想要最小起订量 这样我就可以测试功能的特定部分 下面是我可以提取的代码的简单版本 流畅 链方法的设计是为了让您可以通过 Id 获取对象 并在需要时

随机推荐

  • openwrt在7620A上对fat格式U盘的支持

    openwrt刷好的固件 在7620a上运行时 可以看到设备节点 但是mount一直提示codepage cp437 not found make menuconfig发现 确实对cp437没有选 路径在Kernel modules gt
  • Swift5.X版本StoreKit原生内购

    内购是移动端一值在讨论的话题 每次上架内购功能要做好被拒的准备 小萌在2年前也做过内购 是OC版本 回想那段往事一把血泪呀 被拒了无数次才把内购功能送上AppStore 小萌之前的OC内购 中间也经历了不少的困难 详情请看苹果内购审核那些被
  • stc单片机使用外部中断+EC11编码器实现计数功能

    stc单片机使用外部中断 EC11编码器实现计数功能 相关篇 STC15 8单片机特有的PWM寄存器和普通定时器实现PWM输出 串口输出测试效果 EC11编码器原理图 EC11编码器输出信号说明 检测说明 以EC11 A信号作为一个时钟基准
  • 基于session的验证方式和Token验证方式的区别,以及JWT的具体实现流程

    1 传统的cookie认证过程 长期以来 基于Session的认证 Session based authentication 一直处于主流地位 由于http协议是无状态的 借助cookie 客户端登陆成功后 服务端就能识别其后续请求 而不需
  • 一篇文章帮你搞定JQuery

    一篇文章帮你搞定JQuery 1 动画 1 1 三种方式显示和隐藏事实 1 1 1 默认显示和隐藏方式 1 1 2 滑动显示和隐藏方式 1 1 3 淡入淡出显示和隐藏方式 2 遍历 2 1 js的遍历方式 2 2 jq的遍历方式 3 事件绑
  • 腾讯云函数SCF初探

    前不久的微信开发者大会上在推他们的Serverless架构 即他们的产品腾讯云函数SCF 当然这个也不是新鲜的事物 在亚马逊提供的同类服务叫做lambda 阿里云提供的则叫做函数计算 Cloudflare的则名为workers 在编程语言的
  • CUnit介绍

    http blog csdn net jiantiantian article details 3546887 一 概述 二 详细介绍 1 测试函数的书写 2 CUnit提供的断言 3 注册所要进行的测试 4 运行测试和测试报告的生成 5
  • 【JAVA】我们该如何规避代码中可能出现的错误?(一)

    个人主页 个人主页 系列专栏 初识JAVA 文章目录 前言 三种类型的异常 异常处理 JAVA内置异常类 Exception 类的层次 前言 异常是程序中的一些错误 但并不是所有的错误都是异常 并且错误有时候是可以避免的 学习一些异常处理方
  • 笔记本式计算机处理器,最新的笔记本计算机处理器(CPU)性能排名

    笔记本电脑最重要的硬件是CPU 中央处理器 它的质量直接关系到计算机的性能 CPU不好 其他硬件也很好 计算机性能也不好 因此 购买笔记本电脑时 务必要考虑CPU性能 以下编辑器分享了笔记本计算机的CPU性能排名 让我们看一下 笔记本CPU
  • UPC——放牛奶的冰箱(二分法)

    题目描述 冬冬在古子城购买了一台冰箱 冰箱内部可以表示为高度为h 深度为1 宽度为2的矩阵 最初冰箱底部只有一个架子 但冬冬可以在任何一个格子顶部放隔板 隔板的宽为2 不占用任何空间 将冰箱内部分隔成上 下两部分 冬冬有n瓶牛奶要按顺序放入
  • java 关于Map的key可不可以是自定义对象的学习

    JAVA 关于Map的key可不可以是自定义对象的学习 虽说经常用map 但是我用它的时候 key都是用String或者Integer类型 我相信大多数人都会是这样用的 哈哈 今天偶然想到 可不可以用自己定义的对象作为map的key呢 因为
  • Python入门练习判断题

    1 1 1 1 高级语言程序要被机器执行 只有用解释器来解释执行 1分 答案 错误 1 2 1 2 不可以在同一台计算机上安装多个不同的Python解释器版本 1分 答案 错误 1 3 1 3 Python是一种跨平台 开源 免费的动态编程
  • 自控重温1

    自控第一章 1 基本概念 1 自动控制 2 自动控制相关历史 2 自控 要素 1 系统描述 这里主要是讲解对于同一个线性系统的不同描述方式 而不是教你如何对系统进行建模 2 控制方法 如何施加外作用实现控制 控制信号 偏差 控制器 3 被控
  • 深圳二手房房价分析及预测

    分析目标 通过处理后的房价数据 筛选对房价有显著影响的特征变量 确定特征变量 建立深圳房价预测模型并对假设情景进行模拟 数据预处理 import pandas as pd import os file path D Python数据分析与挖
  • 外排序 归并排序 超级详细 拜托点赞

    外排序 就是比如说你在文件中你有很大的数组 你无法一起加载到内存中 只能一部分一部分的加载带内存中 然后对它进行排序 他的思想就是 我先分为几份 然后对每一份先排序 排完序后我再进行归并排序 具体步骤程序都标注明白了 请看程序注释就可以 拿
  • 字符串查找增强:findstr

    在文件中寻找字符串 FINDSTR B E L R S I X V N M O F file C string G file D dir list A color attributes OFF LINE strings drive path
  • cnn中的超参数参数设置_了解更快的r cnn配置参数

    cnn中的超参数参数设置 When I first started creating the Faster R CNN model using TensorFlow Object Detection API I couldn t find
  • jq移除某个元素样式

    执行 示例 select removeCss color select removeCss color border width function fn removeCss function options var type typeof
  • 关于git-u、--set-upstream和--set-upstream-to参数的理解

    1 git branch 既可以使用 set upstream又可以使用 set upstream to 但是前者已经被弃用 用法 git branch set upstream to origin mybranch1 mybranch1
  • 设计模式之责任链模式(Chain)

    设计模式之责任链模式 Chain 本篇为 https github com iluwatar java design patterns tree master chain 阅读笔记 意图 避免请求发送者与接收者耦合在一起 让多个对象都有可能