Chain of Responsibility 责任链模式
简介
责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其【下家】的引用而连接起来形成一条链,请求在这个链上【传递】,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。责任链模式屏蔽了请求的处理过程,你发起一个请求到底是谁处理的,这个你不用关心,只要你把请求抛给责任链的第一个处理者,最终会返回一个处理结果(当然也可以不做任何处理),作为请求者可以不用知道到底是需要谁来处理的,这是责任链模式的核心。责任链有一个缺点是,大家在开发的时候要注意,调试不是很方便,特别是链条比较长,环节比较多的时候,由于采用了类似递归的方式,调试的时候逻辑可能比较复杂。适用性1.有多个的对象可以处理一个请求,具体哪个对象处理该请求在运行时刻自动确定。2.你在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。3.可处理一个请求的对象集合应被动态指定。作用:请求会被链上的对象处理,但是客户端不知道请求会被哪些对象处理通过把请求从一个对象传递到链条中下一个对象的方式,直到请求被处理完毕,以实现对象间的解耦。JDK中体现:(1)java.util.logging.Logger会将log委托给parent logger(2)ClassLoader的委托模型
简易演示-1
中国古代对妇女制定了“三从四德”的道德规范,“三从”是指“未嫁从父、既嫁从夫、夫死从子”,也就是说一个女性,在没有结婚的时候要听从于父亲,结了婚后听从于丈夫,丈夫死了还要听儿子的。举个例子来说,一个女的要出去逛街,同样这样的一个请求,在她没有出嫁前她必须征得父亲的同意,出嫁之后必须获得丈夫的许可,那丈夫死了怎么办?一般都是男的比女的死的早,还要问问儿子是否允许自己出去逛街。父亲、丈夫、儿子只有两种选择:要不承担起责任来告诉她允许或不允许逛街,要不就让她请示下一个人,这是整个社会体系的约束,应用到我们项目中就是业务规则,那我们来看怎么把“三从”通过我们的程序来实现。public class Test2 {public static void main(String[] args) {//定义三个请示对象Handler father = new Father();Handler husband = new Husband();Handler son = new Son();//设置请示顺序father.setNext(husband);husband.setNext(son);//随机挑选几个女性ArrayList<IWomen> arrayList = new ArrayList<IWomen>();for (int i = 0; i < 5; i++) {arrayList.add(new Women(new Random().nextInt(4), "我要出去逛街"));}//处理请示for (IWomen women : arrayList) {father.HandleMessage(women);}}}interface IWomen {/**获得个人状况*/public int getType();/**获得个人请示,你要干什么?出去逛街?约会?还是看电影*/public String getRequest();}class Women implements IWomen {/** 描述妇女的个人状况 1---未出嫁 2---出嫁 3---夫死 */private int type = 0;/**请示内容*/private String request = "";public Women(int _type, String _request) {this.type = _type;switch (this.type) {//为了显示好看点,我在这里做了点处理case 1:this.request = "女儿的请求是:" + _request;break;case 2:this.request = "妻子的请求是:" + _request;break;case 3:this.request = "母亲的请求是:" + _request;break;}}@Overridepublic int getType() {return this.type;}@Overridepublic String getRequest() {return this.request;}}abstract class Handler {/**能处理的状况*/private int type = 0;/**责任传递,下一个人责任人是谁*/private Handler nextHanlder;public Handler(int type) {this.type = type;}//一个女性(女儿,妻子或者是母亲)要求逛街,你要处理这个请求public final void HandleMessage(IWomen women) {if (women.getType() == this.type) response(women);//自己处理else if (nextHanlder != null) nextHanlder.HandleMessage(women); //有后续环节,才把请求往后递送else System.out.println("-----------没有人可以请示了,不做处理!---------\n");//已经没有后续处理人了,不用处理了}public void setNext(Handler _handler) {this.nextHanlder = _handler;}/**回应*/public abstract void response(IWomen women);}/**父亲类,父亲只处理女儿的请求*/class Father extends Handler {public Father() {super(1);}@Overridepublic void response(IWomen women) {System.out.println("--------女儿向父亲请示-------");System.out.println(women.getRequest());System.out.println("父亲的答复是:同意\n");}}/**丈夫类,丈夫只处理妻子的请求*/class Husband extends Handler {public Husband() {super(2);}//丈夫请示的答复@Overridepublic void response(IWomen women) {System.out.println("--------妻子向丈夫请示-------");System.out.println(women.getRequest());System.out.println("丈夫的答复是:同意\n");}}/**儿子类*/class Son extends Handler {public Son() {super(3);}@Overridepublic void response(IWomen women) {System.out.println("--------母亲向儿子请示-------");System.out.println(women.getRequest());System.out.println("儿子的答复是:同意\n");}}
简易演示-2
/**请求 */public interface IRequest {public void request();}/**加薪请求 */class AddMoneyRequest implements IRequest {@Overridepublic void request() {System.out.print("加薪请求-->");}}/**离职请求 */class DimissionRequest implements IRequest {@Overridepublic void request() {System.out.print("离职请求-->");}}/**请假请求 */class LeaveRequest implements IRequest {@Overridepublic void request() {System.out.print("请假请求-->");}}/**请求处理接口 */public interface IRequestHandle {void handleRequest(IRequest request);}/**项目经理处理,审批AddMoneyRequest的请求 */class PMRequestHandle implements IRequestHandle {private IRequestHandle nextHandle;public PMRequestHandle(IRequestHandle rh) {this.nextHandle = rh;}@Overridepublic void handleRequest(IRequest request) {if (request instanceof AddMoneyRequest) System.out.println("项目经理审批完毕");else nextHandle.handleRequest(request);}}/**项目组长处理,审批LeaveRequest的请求*/class TLRequestHandle implements IRequestHandle {private IRequestHandle nextHandle;public TLRequestHandle(IRequestHandle rh) {this.nextHandle = rh;}@Overridepublic void handleRequest(IRequest request) {if (request instanceof LeaveRequest) System.out.println("项目组长审批完毕");else nextHandle.handleRequest(request);}}/**最后的审批者,人事处理,审批其他请求 */class LastRequestHandle implements IRequestHandle {@Overridepublic void handleRequest(IRequest request) {System.out.println("人事审批完毕");}}/*** 责任链模式。使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。* 将这些对象连成一条链,并沿着这条链【传递】该请求,直到有一个对象处理它为止。*/public class Test {public static void main(String[] args) {IRequest request1 = new DimissionRequest();IRequest request2 = new AddMoneyRequest();IRequest request3 = new LeaveRequest();IRequestHandle handle = new TLRequestHandle(new PMRequestHandle(new LastRequestHandle()));request1.request();handle.handleRequest(request1);request2.request();handle.handleRequest(request2);request3.request();handle.handleRequest(request3);System.out.println("\n");IRequestHandle handle2 = new PMRequestHandle(new TLRequestHandle(new LastRequestHandle()));//顺序无影响handle2.handleRequest(request1);handle2.handleRequest(request2);handle2.handleRequest(request3);}}
附件列表
Chain of Responsibility 责任链模式的更多相关文章
- 设计模式(13)--Chain of Responsibility(责任链模式)--行为型
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.模式定义: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一 ...
- 设计模式(一)Chain Of Responsibility责任链模式
设计模式篇章,源于网课的学习,以及个人的整理 在我们接收用户提交的字符时,常常会使用到过滤,在学习责任链模式前,我们是这样做的 1.定义一个类 public class MsgProcesser { ...
- Chain of Responsibility 责任链模式 MD
责任链模式 简介 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链,请求在这个链上[传递],直到链上的某一个对象决定处理此请求.发出这个请求的客户 ...
- python 设计模式之 (Chain of Responsibility)责任链模式
#写在前面 对于每一种设计模式,如果不理解它的原理和结构,是写不出例子来的.所以弄明白很重要. 等过完这段浑浑噩噩的日子,我要找个遍地开花的地方开怀大笑一场 #责任链模式定义 简书上一网友就把这个定义 ...
- 设计模式C++学习笔记之十七(Chain of Responsibility责任链模式)
17.1.解释 概念:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. main(),客户 IWom ...
- Chain of Responsibility - 责任链模式
定义 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合度. 案例 比方如今有一个图形界面,它包含一个应用Application类,一个主窗体Window,一个buttonButton ...
- 设计模式19:Chain Of Responsibility 职责链模式(行为型模式)
Chain Of Responsibility 职责链模式(行为型模式) 请求的发送者与接受者 某些对象请求的接受者可能有多种多样,变化无常…… 动机(Motivation) 在软件构建过程中,一个请 ...
- Design Pattern Chain of Reponsibility 责任链模式
本程序实现一个责任链模式查询人名的资料. 開始都是查询第一个人,问其是否有某人的资料,假设有就返回结果,假设没有第一个人就会询问第二个人,第二个人的行为和第一个人的行为一致的,然后一致传递下去,直到找 ...
- 设计模式学习笔记——Chain of Responsibility职责链模式
重点在链.一条链,如果本节点处理不了,则传递给下一个节点处理. 关键是如何传给下一个节点? 主要是由本节点决定传给哪一个节点. public class Client { public static ...
随机推荐
- Java认证:JavaRunnable线程编写接口代码
Java认证:JavaRunnable线程编写接口代码.JavaRunnable线程如何才能更好的适应目前的编程环境呢?下面我们就看看如何才能更好的进行相关环境.希望下面的文章对大家有所帮助.Java ...
- 一次性安装src.rpm编译所依赖的软件包
yum-builddep SRPMS/fcitx-4.2.8.4-4.1.cgdl21.src.rpm NAME yum-builddep - install missing depend ...
- Mac下搭建php开发环境
Mac OS X 内置了Apache 和 PHP,这样使用起来非常方便.本文以Mac OS X 10.6.3为例.主要内容包括: 启动Apache 运行PHP 安装MySQL 使用phpMyAdmin ...
- 在uboot上创建菜单
一.原理 菜单其实就是一个uboot中的命令,和其他的命令没有什么差别. uboot启动时,如果进入uboot命令模式,先运行这个命令,就会打印出一个菜单界面. 在uboot的命令模式,通过键入“m ...
- bzoj3864: Hero meet devil
Description There is an old country and the king fell in love with a devil. The devil always asks th ...
- 使用c语言编写cgi程序
http://blog.chinaunix.net/uid-22566367-id-3109877.html 简单的说,cgi是沟通HTML表单和服务器端程序的接口,是可以被其他语言所应用的一个规范集 ...
- [BZOJ 1084] [SCOI2005] 最大子矩阵 【DP】
题目链接:BZOJ - 1084 题目分析 我看的是神犇BLADEVIL的题解. 1)对于 m = 1 的情况, 首先可能不取 Map[i][1],先 f[i][k] = f[i - 1][k]; ...
- java 线程基本概念 可见性 同步
开发高性能并发应用不是一件容易的事情.这类应用的例子包括高性能Web服务器.游戏服务器和搜索引擎爬虫等.这样的应用可能需要同时处理成千上万个请求.对于这样的应用,一般采用多线程或事件驱动的架构.对于J ...
- jquery升级换代
其实从去年开始1.9以上新版的jquery已不再支持toggle方法和live方法. live用on方法替代. 话说这个方法确实挺方便的,那么怎么交替点击呢,html的checked属性我觉得不是很好 ...
- Maven实战四
转载:http://www.iteye.com/topic/1123231 为什么要定义Maven坐标 在我们开发Maven项目的时候,需要为其定义适当的坐标,这是Maven强制要求的.在这 ...