Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 321|回复: 0

[设计模式学习]java实现责任链模式

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-3 00:00:37 | 显示全部楼层 |阅读模式
    一、定义与结构
         从名字上大概也能猜出这个模式的大概模样――系统中将会存在多个有类似处理能力的对象。当一个请求触发后,请求将在这些对象组成的链条中传递,直到找到最合适的“责任”对象,并进行处理。

         《设计模式》中给它的定义如下:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。从定义上可以看出,责任链模式的提出是为了“解耦”,以应变系统需求的变更和不明确性。 下面是《设计模式》中给出的适用范围: 1) 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
    2) 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
    3) 可处理一个请求的对象集合应被动态指定。  
      
       
       
         
       

         
       
      
       责任链模式真的能给发送者和接收者之间解耦(这好像很神奇)吗?先来看下它的组成角色。这个问题我会在下面提及。责任链模式由两个角色组成: 1) 抽象处理者角色(Handler):它定义了一个处理请求的接口。当然对于链子的不同实现,也可以在这个角色中实现后继链。 2) 具体处理者角色(Concrete Handler):实现抽象角色中定义的接口,并处理它所负责的请求。如果不能处理则访问它的后继者。 至于类图不放也罢。毕竟就是一个继承或者实现。 二、纯与不纯 责任链模式的纯与不纯的区别,就像黑猫、白猫的区别一样。不要刻意的去使自己的代码来符合一个模式的公式。只要能够使代码降低耦合、提高重用,满足系统需求并能很好的适应变化就好了。正所谓:管它黑猫白猫,抓住老鼠就是好猫! 纯的责任链模式,规定一个具体处理者角色只能对请求作出两种动作:自己处理;传给下家。不能出现处理了一部分,把剩下的传给了下家的情况。而且请求在责任链中必须被处理,而不能出现无果而终的结局。 反之,则就是不纯的责任链模式。 不纯的责任链模式还算是责任链模式吗?比如一个请求被捕获后,每个具体处理者都尝试去处理它,不管结果如何都将请求再次转发。我认为这种方式的实现,算不算是责任链模式的一种倒不重要,重要的是我们也能从中体味到责任链模式的思想:通过将多个处理者之间建立联系,来达到请求与具体的某个处理者的解耦。
    过滤器接口: Filter package com.bjsxt.chain;   public interface Filter {     public void doFilter(Request request, Response response); }   实现类1 : Fillter1 package com.bjsxt.chain;   public class Filter1 implements Filter {       public void doFilter(Request request, Response response) {        String str = request.getRequestParameter();        str += " pass filter1 ";        request.setRequestParameter(str);     }   }   实现类2 package com.bjsxt.chain;   public class Filter2 implements Filter {          public void doFilter(Request request, Response response) {        String str = request.getRequestParameter();        str += " pass filter2 ";        request.setRequestParameter(str);     }   }   过滤链 import java.util.ArrayList; import java.util.List; public class Filterchain implements Filter {          List<Filter> filters = new ArrayList<Filter>();             public Filterchain addFilter(Filter filter) {        filters.add(filter);        return this;     }       public void doFilter(Request request, Response response) {        for (Filter f : filters) {            f.doFilter(request, response);        }     }      }   模拟request package com.bjsxt.chain;   public class Request {          private String requestParameter = "";       public String getRequestParameter() {        return requestParameter;     }       public void setRequestParameter(String requestParameter) {        this.requestParameter = requestParameter;     }   }   模拟response package com.bjsxt.chain;   public class Response {          private String responseParameter;       public String getResponseParameter() {        return responseParameter;     }       public void setResponseParameter(String responseParameter) {        this.responseParameter = responseParameter;     }      }   测试主类 package com.bjsxt.chain;   public class MainClass {       public static void main(String[] args) {                Request request = new Request();        Response response = new Response();                        Filterchain chain1 = new Filterchain();        chain1.addFilter(new Filter1());                Filterchain chain2 = new Filterchain();        chain2.addFilter(new Filter2());                chain1.addFilter(chain2);                chain1.doFilter(request, response);                System.out.println(request.getRequestParameter());             }   }   改进后的过滤器   过滤器接口类 package com.bjsxt.chain;   public interface Filter {     public void doFilter(Request request, Response response, FilterChain filterChain); }   过滤器实现类1 package com.bjsxt.chain;   public class Filter1 implements Filter {       public void doFilter(Request request, Response response, FilterChain filterChain) {        String str = request.getRequestParameter();        str += "request pass filter1 ";        request.setRequestParameter(str);        filterChain.doFilter(request, response, filterChain);        str = response.getResponseParameter();        str += "response pass filter1";        response.setResponseParameter(str);     }   }   过滤器实现类2 package com.bjsxt.chain;   public class Filter2 implements Filter {          public void doFilter(Request request, Response response, FilterChain filterChain) {        String str = request.getRequestParameter();        str += "request pass filter2 ";        request.setRequestParameter(str);        filterChain.doFilter(request, response, filterChain);                str = response.getResponseParameter();        str += "response pass filter2";        response.setResponseParameter(str);     }   } 过滤器链 package com.bjsxt.chain;   import java.util.ArrayList; import java.util.List; import java.util.Stack; public class FilterChain implements Filter {          List<Filter> filters = new ArrayList<Filter>();             Stack<Filter> stack = new Stack<Filter>();          private int i = 0;     public FilterChain addFilter(Filter filter) {        filters.add(filter);        return this;     }       public void doFilter(Request request, Response response, FilterChain filterChain) {        if (i == filters.size()) return;        Filter filter = filters.get(i);        i++;        filter.doFilter(request, response, filterChain);             }      }     测试主类   package com.bjsxt.chain;   public class MainClass {       public static void main(String[] args) {                Request request = new Request();        Response response = new Response();                FilterChain chain1 = new FilterChain();        chain1.addFilter(new Filter1())               .addFilter(new Filter2());                chain1.doFilter(request, response, chain1);                System.out.println(request.getRequestParameter());        System.out.println(response.getResponseParameter());             }

      
      
       
       

         
       

         
       
      
    复制代码

    源码下载:http://file.javaxxz.com/2014/11/3/000037453.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 16:10 , Processed in 0.348583 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表