好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Java设计模式之责任链模式

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

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

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

?

1

2

3

4

5

6

7

8

9

10

/**

  * @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个拦截器:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

/**

  * @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方法" );

   }

}

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

/**

  * @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方法" );

   }

}

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

/**

  * @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类,测试一下这段代码。如下:

?

1

2

3

4

5

6

7

@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方法则按照从第一个拦截器到最后一个拦截器的加载顺序运行。

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

总结

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

原文链接:https://blog.csdn.net/hz_940611/article/details/80472774

查看更多关于Java设计模式之责任链模式的详细内容...

  阅读:13次