为其他对象提供一种代理以控制对这个对象的访问
迪米特法则告诉我们:只与你的直接朋友交谈,不跟“陌生人”说话。保证A-B-C链式调用,不要A直接与C通信。缺点就是B有点冗余,但重点还是要保证系统结构清晰。
也就是说对象A要不应该直接操作对象C,应该操作对象B,由对象B去对对象C进行同样的操作。
代理模式分为:静态代理、动态代理
public interface Subject {
// 示例方法
public void test();
}
public class RealSubject implements Subject {
@override
public void test(){
...
}
}
public class Proxy implements Subject {
// 持有被代理的目标对象
private RealSubject realSubject = null;
// 传入被代理的目标对象
public Proxy(RealSubject realSubject){
this.realSubject = realSubject;//此时代理对象已经持有了被代理对象的方法
}
@override
public void test(){
// 在代理对象里调用被代理对象的方法,完成代理操作
realSubject.test();
}
}
一个目标对象就会产生一个代理对象,代码量会翻倍增加,类似简单工厂的构造器方法。通过动态代理可以解决
动态代理就是动态的去创建代理对象,比如通过反射来实现。
动态代理分为两大类: