Java设计模式之责任链模式

 更新时间:2019年01月16日 09:52:11   作者:Haozz_1994  
今天小编就为大家分享一篇关于Java设计模式之责任链模式,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

设计者往往会用拦截器去代替动态代理,然后将拦截器的接口提供给开发者,从而简化开发者的开发难度,但是拦截器可能有多个。举个例子,一个程序员需要请假一周,如果把请假申请单看成一个对象,那么它需要经过项目经理、部门经理、人事等多个角色的审批,每个角色都有机会通过拦截这个申请单进行审批或者修改。这事就要考虑提供项目经理、部门经理和人事的处理逻辑,所以需要提供3个拦截器,二传递的则是请假申请单。

当一个对象在一条链上被多个拦截器处理(拦截器也可以选择不拦截处理它)时,我们把这样的设计模式成为责任链模式,它用于一个对象在多个角色中传递的场景。还是刚才的例子,申请单走到项目经理,经理可能把申请时间“一周”改为“5天”,从而影响了后面的审批,后面的审批都要根据前面的结果进行。这个时候可以考虑用层层代理来实现,就是当申请单(target)走到项目经理处,使用第一个动态代理proxy1,。当它走到部门经理处,部门经理会得到一个在项目经理的代理proxy1基础上生成的proxy2来处理部门经理的逻辑。当它走到人事处,会在proxy2的基础上生成proxy3.如果还有其他角色,依次类推即可,可用下图来描述拦截逻辑:

我们定义下面的拦截器接口:

/**
 * @Auther: haozz
 * @Date: 2018/5/27 22:15
 * @Description:拦截器接口
 **/
public interface Interceptor {
  boolean before(Object proxy, Object target, Method method,Object[] args);
  void around(Object proxy,Object target,Method method,Object[] args);
  void after(Object proxy,Object target,Method method,Object[] args);
}

再定义3个拦截器:

/**
 * @Auther: haozz
 * @Date: 2018/5/27 22:19
 * @Description:拦截器1
 **/
public class Interceptor1 implements Interceptor{
  @Override
  public boolean before(Object proxy, Object target, Method method, Object[] args) {
    System.out.print("[拦截器1]的before方法");
    return true;
  }
  @Override
  public void around(Object proxy, Object target, Method method, Object[] args) {
  }
  @Override
  public void after(Object proxy, Object target, Method method, Object[] args) {
    System.out.print("[拦截器1]的after方法");
  }
}
/**
 * @Auther: haozz
 * @Date: 2018/5/27 22:19
 * @Description:拦截器2
 **/
public class Interceptor2 implements Interceptor{
  @Override
  public boolean before(Object proxy, Object target, Method method, Object[] args) {
    System.out.print("[拦截器2]的before方法");
    return true;
  }
  @Override
  public void around(Object proxy, Object target, Method method, Object[] args) {
  }
  @Override
  public void after(Object proxy, Object target, Method method, Object[] args) {
    System.out.print("[拦截器2]的after方法");
  }
}
/**
 * @Auther: haozz
 * @Date: 2018/5/27 22:19
 * @Description:拦截器3
 **/
public class Interceptor3 implements Interceptor{
  @Override
  public boolean before(Object proxy, Object target, Method method, Object[] args) {
    System.out.print("[拦截器3]的before方法");
    return true;
  }
  @Override
  public void around(Object proxy, Object target, Method method, Object[] args) {
  }
  @Override
  public void after(Object proxy, Object target, Method method, Object[] args) {
    System.out.print("[拦截器3]的after方法");
  }
}

我们使用上一篇(Java动态代理之拦截器的应用)中用到的InterceptorJdkProxy类,测试一下这段代码。如下:

@Test
  public void MyTest(){
    HelloWorld proxy1 = (HelloWorld) InterceptorJdkProxy.bind(new HelloWorldImpl(),"com.csdn.blog.impl.Interceptor1");
    HelloWorld proxy2 = (HelloWorld) InterceptorJdkProxy.bind(proxy1,"com.csdn.blog.impl.Interceptor2");
    HelloWorld proxy3 = (HelloWorld) InterceptorJdkProxy.bind(proxy2,"com.csdn.blog.impl.Interceptor3");
    proxy3.sayHelloWorld();
  }

运行这段diamante后得到这样的结果,请注意观察其方法的执行顺序:

[拦截器3]的before方法
[拦截器2]的before方法
[拦截器1]的before方法
Hello World
[拦截器1]的after方法
[拦截器2]的after方法
[拦截器3]的after方法

before方法按照最后一个拦截器到第一个拦截器的加载顺序运行,而after方法则按照从第一个拦截器到最后一个拦截器的加载顺序运行。

从代码中可见,责任链模式的优点在于我们可以在传递链上加入新的拦截器,增加拦截逻辑,其缺点是会增加代理和反射,而代理和反射的性能不高。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

相关文章

  • Java 实现麦克风自动录音

    Java 实现麦克风自动录音

    这篇文章主要介绍了Java 实现麦克风自动录音的示例代码,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2020-12-12
  • 详解怎么用Java的super关键字

    详解怎么用Java的super关键字

    今天带大家学习Java中super关键字是怎么用的,文中有非常详细的介绍,对正在学习的小伙伴们很有帮助,需要的朋友可以参考下
    2021-06-06
  • PowerJob的OhMyClassLoader工作流程源码解读

    PowerJob的OhMyClassLoader工作流程源码解读

    这篇文章主要介绍了PowerJob的OhMyClassLoader工作流程源码解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • Fluent Mybatis让你摆脱Xml文件的技巧

    Fluent Mybatis让你摆脱Xml文件的技巧

    Fluent-Mybatis类似于Mybatis-Plus是对Mybatis进一步的封装,可以只用一个实体类对象,通过代码生成器,在编译的过程中生成所需要的各类文件,简化了项目的基础构建,提高开发效率,本文重点给大家介绍Fluent Mybaits让你摆脱Xml文件的技巧,一起看看吧
    2021-08-08
  • Java的中lombok下的@Builder注解用法详解

    Java的中lombok下的@Builder注解用法详解

    这篇文章主要介绍了Java的中lombok下的@Builder注解用法详解,lombok注解在java进行编译时进行代码的构建,对于java对象的创建工作它可以更优雅,不需要写多余的重复的代码,在出现lombok之后,对象的创建工作更提供Builder方法,需要的朋友可以参考下
    2023-11-11
  • Java错误:进行语法分析时已到达文件结尾的解决

    Java错误:进行语法分析时已到达文件结尾的解决

    这篇文章主要介绍了Java错误:进行语法分析时已到达文件结尾的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • Spring data jpa缓存机制使用总结

    Spring data jpa缓存机制使用总结

    这篇文章主要介绍了Spring data jpa缓存机制使用总结,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • 详解IDEA中MAVEN项目打JAR包的简单方法

    详解IDEA中MAVEN项目打JAR包的简单方法

    本篇文章主要介绍了详解IDEA中MAVEN项目打JAR包的简单方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • 基于JDK8总结java中的interrupt

    基于JDK8总结java中的interrupt

    本文是基于JDK8总结java中的interrupt知识,需要的朋友可以参考下
    2017-12-12
  • Java的RxJava库操作符的用法及实例讲解

    Java的RxJava库操作符的用法及实例讲解

    RxJava由于提供异步和基于事件的支持在Android开发者中获得了不少人气,这里我们就来看一下Java的RxJava库操作符的用法及实例讲解,需要的朋友可以参考下
    2016-06-06

最新评论