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)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行 ...
随机推荐
- 满汉全席(banquet)
满汉全席(banquet) 题目描述 满汉全席是中国最丰盛的宴客菜肴,有许多种不同的材料透过满族或是汉族的料理方式,呈现在數量繁多的菜色之中.由于菜色众多而繁杂,只有极少數博学多闻技艺高超的厨师能够做 ...
- 【一个比较bug free的二分写法】
lower_bound: [l, r)区间内大于等于val的第一个位置 int lower_bound(int l, int r, int val){ while(l < r){ ); if(a ...
- 自己搭建了一个blog
https://svtt.sinaapp.com 利用JustWriting开源项目搭建的,不过还是有些许问题.但是考虑到自己的blog好处多多,暂且用着--有时间或者乐趣来了,自己再用wordpre ...
- 解决ie8下页面刚出现时候的晃动问题
出现这个问题的原因的页面的高度超过一屏,这个时候需要在开始的时候给 html,body {overflow:scroll;overflow-x:hidden}; 这样就可以解决这个问题了
- 【01】Vue 之hello wolrd
1.1. Vue简介 Vue是一个前端的双向绑定类的框架,发音[读音 /vjuː/, 类似于 view].新的Vue版本参考了React的部分设计,当然也有自己独特的地方,比如Vue的单文件组件开发方 ...
- Jib构建你的第一个java镜像
jib Official:GoogleContainerTools/jib 本文示例完整demo github地址 github.com/moxingwang/- 想要了解并且使用jib,首先你得知道 ...
- Reactor Cooling(ZOJ 2314)
题意: 给n个点,及m根pipe,每根pipe用来流躺液体的,单向的,每时每刻每根pipe流进来的物质要等于流出去的物质,要使得m条pipe组成一个循环体,里面流躺物质. 并且满足每根pipe一定的流 ...
- 洛谷 [P3623] 免费道路
有 k 条特殊边的生成树 我们发现有一些边是必须的,如果把所有的水泥路都加入并查集,再枚举鹅卵石路,如果这条路能再次加入并查集,说明这条路是必须的 水泥路同样 这样就把必需边求出来了,剩下就可以随意加 ...
- AVRStudio 6 设置F_CPU时钟频率
具体如下: 1>右键项目属性 2>根据语言选择一下,C或C++
- android基本控件学习-----ImageView
ImageView的讲解 一.src和background的区别 background我们通常理解是背景,而src是内容,当使用src填入图片的时候是以图片的大小直接填充,并不会进行拉伸,而backg ...