这几天在看动态代理的知识,联想到代理设计模式。这里简单分析一下,如果有遗漏的地方还望大家指正。
什么是代理模式
为其他对象提供一种代理以控制这个对象的访问。
代理模式有什么好处
某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介作用。
为了保证客户端使用的透明性,委托对象和代理对象都需要实现同一个接口。
一般涉及到的角色
抽象角色:声明真实对象和代理对象的共同接口;
代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
真实角色:代理角色所代表的真实对象,也是我们最终要引用的对象。
静态代理实例
public interface Woman {
void winking();
void ml();
}
//真实角色
public class PanJinLian implements Woman{
@Override
public void winking() {
System.out.println("PanJinLian winking!");
}
@Override
public void ml() {
System.out.println("PanJinLian ml!!!");
}
}
//代理角色
public class WangPo implements Woman {
private PanJinLian pjl;
public WangPo(PanJinLian pjl) {
this.pjl = pjl;
}
@Override
public void winking() {
//实际指向的是PJL
this.pjl.winking();
}
@Override
public void ml() {
this.pjl.ml();
}
}
//相当于Client
public class XiMenQing {
public static void main(String [] args){
WangPo wangPo = new WangPo(new PanJinLian());
wangPo.winking();
wangPo.ml();
}
}
这里可能会觉得为什么不让西门庆直接跟潘金莲。我再举个例子吧。读书的时候给喜欢的女孩子传字条,老师正在台上讲的热火朝天。我(实际类)只能让其它同学(相当于代理类)帮忙把你的字条(相当于例子中的接口)传给你喜欢的女孩子啦。
动态代理类
编译期间不知道确切对象,运行期间确定对象。(传入的是真实对象)
public class DynamicProxy implements InvocationHandler {
private Object obj;
public DynamicProxy(Object obj) {
this.obj = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object invoke = method.invoke(obj, args);
return invoke;
}
}
PanJinLian panJinLian = new PanJinLian();
//构造一个动态代理
DynamicProxy proxy = new DynamicProxy(panJinLian);
//获取被代理类
ClassLoader classLoader = panJinLian.getClass().getClassLoader();
Woman woman = (Woman) Proxy.newProxyInstance(classLoader, new Class[]{Woman.class}, proxy);
woman.winking();
woman.ml();