设计模式之责任链模式(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) 的相关文章

  • YOLOV3实战6:显示中文标签(YOLOV3中文标签)

    一 番外说明 大家好 我是小P 今天在此给大家分享一下基于DarknetAB版本的YOLOV3如何生成和显示中文标签的方法 效果如下图所示 希望大家支持和喜欢 此外 对 目标检测 模型压缩 语义分割 感兴趣的小伙伴 欢迎加入QQ群 8132

随机推荐

  • 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 阅读笔记 意图 避免请求发送者与接收者耦合在一起 让多个对象都有可能