十八、职责链模式-推卸责任,不关我的事,我不管!#和设计模式一起旅行#
不在其位,不谋其政! –出自《论语·泰伯》
故事背景
在现实世界中,有很多情况下会遇到一些推卸责任的场景,比如要办理一件事的时候,被告诉你要去做个做这个事情,但是去了这个地方,确告诉要到另一个地方去,最后搞了很久,才办完这一件事。
这种情况下,就可以简单的称为踢皮球,也就是推卸责任。
在软件中,当外部请求程序进行某个出来,这个程序无法处理就把该请求转给其他对象负责,当对个对象组成在一起,就成为一个职责链。
说白就是:当一个人被要求做什么事情的时候,如果他自己可以做就自己做,如果不能做就将“要求”转为另一个人处理,下一个如果可以自己处理,就直接处理,如果不能处理依旧转为另一个人,这就是 Chain of Responsibility模式。
故事主角
职责链模式(Chain of Responsibility Pattern):避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。职责链模式是一种对象行为型模式。
在职责链模式结构图中包含如下几个角色:
Handler(抽象处理者):它定义了一个处理请求的接口,一般设计为抽象类,由于不同的具体处理者处理请求的方式不同,因此在其中定义了抽象请求处理方法。因为每一个处理者的下家还是一个处理者,因此在抽象处理者中定义了一个抽象处理者类型的对象(如结构图中的successor),作为其对下家的引用。通过该引用,处理者可以连成一条链。
ConcreteHandler(具体处理者):它是抽象处理者的子类,可以处理用户请求,在具体处理者类中实现了抽象处理者中定义的抽象请求处理方法,在处理请求之前需要进行判断,看是否有相应的处理权限,如果可以处理请求就处理它,否则将请求转发给后继者;在具体处理者中可以访问链中下一个对象,以便请求的转发。
需要注意:职责链模式并不创建职责链,职责链的创建工作必须由系统的其他部分来完成,一般是在使用该职责链的客户端中创建职责链。职责链模式降低了请求的发送端和接收端之间的耦合,使多个对象都有机会处理这个请求。
武功修炼
使用责任链模式实现,讲一句话进行过滤。实现过程参考java web中的filter!也顺便让大家了解filter的简单的实现!
将 <p> 已经很晚了 ,888 ,晚安!</p>
处理为 哈哈 已经很晚了 ,888 ,晚安!啊啊
// request 请求类
public class Request {String requestStr;public String getRequestStr() {return requestStr;}public void setRequestStr(String requestStr) {this.requestStr = requestStr;}
}
// 响应类
public class Response {String responseStr;public String getResponseStr() {return responseStr;}public void setResponseStr(String responseStr) {this.responseStr = responseStr;}
}
//过滤器链
public class FilterChain {private List<Filter> filters = new ArrayList<>();int index = 0;public List<Filter> getFilters() {return filters;}public FilterChain addFilters(Filter filter) {filters.add(filter);return this;}public void doFilter(Request request, Response response,FilterChain filterChain) {if(index == filters.size()) {return;}Filter f = filters.get(index);index++;f.doFilter(request,response,this);}}
// 过滤器接口
public interface Filter {void doFilter(Request request, Response response, FilterChain filterChain);
}
// 过滤器
public class HTMLFilter implements Filter {@Overridepublic void doFilter(Request request, Response response,FilterChain filterChain) {request.setRequestStr(request.getRequestStr().replace("<p>", "哈哈"));request.setRequestStr(request.getRequestStr().replace("</p>", "啊啊"));System.out.println("request--> HTMLFilter : " + request.getRequestStr());filterChain.doFilter(request, response, filterChain);response.setResponseStr(response.getResponseStr() + "--> HTMLFilter");}
}
// 过滤器
public class NumberFilter implements Filter{@Overridepublic void doFilter(Request request, Response response, FilterChain filterChain) {request.setRequestStr(request.getRequestStr().replace("888", "发发发"));System.out.println("request--> NumberFilter : " + request.getRequestStr());filterChain.doFilter(request, response, filterChain);response.setResponseStr(response.getResponseStr() + "--> NumberFilter");}
}
public class TestFilter {public static void main(String[] args) {String msg = "哈哈 已经很晚了 ,888 ,晚安!啊啊";Request request = new Request();request.setRequestStr(msg);Response response = new Response();response.responseStr = "response";FilterChain filterChain = new FilterChain();filterChain.addFilters(new HTMLFilter()).addFilters(new NumberFilter());filterChain.doFilter(request,response,filterChain);System.out.println("过滤后结果:" + request.requestStr);System.out.println(response.responseStr);}
}
request--> HTMLFilter : 哈哈 已经很晚了 ,888 ,晚安!啊啊
request--> NumberFilter : 哈哈 已经很晚了 ,发发发 ,晚安!啊啊
过滤后结果:哈哈 已经很晚了 ,发发发 ,晚安!啊啊
response--> NumberFilter--> HTMLFilter
总结
职责链模式通过建立一条链来组织请求的处理者,请求将沿着链进行传递,请求发送者无须知道请求在何时、何处以及如何被处理,实现了请求发送者与处理者的解耦。
Web应用开发中创建一个过滤器(Filter)链来对请求数据进行过滤就是很好的职责链模式,上面例子就是简单实现filter中的职责链模式的代码。
优点:
- 请求和处理之间解耦
- 明确职责和职责的分派
- 新增职责的时候,无须修改代码
缺点:
对于比较长的职责链,请求的处理可能涉及到多个处理对象,系统性能将受到一定影响,而且在进行代码调试时不太方便。
如果建链不当,可能会造成循环调用,将导致系统陷入死循环
Next 期待下一篇吧!下一篇讲讲原型模式!
参考
- 史上最全设计模式导学
- 《Head First 设计模式》
- 《图解设计模式》
本专栏文章列表
一、设计模式-开篇—为什么我要去旅行? #和设计模式一起旅行#
二、设计模式-必要的基础知识—旅行前的准备 #和设计模式一起旅行#
三、设计模式介绍—她是谁,我们要去哪里? #和设计模式一起旅行#
四、单例模式—不要冒充我,我只有一个! #和设计模式一起旅行#
五、工厂模式—旅行的钱怎么来 #和设计模式一起旅行#
六、策略模式—旅行的交通工具 #和设计模式一起旅行#
七、观察者模式——关注我,分享旅途最浪漫的瞬间! #和设计模式一起旅行#
八、装饰者模式—巴厘岛,奶茶店的困扰! #和设计模式一起旅行#
九、命令模式—使用命令控制奶茶店中酷炫的灯 #和设计模式一起旅行#
十、模板方法模式—制作更多好喝的饮品! #和设计模式一起旅行#
十一、代理模式 —专注,做最好的自己!#和设计模式一起旅行#
十二、适配器模式——解决充电的烦恼 #和设计模式一起旅行#
十三、外观模式—— 简化接口 #和设计模式一起旅行#
十四、迭代器模式—— 一个一个的遍历 #和设计模式一起旅行#
十五、组合模式—— 容器与内容的一致性 #和设计模式一起旅行#
十六、状态模式—用类表示状态 #和设计模式一起旅行#
十七、访问者模式-访问数据结构并处理数据 #和设计模式一起旅行#
十八、职责链模式-推卸责任,不关我的事,我不管!#和设计模式一起旅行#
十九、原型模式—通过复制生产实例 #和设计模式一起旅行#
二十、设计模式总结—后会有期 #和设计模式一起旅行#
如果您觉得这篇博文对你有帮助,请点赞或者喜欢,让更多的人看到,谢谢!
如果帅气(美丽)、睿智(聪颖),和我一样简单善良的你看到本篇博文中存在问题,请指出,我虚心接受你让我成长的批评,谢谢阅读!
祝你今天开心愉快!
欢迎访问我的csdn博客,我们一同成长!
不管做什么,只要坚持下去就会看到不一样!在路上,不卑不亢!
十八、职责链模式-推卸责任,不关我的事,我不管!#和设计模式一起旅行#相关推荐
- 设计模式-责任链(职责链)模式及责任链设计模式的应用
1.什么是责任链设计模式 责任链设计模式主要构成有抽象处理者.具体处理者.客户类,在处理请求的时候,将请求通过客户类发送至处理链路上,这样所有处理对象都有机会处理请求,使发送者与接受者解耦 在责任链模 ...
- JAVA设计模式之责任链模式(职责链模式)
转自JAVA设计模式之责任链模式(职责链模式) 责任链/职责链(Chain of Responsibility)模式的定义 为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理 ...
- atitit.设计模式(1)--—职责链模式(chain of responsibility)最佳实践O7 日期转换
atitit.设计模式(1)---职责链模式(chain of responsibility)最佳实践O7 日期转换 1. 需求:::日期转换 1 2. 可以选择的模式: 表格模式,责任链模式 1 3 ...
- 设计模式之职责链模式(图解+例题+java源码)
模式定义 职责链模式(Chain of Responsibility Pattern):避免请求发送者和接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连成一条链,并且沿着这条链传递请求,直到 ...
- 设计模式与软考试题之职责链模式
2007年下半年软件设计师考试下午试题最后一题考查职责链模式(责任链模式),原题如下: [全国计算机技术与软件专业技术资格(水平)考试 2007年下半年 软件设计师 下午试卷] 注:当年试题五.试题六 ...
- C#设计模式之二十职责链模式(Chain of Responsibility Pattern)【行为型】
一.引言 今天我们开始讲"行为型"设计模式的第八个模式,该模式是[职责链模式],英文名称是:Chain of Responsibility Pattern.让我们看看现实生活中的例 ...
- 步步为营 .NET 设计模式学习笔记 十九、Chain of Responsibility(职责链模式)
概述 在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果显示指定,将必不可少地带来请求发送者与接受者的紧耦合. 如何使请求的发送者不需要指定具体的接受者?让请求的 ...
- java 职责链模式_Java中的责任链模式
java 职责链模式 当应有几个处理器来执行某项操作并为这些处理器定义特定顺序时,就需要采用责任链设计模式. 在运行时处理器顺序的可变性也很重要.模式的UML表示如下: 处理程序定义处理器对象的一般结 ...
- Java设计模式——责任链模式(职责链模式)详解
模式的定义与特点 责任链(Chain of Responsibility)模式的定义:为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链:当 ...
最新文章
- PyTorch图像分类从模型自定义到测试
- eNSP模拟器路由器无法正常启动一直显示“#”——问题解决方法
- HDU 1010 Tempter of the Bone heuristic 修剪
- 经典设计模式——策略模式
- 荣耀V40值得购买吗?玩游戏是一把好手!
- 计算机专业需要注意什么细节,计算机专业考生复试注意事项
- HDU1000 HDU1089-HDU1096 A+B for Input-Output Practice (I)-(VIII)(入门必备训练)
- Java class反编译工具
- 虚幻引擎编程基础(二)
- Excel 取消分页符
- 正则判断数字加下划线加数字
- it运维工程师的工作是做什么的?累吗?
- XCEL查找SQL SERVER数据库的数据
- 如何把50多张jpg图片合成一张PDF图片?——下载了破解版PS也不怎么会用的傻瓜极简做法用Word一招解决
- 架构师推荐书籍 一
- WIN10+VS2015部署PanddleOCR
- 2018计算机二级html,2020年全国计算机二级Web程序设计考试大纲(2018年版)
- Echarts中国地图与世界地图实战
- endata 电影票房响应数据破解
- Java基础:华为云java基础函数题(一)