代理模式 笔记
代理模式的作用:为其他对象提供一种代理,以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式涉及到的角色有:
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");
路慢慢其休远羲,吾将上下而求所