设计模式之-责任链模式(Chain of Responsibility)

 责任链模式是一种对象的行为模式。在责任链模式里,不少对象由每个对象对其下家的引用而链接起来造成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪个对象最终处理这个请求,这使得系统能够在不影响客户端的状况下动态地从新组织和分配责任。设计模式

在如下条件下可考虑使用Chain of Responsibility:框架

1.有多个的对象能够处理一个请求,哪一个对象处理该请求运行时刻自动肯定。ide

2.你想在不明确指定接受者的状况下,想过个对象中的一个提交一个请求。测试

3. 可处理一个请求的对象集合应该被动态指定。this

回想到,Struts2就是基于Filter(StrutsPrepareAndExecuteFilter)来继承的框架,Struts2中访问Action共须要通过不少拦截器,在struts-default.xml文件中能够进行查看,具体截图以下:.net

    恰巧如今放在在装修,模仿Struts2拦截器的方式实现一下责任链设计模式,场景以下:如今不少的装修公司都是承包制,大的装修公司先在客户手中承包下项目,而后交由中型装修公司进行装修,可是中型装修公司可能还会将项目承包给小型装修公司。这之间在装修结束后固然会涉及到工程验收了,那么流程应该是小装修公司本身先进行验收,没问题以后交于中型装修公司验收,以后再交于大型装修公司验收,最后交到个人手中。哇奥~个人房子居然被传递了这么屡次(扯淡),废话不说,代码以下:debug

/**
 * 
 * @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;
    }xml

}

/**
 * 
 * @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{

    大公司验收

}

以上就是责任链模式的实例。不知道你感受是这样的吗,哈哈

相关文章
相关标签/搜索