屏蔽真实行为的访问,让程序更加安全。
可以对真实行为的调用进行控制。
一个典型的代理模式有三要素
1.代理类与被代理类要实现同一个接口.
2.在代理类中持有被代理对象.
3.在代理类中调用被代理的行为。
即:
共同接口
public interface Action {
public void doSomething();
}
真实对象
public class RealObject implements Action{
public void doSomething() {
System.out.println("do something");
}
}
代理对象
public class Proxy implements Action {
private Action realObject;
public Proxy(Action realObject) {
this.realObject = realObject;
}
public void doSomething() {
System.out.println("proxy do");
realObject.doSomething();
}
}
运行代码
Proxy proxy = new Proxy(new RealObject());
proxy.doSomething();
这样就可以不用创建 真实对象了, 只是创建代理对象 就可以做到真实对象做的事情了。
可以很好的隐藏真实对象。
然后再在代理类中相同的方法里面加些东西,就可以为原功能进行扩展了。
一般将这种代理模式称为静态代理
静态代理的优点和缺点
这种代理模式的优点: 扩展原功能,不侵入原代码。
这种代理模式的缺点:如果有多个真实类对象,要么创建多个代理类,要么一个代理类添加多个接口,但都很繁琐。
动态代理
通过使用动态代理,我们可以通过在运行时,动态生成一个持有RealObject、并实现代理接口的Proxy,同时注入我们相同的扩展逻辑
也就是输入被代理对象、接口 就可以得到一个代理对象,然后执行代理对象的方法。
一般有两种方式:
1.通过jdk中提供的Proxy类来实现
这种方式要求,被代理类必须实现接口。
简单说,只能为接口做代理.
2.通过cglib来实现。
它不要求,实现接口。
jdk动态代理 需要输入被代理对象、接口
cglib不要求输入接口