设计模式 – 责任链模式

介绍:

责任链模式是一种动态行为模式,有多个对象,每一个对象分别拥有其下家的引用。连起来形成一条链。待处理对象则传到此链上,在此链进行传递,且待处理对象并不知道此会被链上的哪个对象处理,这使得我们能够动态的添加链上的对象而且分配责任。


纯责任链和非纯责任链

责任链分为两种。纯责任链和非纯责任链。

纯责任链是待处理对象request在处理对象handler链上传递,每一个处理对象handler处理request的一部分,到终于处理完毕。非纯责任链则是待处理对象request在处理对象handler链上传递,每一个处理对象handler要么把request拿出来所有处理。要不就不处理。留给下一个handler。


实现(非纯责任链):

场景:

必须满足一定的条件时处理对象(handler)才干处理待处理对象(request)。否则在责任链中传递下去,代码中我用的是能力值abilityToValue,handler满足能力值大于request就可以处理。否则在责任链中传递下去。

Handler.java

/**
* Created by wwh on 15-7-30.
*/
public abstract class Handler { /* 能力值 */
protected int abilityToValue = 0; /* 持有下一个对象的引用 */
protected Handler nextHandler; /* 详细的处理方法 */
public abstract void handleRequest(int vaule); /* 得到下一个对象的引用 */
public Handler getNextHandler(){
if(nextHandler != null) {
return nextHandler;
}
else{
/* 到达责任链末尾。未能处理 */
System.out.println("该待处理对象被责任链放过...");
}
return null;
} /* 设置后继的处理对象 */
public void setNextHandler(Handler nextHandler){
if(nextHandler != null) {
this.nextHandler = nextHandler;
}else{
System.out.println("到达末尾,设置完毕责任链");
}
}
} class HandlerRequest_one extends Handler{
/* 设置能力值 */
HandlerRequest_one(int atv){
this.abilityToValue = atv;
}
/* 详细的处理请求方法 */
@Override
public void handleRequest(int value) {
/* 假设处理对象的能力值在100-200范围内。那么处理此请求,
否则没有能力处理此请求,交给下一个handler */
if(abilityToValue > value){
System.out.println("HandlerRequest_one 处理请求");
}else{
System.out.println("HandlerRequest_one 放过请求。传递给下一个Handler");
if(getNextHandler() != null)
getNextHandler().handleRequest(value);
}
}
} class HandlerRequest_two extends Handler{
/* 设置能力值 */
HandlerRequest_two(int atv){
this.abilityToValue = atv;
} @Override
public void handleRequest(int value) {
/* 假设处理对象的能力值在200-400范围内,那么处理此请求,
* 否则没有能力处理此请求,交给下一个handler */
if(abilityToValue > value){
System.out.println("HandlerRequest_two 处理请求");
}else{
System.out.println("HandlerRequest_two 放过请求。传递给下一个handler");
if(getNextHandler() != null)
getNextHandler().handleRequest(value);
}
}
}

request.java

/**
* Created by wwh on 15-7-30.
*/
public class Request {
public int ablity;
Request(int ablity){ this.ablity = ablity; }
public static void main (String[] args) throws Exception{
Handler hd1 = new HandlerRequest_one(100);
Handler hd2 = new HandlerRequest_two(500);
hd1.setNextHandler(hd2);
/* 情况1 */
Request req1 = new Request(50);
hd1.handleRequest(req1.ablity);
System.out.println("-------------------------");
/* 情况2 */
Request req2 = new Request(300);
hd1.handleRequest(req2.ablity);
System.out.println("-------------------------");
/* 情况3 */
Request req3 = new Request(500);
hd1.handleRequest(req3.ablity);
}
}

结果:


责任链模式在java中应用非常多,除了近期在看的netty中的Pipeline,还有Servlet中的过滤器(Filter),Struts2的拦截器(Interceptor)。


长处and缺点:

长处:

请求者与处理者代码分离:减少了耦合度。

缺点:责任链像一条链表一样,效率可能会有问题。

不能保证请求一定被收到


贴张网上图片

java 设计模式 -- 责任链模式的更多相关文章

  1. 【设计模式】Java设计模式 - 责任链模式

    [设计模式]Java设计模式 - 责任链模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 目录 [设计模式]Java设计模式 - 责 ...

  2. 我的Java设计模式-责任链模式

    今天来说说程序员小猿和产品就关于需求发生的故事.前不久,小猿收到了产品的需求. 产品经理:小猿,为了迎合大众屌丝用户的口味,我们要放一张图,要露点的. 小猿:......露点?你大爷的,让身为正义与纯 ...

  3. Java设计模式-责任链模式

    提出问题: 最初接触责任链模式就是在struts2中,在当时学的时候看了一眼,大概知道了原理,最近在复习,模拟struts2,说是模拟只是大体模拟了struts2的工作流程,很多东西都是写死的,只是为 ...

  4. Java设计模式の责任链模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...

  5. Java设计模式-责任链模式(Chain of Responsibility)

    接下来我们将要谈谈责任链模式,有多个对象,每个对象持有对下一个对象的引用,这样就会形成一条链,请求在这条链上传递,直到某一对象决定处理该请求.但是发出者并不清楚到底最终那个对象会处理该请求,所以,责任 ...

  6. Java设计模式—责任链模式

    责任链模式的定义: 使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止. 责任链模式的重点是在"链& ...

  7. 浅谈Python设计模式 -- 责任链模式

    声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 之前在最开始就聊了Python设计模式有三种,其中关于创建型和结构型设计模式基本 ...

  8. Java与设计模式-责任链模式

    责任链模式属于行为型设计模式之中的一个,怎么理解责任链?责任链是能够理解成数个对象首尾连接而成,每个节点就是一个对象.每个对象相应不同的处理逻辑,直至有一个对象响应处理请求结束.这一种模式成为责任链模 ...

  9. php 23种设计模式 - 责任链模式

    责任链模式 责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行 ...

随机推荐

  1. SQLalchemy 使用记录

    1.models.py中添加该方法,可通过该方法转dict #驼峰 def to_hump_dict(self): return {commonUtils.str2Hump(c.name): geta ...

  2. uoj 131/bzoj 4199 [NOI2015]品酒大会 后缀树+树d

    题目大意 见uoj131 分析 题目的提示还是很明显的 \(r\)相似就就代表了\(0...r-1\)相似 建出后缀树我们能dfs算出答案 再后缀和更新一下即可 注意 细节挺多的,但数据很良心 不然我 ...

  3. FCKEDITOR配置说明

    原文发布时间为:2009-10-12 -- 来源于本人的百度文章 [由搬家工具导入] fckeditor config.js配置2009-02-13 14:36 FCKConfig.CustomCon ...

  4. cookie中存储json

    原文发布时间为:2009-12-14 -- 来源于本人的百度文章 [由搬家工具导入] http://www.denisdeng.com/?p=563 最近的一个项目需要在cookie中存储json对象 ...

  5. (二)docker的部署安装,配置,基础命令

    一.docker 的安装部署 这里不过多介绍,下面这两个linux发型版 安装可以参考 ubuntu的 docker-ce安装 centos7的 docker-ce安装 二.docker配置文件 重要 ...

  6. Python Challenge 第十三关

    第13关.一张电话的图片,一句话:phone that evil.看到电话,加上之前关卡有些图片有链接,我就在电话按键上都点点试试,果然 5 是个链接,就点了进去.出来一个XML文件,第一句写着:Th ...

  7. Linux centos 时间不同步 date 和 hwclock 时间不一致

    Linux centos 时间不同步 date 和 hwclock 网站有两台服务器,date 查看差3分钟 在应用 APP倒计时 与 直播,时时性较强的功能应用中 请求服务器后返回的服务器时间与数据 ...

  8. ios圆角优化-不掉帧

    因网络图片加载用的是SDWebImage所以下面以sd加载图片为例 //普通的加载网络图片方式(已不能满足需求,需要改进) [self sd_setImageWithURL:url placehold ...

  9. extern "C"解析

    转自大牛的解析(非常具体详细)http://www.cnblogs.com/skynet/archive/2010/07/10/1774964.html 我做个简单的标注方便以后自己查看: 在用C++ ...

  10. 关联分析(Apriori算法)

    两个概念: 频繁项集:常出现的物品集合 关联分析:找到诸如:尿布-->啤酒的关联,反过来则是另一条 两个控制参数: 项集的支持度(support):一个项集出现的次数在所有样本中出现的比例 可信 ...