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