代理模式 笔记

代理模式的作用:为其他对象提供一种代理,以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

代理模式涉及到的角色有:

1. 抽象角色:声明真实对象和代理对象的共同接口。

2. 代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口,以便在任何时刻都能代替真实对象,同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。

3. 真实对象:代理角色所代表的真实对象,是我们最终要引用的对象。

一、静态代理:

     IHello -->HelloLoggerProxy.greeting()

             |

              -->HelloImpl.greeting()

1 IHello hello = new HelloLoggerProxy(new HelloImpl());
2 hello.greeting("hello");

二、动态代理:用到反射机制,即通过反射动态生成对象

     IHello -->HelloImpl.greeting()

     InvocationHandler-->DynamicLoggerProxy.bind()&invoke()

1 IHello hello = (Hello) new DynamicLoggerProxy().bind(new HelloImpl());
2 hello.greeting("hello");

三、CGLib: 上面两种方法必须依赖IHello接口,如果不想依赖于IHello接口,就要引入CGLib:

     Hello.greeting()

     net.sf.cglib.proxy.Enhancer/MethodInterceptor/MethodProxy -->CGLibLoggerProxy.bind()&interceptor()

 1 bind(Object delegate) {
 2     Enhancer enhancer = new Enhancer();
 3     enhancer.setCallback(this);
 4     enhancer.setSupperclass(delegate.getClass());
 5     return enhancer.create();
 6 }
 7 interceptor(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
 8     return proxy.invokeSuper(obj, args);
 9 }
10 Hello hello = (Hello) new CGLIBLoggerProxy().bind(new Hello());
11 hello.greeting("hello");
posted @ 2013-03-05 11:50  我是小菜鸟  阅读(356)  评论(0编辑  收藏  举报