责任链模式的理解与实例
来源:互联网 发布:vba和vb的区别 编辑:程序博客网 时间:2024/06/05 11:36
当一个对象在一条链上把多个拦截器处理时,我们把这种设计模式称为责任链模式。责任链模式 同样是对jdk动态代理的应用。如何编写一个简单的责任链实例?
首先定义Interceptor接口
该接口规定了在调用目的方法之前的处理,同时返回boolean代表是否调用目的方法。 还有调用之后的方法处理。
定义接口后便可以加入自己想要的实现了。这里可以有多个实现从而可以对同一个对象的一个方法进行多次拦截。那么这个过程还没写 怎么实现呢?答案是:动态代理
你应该书写这样一个类:该类实现InvocationHandler接口,实现其invoke方法,同时定义类变量 1、被代理对象 2、拦截器的name(全限定名)。同时定义绑定方法(即把被代理对象绑定到代理对象上)bind(Object target,String interceptorClazz)返回代理对象。类似Proxy.newInstance(classLoader,Interfaces,new ClassName(target,”拦截器的全限定名”));同时 在invoke方法中同时利用反射获取到 拦截器类,从而判断是否调用method.Invoke()以及加入拦截器的拦截方法。
public interface Interceptor { public boolean before(Object proxy, Object target, Method method, Object[] args); public void around(Object proxy, Object target, Method method, Object[] args); public void after(Object proxy, Object target, Method method, Object[] args);}
public class MyInterceptor1 implements Interceptor { public boolean before(Object proxy, Object target, Method method, Object[] args) { System.out.println("before interceptor 1.............."); return true; } public void around(Object proxy, Object target, Method method, Object[] args) { } public void after(Object proxy, Object target, Method method, Object[] args) { System.out.println("after interceptor 1.............."); }}
public class MyIntercetor implements Interceptor { public boolean before(Object proxy, Object target, Method method, Object[] args) { System.out.println("before interceptor 0.............."); return true; } public void around(Object proxy, Object target, Method method, Object[] args) { System.out.println("取消原有方法的逻辑"); } public void after(Object proxy, Object target, Method method, Object[] args) { System.out.println("after interceptor 0.............."); }}
public class JDKDynamicProxy implements InvocationHandler { public Object object; public String interceptorClazz; public JDKDynamicProxy(Object object, String interceptorClazz) { this.object = object; this.interceptorClazz = interceptorClazz; } public static Object bind(Object object,String interceptorClazz){ return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), new JDKDynamicProxy(object,interceptorClazz)); } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if(interceptorClazz==null){ method.invoke(object,args); } Object result = null; Interceptor interceptor = (Interceptor) Class.forName(interceptorClazz).newInstance(); if(interceptor.before(proxy,object,method,args)){ result = method.invoke(object,args); }else{ interceptor.around(proxy,object,method,args); } interceptor.after(proxy,object,method,args); return result; }}
阅读全文
0 0
- 责任链模式的理解与实例
- 责任链模式的理解实例
- 责任链模式实例
- 责任链模式的应用实例
- 责任链模式的实现和理解
- 【责任链模式】Java版简单实例与Tomcat实例
- 责任链模式实例讲解
- 设计模式实例学习-责任链模式
- 设计模式-责任链模式实例
- 责任链模式与AOP
- [tomcat学习] 责任链模式实例
- 责任链模式之个人理解
- 《JAVA与模式》之责任链模式
- 《JAVA与模式》之责任链模式
- 《JAVA与模式》之责任链模式
- 《JAVA与模式》之责任链模式
- 《JAVA与模式》之责任链模式
- 语言与模式-16责任链模式
- go语言初步了解
- java(服务端)-集成银联支付,含代码
- Validform表单校验插件
- YYCache的基本使用
- 【Python】Numpy简单入门
- 责任链模式的理解与实例
- C#开发Windows窗体应用程序的步骤
- 开发要搞清楚什么是并发,并行,串行,同步,异步?
- java 读取clob,blob转换为字符串
- UML大战需求分析-读书笔记
- java mongo $where
- 戴尔的下一代数据中心战略将会取得成功
- 博士生活与博客
- 自定义日志输出类log4j