自己实现过滤器和拦截器框架
2014-02-18 10:11
363 查看
过滤器和拦截器从效果上来说是十分类似的,都是在执行某个动作之前或者之后可以执行其他的一些逻辑,但是侧重点不一样.
过滤器---侧重于请求,它依赖于容器的调用,以及告诉它将要过的得执行动作
拦截器---侧重于对象的方法,它是限制对象方法的调用所以是用动态代理来实现而不是装饰模式(装饰模式目的是增强功能),所以它不依赖环境,任何对象都可以由它代理,(需要知道被代理类的接口) 以下是代码:
过滤器:
这里用到了责任链设计模式,(多个对象组成的链,用户的请求在链中传递,可以处理就处理,否则交给下一个对象),其实就是用栈来实现递归调用
测试:
执行结果:
拦截器:
这里迭代器的使用极大的简化了操作
测试:
测试结果:
过滤器---侧重于请求,它依赖于容器的调用,以及告诉它将要过的得执行动作
拦截器---侧重于对象的方法,它是限制对象方法的调用所以是用动态代理来实现而不是装饰模式(装饰模式目的是增强功能),所以它不依赖环境,任何对象都可以由它代理,(需要知道被代理类的接口) 以下是代码:
过滤器:
/** * Created by Administrator on 14-2-17. * 过滤器 是过滤请求,核心是函数回调,栈的递归(责任链设计模式) * 拦截器是增强或者说限制类的方法调用。核心是java反射(动态代理) */ interface Fliter{ public void doFliter(String arg,FliterContext fliterContext); } class Fliter1 implements Fliter{ @Override public void doFliter(String arg, FliterContext fliterContext) { System.out.println("执行过滤器1"); fliterContext.doFliter(arg,fliterContext); System.out.println("结束--执行过滤器1"); } } class Fliter2 implements Fliter{ @Override public void doFliter(String arg, FliterContext fliterContext) { System.out.println("执行过滤器2"); fliterContext.doFliter(arg,fliterContext); System.out.println("结束--执行过滤器2"); } } class FliterContext implements Fliter{ Iterator<Fliter> iterator = null; public FliterContext(){ Fliter2 f2 = new Fliter2(); Fliter1 f1 = new Fliter1(); ArrayList<Fliter> arrayList = new ArrayList<Fliter>(); arrayList.add(f1); arrayList.add(f2); this.iterator = arrayList.iterator(); } @Override public void doFliter(String arg, FliterContext fliterContext) { if(iterator.hasNext()){ Fliter fliter = iterator.next(); fliter.doFliter(arg,fliterContext); }else { //调用action System.out.println("调用Action"); } } }
这里用到了责任链设计模式,(多个对象组成的链,用户的请求在链中传递,可以处理就处理,否则交给下一个对象),其实就是用栈来实现递归调用
测试:
public class test { public static void main(String [] args){ FliterContext fc = new FliterContext(); fc.doFliter("dd",fc); } }
执行结果:
执行过滤器1 执行过滤器2 调用Action 结束--执行过滤器2 结束--执行过滤器1
拦截器:
/** * Created by Administrator on 14-2-17. * 此拦截器 的依次执行是befor和after方法分别循环调用实现,主要是迭代器的使用,没有用栈递归 * 代理类由jdk提供的动态代理(动态代理设计模式)生成 */ interface Interceptor{ public Object before(); public Object after(); } class Interceptor1 implements Interceptor{ public Object before(){ System.out.println("开始-拦截器1"); return null; } public Object after(){ System.out.println("结束-拦截器1"); return null; } } class Interceptor2 implements Interceptor{ public Object before(){ System.out.println("开始-拦截器2"); return null; } public Object after(){ System.out.println("结束-拦截器2"); return null; } } interface Person{ public void sayHello(); } class Person1 implements Person{ public void sayHello(){ System.out.println("你好"); } } class ProxyHandle implements InvocationHandler{ private Object object = null; private ListIterator<Interceptor> interceptorIterator = null; public ProxyHandle(Object object) { this.object = object; ArrayList<Interceptor> arrayList = new ArrayList<Interceptor>(); arrayList.add(new Interceptor1()); arrayList.add(new Interceptor2()); this.interceptorIterator = arrayList.listIterator(); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object oo = null; while(interceptorIterator.hasNext()){ Interceptor interceptor = interceptorIterator.next(); interceptor.before(); } oo = method.invoke(object,args); while (interceptorIterator.hasPrevious()){ Interceptor interceptor = interceptorIterator.previous(); interceptor.after(); } return oo; } public Object getProxy(){ return Proxy.newProxyInstance(Person1.class.getClassLoader(), Person1.class.getInterfaces(), this); } }
这里迭代器的使用极大的简化了操作
测试:
public class test2 { public static void main(String [] args){ Person1 p1 = new Person1(); ProxyHandle proxyHandle = new ProxyHandle(p1); //Psrson1 必须实现接口 不然会出现类型转换错误 Person proxy = (Person) proxyHandle.getProxy(); proxy.sayHello(); } }
测试结果:
开始-拦截器1 开始-拦截器2 你好 结束-拦截器2 结束-拦截器1
相关文章推荐
- 自己实现Struts2(六)实现参数拦截器并调试框架
- 实现自己的拦截器框架
- 实现自己的拦截器框架
- 打造自己php的开发框架--php的MVC简单实现
- 编写自己rpc框架——java rpc的实现
- 自己实现js运动框架的一些心得
- (4.6.22.3)来吧,是时候撸一份自己的RxJava框架啦:装饰器模式实现操作符顺序调用
- spring boot实现过滤器和拦截器demo
- 在Spring基础上实现自己的异常处理框架
- 过滤器和拦截器的比较及未登录用户权限限制的实现
- 过滤器和拦截器的比较及未登录用户权限限制的实现
- 详谈springboot过滤器和拦截器的实现及区别
- 如何实现自己的Android MVP框架?
- 过滤器和拦截器的比较及未登录用户权限限制的实现
- 为什么需要自己实现前端框架
- 框架 day83 涛涛商城项目-门户整合登陆注册,购物车实现,登陆拦截器
- 自己写的日志框架--linkinLog4j--实现基本的框架功能
- 2.RPC框架的简单实现(定义自己的ldubbo命名空间)
- 一步步实现自己的框架系列(二):插件框架实现
- 自己写的OKHttp+MVP的框架实现(无需增加多余的M,V层)