当前位置: 首页 > 编程日记 > 正文

设计模式之五 责任链模式(Chain of Responsibility)

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

一. 场景

相信我们都有过这样的经历;

我们去职能部门办理一个事情,先去了A部门,到了地方被告知这件事情由B部门处理;

当我们到了B部门的时候,又被告知这件事情已经移交给了C部门处理;

这时我们又顶着炎热的天气跑到了C部门,被告知这件事情并不是由C处理,要到D部门去... ...

这就是一个责任链模式,将多个部门组成一条责任链,然后按照在链上的顺序依次找到负责部门来处理问题;

二. 应用

我们假定有一个数字需要处理;

2.1 定义发生问题的类Trouble

/*** Created by Administrator on 2018/8/20.** 要处理的问题*/
@ToString
@Data
@AllArgsConstructor
public class Trouble {private Integer number;}

2.2 定义解决问题的抽象类


/*** Created by Administrator on 2018/8/20.** 责任链抽象类*/
public abstract class Support {/*** 责任链的名字*/private String name;/*** 责任链的下一个节点*/private Support nextSupport;public Support(String name) {this.name = name;}/*** 执行责任链的下一个节点*/public Support setNextSupport(Support nextSupport){this.nextSupport = nextSupport;return nextSupport;}/*** 解决问题的抽象方法,供子类实现*/protected abstract boolean resolve(Trouble trouble);/*** 解决问题的步骤*/public final void support(Trouble trouble){if (resolve(trouble)){haveDone(trouble);} else if (this.nextSupport != null){this.nextSupport.support(trouble);} else {failDone(trouble);}}/*** 解决问题后执行的方法*/protected void haveDone(Trouble trouble){System.out.println(String.format("%s have been resolved by %s .", trouble, this));}/*** 未能解决问题执行的方法*/protected void failDone(Trouble trouble){System.out.println(String.format("%s can't be resolved .", trouble));}
}

2.3 定义处理类实现类

2.3.1 不处理任何数字的类

/*** Created by Administrator on 2018/8/20.** 该类什么也不处理*/public class NoSupport extends Support {public NoSupport(String name) {super(name);}@Overrideprotected boolean resolve(Trouble trouble) {return false;}
}

2.3.2 只处理小于给定数字的类


/*** Created by Administrator on 2018/8/20.** 只处理小于定义的数字*/
public class LessSupport extends Support{private Integer lessNumber;public LessSupport(String name, Integer lessNumber) {super(name);this.lessNumber = lessNumber;}@Overrideprotected boolean resolve(Trouble trouble) {return trouble.getNumber() < this.lessNumber;}
}

2.3.3 只处理指定数字

/*** Created by Administrator on 2018/8/20.** 只能处理特定的数字*/
public class SpecialSupport extends Support {/*** 指定只能处理的数字*/private Integer specialNumber;public SpecialSupport(String name, Integer specialNumber) {super(name);this.specialNumber = specialNumber;}@Overrideprotected boolean resolve(Trouble trouble) {return trouble.getNumber().equals(this.specialNumber);}
}

2.3.4 只处理奇数

/*** Created by Administrator on 2018/8/20.* <p>* 处理奇数*/
public class OddSupport extends Support {public OddSupport(String name) {super(name);}@Overrideprotected boolean resolve(Trouble trouble) {return trouble.getNumber() % 2 == 0 ;}
}

至此,责任链节点定义完毕

2.4 运行

2.4.1 main

/*** Created by Administrator on 2018/8/20.*/
public class Main {public static void main(String[] args) {//首先定义节点Support noSupport = new NoSupport("A");Support lessSupport = new LessSupport("B",10);Support oddSuuport = new OddSupport("C");Support specialSuuport = new SpecialSupport("D",30);noSupport.setNextSupport(lessSupport).setNextSupport(oddSuuport).setNextSupport(specialSuuport);//执行noSupport.support(new Trouble(5));}
}

2.4.2 运行结果

Trouble(number=5) have been resolved by com.chainofresponsibility.LessSupport@270421f5 .

至此,责任链模式演示完毕;

3.模式分析

3.1 角色解析

在责任链模式中,一共登场了3个角色:

  • 处理者接口
  • 具体的处理者实现类
  • 请求者

我们在编写责任链模式时要注意者三个角色;

3.2 模式对比

责任链模式使得每个处理类只关注自己要处理的场景,处理工作更加专注;如果不符合,则抛到下一个处理节点,我们不必指定专门的处理类,更加弱化了处理的角色;

在这里我想到了策略模式,我们往往需要利用工厂来根据传入的参数指定特定的处理类来处理,而责任链模式实际上恰恰的弱化了这一环节,我们不必知道交给链条的问题到底是哪一个节点来处理;

4. 动态改变责任链

...待续...

转载于:https://my.oschina.net/JackieRiver/blog/1931100

相关文章:

django 中文乱码或不识别

django是一个不错的WEB开源框架。今天测试&#xff0c;发现有些页面中文乱码&#xff0c;肯定是编码哪儿出了问题。 django配置要修改项目根目录的settings.py中的&#xff1a; TIME_ZONE America/Chicago LANGUAGE_CODE en-us 替换成&#xff1a; TIME_ZONE Asia/Shanghai …

【TX2】安装NVIDIA SDK Manager(JetPack 4.6)后,下载kernel和u-boot源码

1、先确认版本号 官网&#xff1a;L4T 32.6.1 is included as part of JetPack 4.6 2、下载源码 执行同步代码命令&#xff1a; ~/nvidia/nvidia_sdk/JetPack_4.6_Linux_JETSON_TX2_TARGETS/Linux_for_Tegra$ ./source_sync.sh 根据提示&#xff0c;输入1中查询到的版本号t…

忽略这一点,人工智能变人工智障!

作者 | The Economist译者 | 弯月&#xff0c;责编 | 伍杏玲出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;【编者按】当今社会&#xff0c;人工智能已进入我们生活的方方面面&#xff0c;很多人会担心算法的控制权过多&#xff0c;也有人担心数据有偏差的话&…

Loader 入门【Webpack Book 翻译】

原文链接&#xff1a;https://survivejs.com/webpack...翻译计划&#xff1a;https://segmentfault.com/a/11...附言&#xff1a;因为发现书中一些内容单独放出来会比较尴尬&#xff0c;所以会跳过部分章节&#xff0c;当然完整版会全部翻译&#xff0c;已经正在研究原版的网站…

backtrack X server 启动不了

本来安装好了啥事没有的。 自己硬想能不用打startx直接启动X server的 于是加了 if [ -z ... 的代码 到 ~/.xinitrc 结果X server就再也启动不了了 花了2个小时? 检索【inappropriate ioctl for device (25)】 有一篇文章提到了 xinitrc, 我才想起来好像是编辑了这个文件&…

【FFmpeg】windows下的库下载

1、官网 http://ffmpeg.org/ 2、点击下载,选择windows 左侧库下载,右侧源码下载 3、二进制库下载 官方网址:https://www.gyan.dev/ffmpeg/builds/#release-builds 4、gihub上的二进制镜像

19行关键代码,带你轻松入门PaddlePaddle单机训练

刚接触深度学习框架的同学可能会说新入手一个框架是不是会很难?NO&#xff0c;NO&#xff0c;NOPaddlePaddle的宗旨就是“easy to use&#xff01;”PaddlePaddle是百度自研的集深度学习框架、工具组件和服务平台为一体的技术领先、功能完备的开源深度学习平台&#xff0c;有全…

用WinForm/WPF代码来为.NET Core 3.0功能投票

我们在5月报道过微软希望在.NET Core 3.0上运行WinForms和WPF。为了实现这个目标&#xff0c;他们正在构建一个新工具&#xff0c;该工具将允许你投票以决定他们需要把哪些API移植到.NET Core。但是&#xff0c;这不是一次直接进行的投票&#xff0c;而是基于你的应用程序正在使…

【FFmpeg】RTSP、RTMP相关命令及开源项目

一、RTSP转RTMP 海康摄像头:抓取 rtsp 流然后转换成 rtmp 推流出去 主码流 ffmpeg -i “rtsp://[用户名]:[密码]@192.168.1.100/h265/ch1/main/av_stream” -f flv -r 25 -s 1920x1080 -an rtmp://localhost/live/a ffmpeg -i “rtsp://[用户名]:[密码]@192.168.1.100:554/h2…

Day13 python基础---内置函数1

一&#xff0c;内置函数&#xff1a; 1.什么是内置函数 就是python给你提供的&#xff0c;拿来直接用的函数&#xff0c;比如print,input等等&#xff0c;截止到python版本3.6.2,现在pyhton一共为我们提供了69个内置函数。 2.作用域相关 # 作用域相关 ****** # globals() :返回…

百度大脑开放日第三期:四大全新平台、两大场景方案助力开发者逐梦 AI

人工智能正走在从技术攻坚到嵌入大众生活的历史进程中&#xff0c;这离不开千万开发者的助力&#xff0c;但开发者也需要“被赋能”。5 月 30 日&#xff0c;第三期百度大脑开放日在深圳微漾国际创客空间如期举行&#xff0c;再一次向开发者、行业人士展现了百度大脑的 AI 技术…

SQuirreL SQL Client 使用记录

如果您的工作要求您在一天之中连接许多不同的数据库 &#xff08;oracle、DB2、mysql、postgresql、Sql Server等等&#xff09;&#xff0c;或者你经常需要在多个不同种类的数据库之间进行数导入导出。那么SQuirreL SQL Client 将会是比较理想的数据库客户端链接工具。 简单介…

使用Zabbix通过BMC管理口监控HP服务器

概述 本文的环境&#xff1a;Zabbix版本为3.4&#xff0c;一台Server&#xff0c;一台Porxy&#xff0c;一台agent。Porxy主动抓取agent的状态并sender到Server。 首先需要保证服务器的BMC口能够联网&#xff0c;并且拥有管理用户和密码&#xff0c;Proxy和agent能够保持联网。…

刚刚,百度宣布王海峰升任CTO

作者 | 夕颜、一一出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;导读&#xff1a;5 月 31 日&#xff0c;百度宣布&#xff0c;百度原高级副总裁王海峰升任百度 CTO&#xff0c;成为百度在组织大变革中一批“敢打硬仗”的代表人物得到晋升的典型。在百度人事动荡之…

【FFmpeg】结构体详解(一):AVCodec、AVCodecContext、AVCodecParserContext、AVFrame、AVFormatContext 、AVIOContext

FFmpeg结构体详解 一、FFmpeg中最关键的结构体之间的关系1、解协议(http,rtsp,rtmp,mms)2、解封装(flv,avi,rmvb,mp4)3、解码(h264,mpeg2,aac,mp3)4、存数据二、结构体详解1、AVCodec 是存储编解码器信息的结构体。1.1 enum AVMediaType type1.2 enum AVCodecID id1.3 co…

大一新生,你为何逃课?

昨晚不知在哪看到对现在大学生的描述&#xff0c;说现在的大学生30%的时间在应对无聊的思政课&#xff0c;30%的时间在忙着考英语等级&#xff0c;剩下40%的时间在忙着花前月下&#xff0c;“还忙不过来”&#xff0c;虽然不是全部大学生都这样&#xff0c;但也确实有不少的学生…

【FFmpeg】结构体详解(二):AVStream、AVPacket、AVOutputFormat

FFmpeg结构体详解 7、AVStream8、AVPacket9、AVOutputFormat7、AVStream AVStream 是存储每一个视频/音频流信息的结构体。 重要的变量如下所示: int index: 标识该视频/音频流 AVCodecContext *codec: 指向该视频/音频流的AVCodecContext(它们是一一对应的关系) AVR…

谷歌 Fuchsia 上手体验,将取代Android/win10

2019独角兽企业重金招聘Python工程师标准>>> 在手机市场领域&#xff0c;Google表现很抢眼&#xff0c;毫无疑问&#xff0c;Android 至今在移动操作系统的市场份额占据绝对领先地位&#xff0c;但是 Android 仍然存在不少问题&#xff0c;碎片化问题严重&#xff0…

美亚Kindle排名第一的Python 3入门书,火遍了整个编程圈

“大多数优秀的程序员从事编程工作&#xff0c;不是因为期望获得报酬或得到公众的称赞&#xff0c;而是因为编程是件有趣的事儿。”——林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;在美国亚马逊&#xff0c;有一本书的影响力超高的Python入门书&#xff0c;Kindle版本…

seo笔记——搜索显示

一、搜索显示的几个列表形式 1、经典搜索结果列表&#xff1a; 用户搜索时&#xff0c;出现的第一行都是网页的标题&#xff08;title&#xff09;&#xff0c;颜色醒目的部分是用户搜索的相关内容&#xff1b; 使用百度搜索则第二第三行是网页的说明内容&#xff08;Des…

【FFmpeg】函数详解(一)

FFmpeg函数详解 一、错误码相关1、AVERROR2、av_strerror3、其他错误码解释二、编解码1、获取编解码器2、申请、释放上下文环境3、打开编码器avcodec_open24、分配一个 AVFrame:av_frame_alloc5、av_frame_get_buffer6、avformat_alloc_output_context27、avformat_new_stream…

第5章 图像分类的数据集

第5章图像分类的数据集 在我们实际进入到代码编写阶段来构建分类器之前&#xff0c;我们首先回顾下在本书中用到的数据集。一些数据集可理想的获得大于95%的准确率&#xff0c;另一些则还在开放研究阶段&#xff0c;还有一些是图像分类竞赛的部分数据集。 现在就对这些数据集进…

一根烟上热搜,先让AI看看你的肺

作者 | 李翔&#xff0c;国内某互联网大厂AI民工&#xff0c;前携程酒店图像技术负责人&#xff0c;计算机视觉和深度学习重度爱好者&#xff0c;在ICCV和CVPR等会议上发表论文十余篇&#xff1b;马杰超&#xff0c;任职于某医学图像创业公司&#xff0c;医学图像AI领域资深从业…

mongodb主从设置,capped collections等常用命令集合

############### Mongodb 主 <> 从切换的时候要删除 ############## ############### use local ############################### ############## db.sources.remove() ############################### # 主#/data/mongodb-linux-x86_64-2.0.2/bin/mongod --por…

调侃吴恩达,Diss特斯拉,吐槽OpenAI…《AI寒冬将至》作者点评2019“AI小丑秀”...

作者 | Piekniewski编译 | 夕颜出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;导读&#xff1a;去年&#xff0c;一篇《AI寒冬将至》的文章在AI圈爆红&#xff0c;作者观点鲜明地指出AI领域出现泡沫&#xff0c;并预言AI寒冬将会到来&#xff0c;引起巨大争议。一年…

max_semi_space_size 设置值与实际值不一致的原因分析

问题由来 因为业务的需求&#xff0c;某 Node.js 性能平台用户需要调节新生代大小&#xff0c;Node.js 的启动参数里面的max_semi_space_size可以设置新生代堆空间的大小。 node --v8-options | grep max_semi -A 3 -B 2--min_semi_space_size (min size of a semi-space (in M…

【FFmpeg】函数详解(二)

FFmpeg函数详解 9、av_dump_format10、avio_open11、avformat_write_header12、avcodec_send_frame13、avcodec_receive_packet9、av_dump_format 原型: void av_dump_format(AVFormatContext *ic, int index, const char *url, int is_output);说明: 打印输入输出格式的详…

【Visual C++】游戏开发笔记二十七 Direct3D 11入门级知识介绍

游戏开发笔记二十七 Direct3D 11入门级知识介绍作者&#xff1a;毛星云 邮箱&#xff1a; happylifemxy163.com 期待着与志同道合的朋友们相互交流上一节里我们介绍了在迈入DirectX 11的学习旅程之后第一个demo创建的全过程。但由于知识衔接的需要&#xff0c;我们的第一…

英特尔蚕食AMD和NVIDIA?

作者 | Daniel Newman译者 | 苏本如&#xff0c;责编 | 郭芮转载自CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;【编者按】一个鲜为人知的事实是&#xff0c;英特尔凭借其在集成显卡上的领先地位&#xff0c;持续占据着电脑显卡市场的头把交椅。但是随着过去两年中首席…

使用phpStudy运行伊人集项目

1.首次运行时&#xff0c;需要把system/config/install.look.php以及system/config/database.php&#xff08;后面这个文件可以先不删除&#xff0c;若是安装过程中数据库报错&#xff0c;再来删除它&#xff09;删除2.若只有一个项目版本需要运行的话&#xff0c;可以把项目拷…