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)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行 ...
随机推荐
- mongodb使用1
首先官网下载mongodb放在根目录下.新建db文件夹,在命令行中进入bin路径,然后运行mongod开启命令,同时用--dbpath指定数据存放地点为“db”文件夹 mongod --dbpath= ...
- 海拔(bzoj 2007)
Description YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作一个 正方形,每一个区域也可看作一个正方形.从而,YT城市中包括(n+1) ...
- 【HDOJ5514】Frogs(容斥原理)
题意:n个青蛙在一个有m个节点的圆上跳,m个节点的标号为0-m-1,每只青蛙每次跳的节点数给出,让求n只青蛙所跳位置标号之和 n<=1e4,m<=1e9,a[i]<=1e9 思路:由 ...
- 读扇区错误:0柱面0磁头1扇区(硬盘问题,蓝屏等 0x0000007B)
原文发布时间为:2010-05-25 -- 来源于本人的百度文章 [由搬家工具导入] 读扇区错误:0柱面0磁头1扇区(硬盘问题,蓝屏等 0x0000007B) DISKGEN能找到,那就没什么大问题的 ...
- Docker(五):镜像
一,什么是镜像? Docker的镜像文件是由文件系统叠加而成的.最底端是一个引导文件系统,即bootfs.Docker用户几乎永远没有机会和引导文件有什么交互,实际上,当一个容器启动之后,容器就会被移 ...
- boost 库的下载和编译_Visual Studio 2013(转)
原文转自 http://blog.csdn.net/lp310018931/article/details/47791143 原文转自 http://m.blog.csdn.net/article/d ...
- 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---36
以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:
- vscode Go 1.11.4 编译错误 need Delve built by Go 1.11 or later
更新golang的版本为1.11.4之后vscode编译错误:executables built by Go 1.11 or later need Delve built by Go 1.11 or ...
- hdu 4524(模拟)
郑厂长系列故事——逃离迷宫 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tot ...
- 网络请求失败记录(安卓4g网络下第一次请求特别慢或者失败)
最近app的一次版本上线以后出现4g网络下请求接口特别慢,第一次调用接口非常非常慢或者直接访问失败,后面就正常了,但是WiFi情况下并不会出现这个问题.最主要的是IOS的线上app并没有问题. 开始怀 ...