责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。
在以下条件下可考虑使用Chain of Responsibility:
1.有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
2.你想在不明确指定接受者的情况下,想过个对象中的一个提交一个请求。
3. 可处理一个请求的对象集合应该被动态指定。
回想到,Struts2就是基于Filter(StrutsPrepareAndExecuteFilter)来继承的框架,Struts2中访问Action共需要经过很多拦截器,在struts-default.xml文件中可以进行查看,具体截图如下:
恰巧现在放在在装修,模仿Struts2拦截器的方式实现一下责任链设计模式,场景如下:现在很多的装修公司都是承包制,大的装修公司先在客户手中承包下项目,然后交由中型装修公司进行装修,但是中型装修公司可能还会将项目承包给小型装修公司。这之间在装修结束后当然会涉及到工程验收了,那么流程应该是小装修公司自己先进行验收,没问题之后交于中型装修公司验收,之后再交于大型装修公司验收,最后交到我的手中。哇奥~我的房子竟然被传递了这么多次(扯淡),废话不说,代码如下:
/**
*
* @describe:公共过滤器接口
* @author wenqi 2017年12月4日
*
*/
public interface Filter {
public void doFilter(Request request, Response response,FilterChain chain);
}
/**
*
* @describe:请求的毛坯房
* @author wenqi 2017年12月5日
*
*/
public class Request {
public String RoughHouse;//毛坯房
public Request(String RoughHouse){
this.RoughHouse=RoughHouse;
}
}
/**
*
* @describe:响应的装修房
* @author wenqi 2017年12月5日
*
*/
public class Response {
public String decorateHouse;//装饰房
public Response(String decorateHouse){
this.decorateHouse=decorateHouse;
}
}
/**
*
* @describe:过滤器链
* @author wenqi 2017年12月5日
*
*/
public class FilterChain implements Filter{
List<Filter> filters=new ArrayList<Filter>();
private int index=0;
//将过滤器增加到当前过滤器链中
public FilterChain addFilter(Filter filter){
this.filters.add(filter);
return this;
}
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
if(index==filters.size()){//当索引值等于过滤器总数时,直接返回
return;
}
Filter f=filters.get(index);//获取当前过滤器
index++;
f.doFilter(request, response, chain);//执行当前过滤器方法
}
}
/**
*
* @describe:大型装修公司过滤器
* @author wenqi 2017年12月5日
*
*/
public class BigCompanyFilter implements Filter{
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
System.out.println(request.RoughHouse+"经过了【大】型装修公司承包装修~");
chain.doFilter(request, response, chain);
System.out.println(response.decorateHouse+"经过了【大】型装修公司承包验收!");
}
}
/**
*
* @describe:中型装修公司过滤器
* @author wenqi 2017年12月5日
*
*/
public class MiddlingFilter implements Filter{
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
System.out.println(request.RoughHouse+"经过了【中】型装修公司承包装修~");
chain.doFilter(request, response, chain);
System.out.println(response.decorateHouse+"经过了【中】型装修公司承包验收!");
}
}
/**
*
* @describe:小型装修公司过滤器
* @author wenqi 2017年12月5日
*
*/
public class SmallFilter implements Filter{
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
System.out.println(request.RoughHouse+"经过了【小】型装修公司承包装修~");
chain.doFilter(request, response, chain);
System.out.println(response.decorateHouse+"经过了【小】型装修公司承包验收!");
}
}
/**
*
* @describe:测试类
* @author wenqi 2017年12月5日
*
*/
public class Test {
public static void main(String[] args) {
Request req=new Request("毛坯房");
Response res=new Response("装修盖");
//创建过滤器链
FilterChain chain=new FilterChain();
chain.addFilter(new BigCompanyFilter())
.addFilter(new MiddlingFilter())
.addFilter(new SmallFilter()
);
//按照顺序执行过滤器的doFilter方法
chain.doFilter(req, res, chain);
}
}
运行结果:
毛坯房经过了【大】型装修公司承包装修~
毛坯房经过了【中】型装修公司承包装修~
毛坯房经过了【小】型装修公司承包装修~
装修盖经过了【小】型装修公司承包验收!
装修盖经过了【中】型装修公司承包验收!
装修盖经过了【大】型装修公司承包验收!
debug调试顺序:
从其中的调试情况可以看出采用的是栈(先进后出)的方式进行的请求有响应。
其中的伪代码如下:
if(大公司处理){
自己处理一部分
if(交给中型公司处理一部分){
中型公司处理一部分
if(交给小型公司处理一部分){
小型公司处理一部分
}else{
小型公司验收
}
}else{
中型公司验收
}
}else{
大公司验收
}
以上就是责任链模式的实例。不知道你感觉是这样的吗,哈哈