代理模式分为两种:静态代理和动态代理。
静态代理:代理类是由我们手动添加class类来实现,而动态代理类是由程序来生成代理类,代理无论是在生活中还是在程序中都有大量使用,如经纪人代理明星签合同,安排演出,回收尾款等操作都是通过代理完成,而具体唱歌则是有明星来完成。静态代理类和被代理类需要实现同一接口,而且由于代理类有些方法最终还是得调用被代理类来完成,所以静态代理类中还得持有被代理类的引用
public interface Star { //签合同 void signContract(); //唱歌 void sing(); //收尾款 void collectMoney(); } //====================================== public class ProxyStar implements Star { private Star star; public ProxyStar(Star star) {//通过注入持有被代理对象的引用 super(); this.star = star; } @Override public void signContract() { System.out.println("ProxyStar 签合同"); //这些方法都可以由代理对象,经纪人来完成 } @Override public void sing() { star.sing();//调用被代理对象 唱歌 方法 ,因为唱歌这个方法必须由明星本人完成 代理对象无法代劳 } @Override public void collectMoney() { System.out.println("ProxyStar 收尾款"); } } //============================================= public class RealStar implements Star { @Override public void signContract() { System.out.println("RealStar 签合同"); } @Override public void sing() { System.out.println("RealStar 唱歌"); } @Override public void collectMoney() { System.out.println("RealStar 收尾款"); } } //========================================= @Test public void func() { Star realStar=new RealStar(); Star proxyStar=new ProxyStar(realStar); //注入被代理对象 proxyStar.signContract();//这些事情由经纪人完成 proxyStar.sing();//这些事情由明星本人完成 proxyStar.collectMoney();//这些事情由经纪人完成 }