ChainOfResponsiblity责任链模式。
一系列对象之间的消息传递形成了线性的或循环的传递结构,例如A可以传给B,B可以传给C,C可以传给D……当条件不满足传递时,就停止传递。
例如,客户端对象发出一个请求给服务端处理,而客户端只知道服务端有n个服务对象可以对这个请求作出响应,但是客户端并不清楚哪个服务端对象是最合适处理这个请求的。最原始的处理方式,就是在客户端程序进行n个if else的语句判断。当服务端在添加一个服务处理对象时,便在客户端再添加一个if else,就这样如此循环不断的进行下去。
可见这样的代码的质量相当低劣,是如何的不高明,难以维护扩展。利用责任链的作法是,在客户端创建出那些可以对请求作出响应的服务端的对象实例,然后设置服务对象之间的传递关系,接着把请求消息传递给第一个服务对象,交给服务对象之间进行内部判断究竟哪个是适合作出响应的。其中服务对象之间的传递关系的实现,类似于单向链表的实现。
public abstract class Service{
private Service nextService;
public Service() {/*...*/}
public abstract void response(Request request);
public Service getNextService() {
return nextService;
}
public void setNextService(Service service) {
nextService = service;
};
}
class FService extends Service {
private int flag = 1;
public FService() {/*...*/}
public void response(Request request) {
int flag = request.getFlag();
if (flag == this.flag) {
System.out.println("响应");
} else {
getNextService().response(request);
}
}
}
class SService extends Service {
private int flag = 2;
public SService() {/*...*/}
public void response(Request request) {
int flag = request.getFlag();
if (flag == this.flag) {
System.out.println("响应");
} else {
getNextService().response(request);
}
}
}
public class Client{
private static Request request = null;
private static FService fs = null;
private static SService ss = null;
public static void main(String[] args) {
request = new Request(2);
fs = new FSservice();
ss = new SService();
fs.setNextService(ss);
fs.response(request );
}
}
class Request{
prviate int flag;
public Request(int flag){this.flag = flag;}
public int getFlag(){return this.flag;}
}
其实,以servlet中的filter作为责任链的经典例子,是最好不过的了。过滤器的实现跟上面的例子有所不同,首先每个过滤器向一个过滤器链的管理器FilterChain注册,在每个过滤器Filter的doFilter(ServletRequest request,ServletResponse response,FilterChain chain)方法里面调用FilterChain的chain.doFilter(request,response);方法,由FilterChain实现调用下一个过滤器。实现的代码大概如下:
public interface Filter{
public void init(FilterConfig config) throws ServletException;
public void doFilter(ServletRequest srequest,ServletResponse sresponse,FilterChain chain)throws IOException,ServletException;
public void destroy();
}
public FilterChain{
private List list = new Vector();
private int currentFilter = 0;
private int totalFilter = 0;
public void addFilter(Filter filter){
list.add(filter);
totalFilter++;
}
public void doFilter(ServletRequest request,ServletResponse response){
/*......*/
if(currentFilter==totalFilter)
return;
((Filter)list.get(currentFilter++)).doFilter();
/*......*/
}
}
public class MyFilter implements Filter {
public void init(FilterConfig config) throws ServletException {/*...*/}
public void destroy(){/*...*/}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException,ServletException {/*...*/chain.doFilter();}
}
分享到:
相关推荐
S - Single-responsiblity principle 单一责任原则 O - Open-closed principle 开发封闭原则 L - Liskov substitution principle 里氏替换原则 I - Interface segregation principle 接口分离原则 D - Dependency ...
情况2:从层1开始的自底向上的操作链过程。 情况3:如果层N-1能够满足要求,顶层的请求仅到达层N-1就足够了,不需要再向下层传递请求。 分层系统风格是软件结构设计中的一种常见的体系结构风格,它具有许多优点,...
This sample represents a new project that is NOT currently adhering to Single Responsiblity Principle 本练习的重点: •SOLID表示完整的代码•遵循“单一职责原则”的类具有单一职责-更具体地说:单个原因...
每个子系统都有其特定的功能和 responsiblity,旨在满足银行业务的需求。 储蓄业务子系统主要提供人民币和外币的储蓄业务,包括活期储蓄和整存整取定期储蓄两种。贷款业务子系统主要用于实现客户贷款方面的需求,...
基于java的贝儿米幼儿教育管理系统答辩PPT.pptx
本压缩包资源说明,你现在往下拉可以看到压缩包内容目录 我是批量上传的基于SpringBoot+Vue的项目,所以描述都一样;有源码有数据库脚本,系统都是测试过可运行的,看文件名即可区分项目~ |Java|SpringBoot|Vue|前后端分离| 开发语言:Java 框架:SpringBoot,Vue JDK版本:JDK1.8 数据库:MySQL 5.7+(推荐5.7,8.0也可以) 数据库工具:Navicat 开发软件: idea/eclipse(推荐idea) Maven包:Maven3.3.9+ 系统环境:Windows/Mac
基于java的消防物资存储系统答辩PPT.pptx
项目经过测试均可完美运行! 环境说明: 开发语言:java jdk:jdk1.8 数据库:mysql 5.7+ 数据库工具:Navicat11+ 管理工具:maven 开发工具:idea/eclipse
项目经过测试均可完美运行! 环境说明: 开发语言:java jdk:jdk1.8 数据库:mysql 5.7+ 数据库工具:Navicat11+ 管理工具:maven 开发工具:idea/eclipse
TA_lib库(whl轮子),直接pip install安装即可,下载即用,非常方便,各个python版本对应的都有。 使用方法: 1、下载下来解压; 2、确保有python环境,命令行进入终端,cd到whl存放的目录,直接输入pip install TA_lib-xxxx.whl就可以安装,等待安装成功,即可使用! 优点:无需C++环境编译,下载即用,方便
使用软件自带的basic脚本编辑制作的脚本 低版本软件无法输出Excel报告,可以通过脚本方式实现这一功能
基于java的就业信息管理系统答辩PPT.pptx
25法理学背诵逻辑.apk.1g
基于java的大学生校园兼职系统答辩PPT.pptx
做到代码,和分析的源数据
本压缩包资源说明,你现在往下拉可以看到压缩包内容目录 我是批量上传的基于SpringBoot+Vue的项目,所以描述都一样;有源码有数据库脚本,系统都是测试过可运行的,看文件名即可区分项目~ |Java|SpringBoot|Vue|前后端分离| 开发语言:Java 框架:SpringBoot,Vue JDK版本:JDK1.8 数据库:MySQL 5.7+(推荐5.7,8.0也可以) 数据库工具:Navicat 开发软件: idea/eclipse(推荐idea) Maven包:Maven3.3.9+ 系统环境:Windows/Mac
项目经过测试均可完美运行! 环境说明: 开发语言:java jdk:jdk1.8 数据库:mysql 5.7+ 数据库工具:Navicat11+ 管理工具:maven 开发工具:idea/eclipse
适用于ensp已经入门人群的学习,有一定难度
基于java的数码论坛系统设计与实现答辩PPT.pptx
tornado-6.4.1-cp38-abi3-macosx_10_9_universal2.whl