java 设计模式 -- 责任链模式
设计模式 – 责任链模式
介绍:
责任链模式是一种动态行为模式,有多个对象,每一个对象分别拥有其下家的引用。连起来形成一条链。待处理对象则传到此链上,在此链进行传递,且待处理对象并不知道此会被链上的哪个对象处理,这使得我们能够动态的添加链上的对象而且分配责任。
纯责任链和非纯责任链
责任链分为两种。纯责任链和非纯责任链。
纯责任链是待处理对象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 设计模式 -- 责任链模式的更多相关文章
- 【设计模式】Java设计模式 - 责任链模式
[设计模式]Java设计模式 - 责任链模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 目录 [设计模式]Java设计模式 - 责 ...
- 我的Java设计模式-责任链模式
今天来说说程序员小猿和产品就关于需求发生的故事.前不久,小猿收到了产品的需求. 产品经理:小猿,为了迎合大众屌丝用户的口味,我们要放一张图,要露点的. 小猿:......露点?你大爷的,让身为正义与纯 ...
- Java设计模式-责任链模式
提出问题: 最初接触责任链模式就是在struts2中,在当时学的时候看了一眼,大概知道了原理,最近在复习,模拟struts2,说是模拟只是大体模拟了struts2的工作流程,很多东西都是写死的,只是为 ...
- Java设计模式の责任链模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...
- Java设计模式-责任链模式(Chain of Responsibility)
接下来我们将要谈谈责任链模式,有多个对象,每个对象持有对下一个对象的引用,这样就会形成一条链,请求在这条链上传递,直到某一对象决定处理该请求.但是发出者并不清楚到底最终那个对象会处理该请求,所以,责任 ...
- Java设计模式—责任链模式
责任链模式的定义: 使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止. 责任链模式的重点是在"链& ...
- 浅谈Python设计模式 -- 责任链模式
声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 之前在最开始就聊了Python设计模式有三种,其中关于创建型和结构型设计模式基本 ...
- Java与设计模式-责任链模式
责任链模式属于行为型设计模式之中的一个,怎么理解责任链?责任链是能够理解成数个对象首尾连接而成,每个节点就是一个对象.每个对象相应不同的处理逻辑,直至有一个对象响应处理请求结束.这一种模式成为责任链模 ...
- php 23种设计模式 - 责任链模式
责任链模式 责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行 ...
随机推荐
- 【05】react 之 组件state
1.1. 状态理解 React的数据流:由父节点传递到子节点(由外到内传递),如果顶层组件某个prop改变了,React会向下传递,重新渲染所有使用过该属性的组件.除此之外React 组件内部还具有 ...
- ios - 工具类
这几天看项目,把俺旁边小哥哥的一个工具类相中了,希望对大家有所帮助哦~~~~~~~~~ // // PLZ_Tool.h // // Created by penglaizhi on 2017/7/3 ...
- H5 基本标签使用 浅析 (含video标签、input表单等)
1. 音频标签<audio> <audio src = “./music/Alone.mp3” controls autoplay loop = “3” ></audio ...
- 序列统计(bzoj 4403)
Description 给定三个正整数N.L和R,统计长度在1到N之间,元素大小都在L到R之间的单调不降序列的数量.输出答案对10^6+3取模的结果. Input 输入第一行包含一个整数T,表示数据组 ...
- SQL优化 ASP.NET ADO.NET
原文发布时间为:2009-08-26 -- 来源于本人的百度文章 [由搬家工具导入] 总的考虑方向 1) 根据数据使用的方式来设计数据访问层 2) 缓存数据,避免不必要的操 ...
- 【winform】基于UserControl实现webBrower组件时html页面元素加载及onclick事件监听实现
[背景]基于System.Windows.Forms.UserControl实现的webBrower组件在html内使用window.external调用winform事件失败. [解决思路]借助wi ...
- C# 用实例来理解IComparable和IComparer
通过Array的Sort方法来理解的 Sort方法要 通过对象去继承IComparable接口来实现排序(当然也有其它办法),我想入门这可能就是对这句话有点不理解,在下面会有注释 using Syst ...
- hdu 3440(差分约束好题)
House Man Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- hdu 1788(多个数的最小公倍数)
Chinese remainder theorem again Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 ...
- Codeforces Gym100814 B.Unlucky Teacher (ACM International Collegiate Programming Contest, Egyptian Collegiate Programming Contest (2015) Arab Academy for Science and Technology)
今日份的训练题解,今天写出来的题没有昨天多,可能是因为有些事吧... 这个题就是老师改卷子,忘带标准答案了,但是他改了一部分卷子,并且确定自己改的卷子没出错,他想从改过的卷子里把标准答案推出来. 因为 ...