代理模式
Proxy Pattern
定义:
Provide a surrogate or placeholder for another object to control access to it.
为另外一个对象提供代理或者占位符,以控制对其的访问。
代理模式也叫委托模式。
目的:
代理的目的是在目标对象方法的基础上作增强,这种增强的本质通常就是对目标对象的方法进行拦截和过滤。
角色定义:
- Subject 抽象主题角色 - 一个抽象类活接口
- Real Subject 具体主题角色 - 被代理类
- Proxy 代理主题角色 - 代理类
通用代码:
//抽象主题类
pubblic interface Subject {
public void request();
}
//具体主题类
public class RealSubject implements Subject {
public void request() {
...
}
}
//代理类
public class Proxy implements Subject {
//需要代理的实现类
private Subject subject = null;
//默认被代理者
public Proxy() {
this.subject = new Proxy();
}
//通过构造函数传递代理者
public Proxy(Subject _subject) {
this.subject = _subject;
}
public void request() {
this.before();
this.subject.request();
this.after();
}
private void before() {
...
}
private void after() {
...
}
}
扩展:
- 普通代理:调用者只知代理而不知道真是的角色是谁,屏蔽了真是角色的变更对高层模块的影响;
- new一个代理类,传真实角色的相关信息
- 强制代理:通过真实角色找到代理角色;要访问代理角色必须通过真实角色。
- new一个真实角色,getProxy得一个代理类
*动态代理
动态代理是在实现阶段不用关心代理谁,而在运行阶段才指定代理哪一个对象。
代码
InvocationHandler
是JDK
提供的动态代理接口
这个代码结构分的不是很清晰,但是大概的用法都体现了
//动态代理类
public class DynamicProxyIH() implements InvocationHandler {
Class class = null;
Object obj = null;
public DynamicProxyIH(Object _obj) {
this.obj = _obj;
}
//增强方法
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//前置增强
before();
//利用反射机制,获取对象
Object result = method.invoke(this.obj, args);
//后置增强
after();
return result;
}
private void before(){
...
}
private void after(){
...
}
//动态获得代理类
public Object getProxyInstance() {
return Proxy.newProxyIntstance(subjcet.getClass().getClassLoader,
subject.getClass().getInterface,this);
}
}
实践:
代理模式可以说是应用最广泛的模式了;AOP(面向切面编程)的核心思想就是使用了动态代理,再调试过程中看见类似$Proxy()的字眼就知道它是动态代理了。
**在学习AOP框架的时候,搞清楚:1.切面(Aspect);2.切入点(Join Point); **
**3.通知(Advice); 4. 织入(Weave)