作用
- 为其他对象提供一种代理以控制对这个对象的访问
何时使用
- 想在访问一个类时做一些控制
优点
- 职责清晰
- 高扩展性
- 智能化
实例
- 动态代理
/** * @Author: create_By: chenxin * @Data:Created in 2018/8/28 10:18 * @Version: * @Acton: 明星接口 */ public interface Star { void confer(); //面谈 void signContract(); //签合同 void bookTicket(); //订票 void sing(); //唱歌 void collectMoney(); //结尾款 }
/** * @Author: create_By: chenxin * @Data:Created in 2018/8/28 10:22 * @Version: * @Acton: 明星本人 */ public class RealStar implements Star { @Override public void confer() { System.out.println("RealStar.confer()"); } @Override public void signContract() { System.out.println("RealStar.signContract()"); } @Override public void bookTicket() { System.out.println("RealStar.bookTicket()"); } @Override public void sing() { System.out.println("RealStar(周杰伦本人).sing()"); } @Override public void collectMoney() { System.out.println("RealStar.collectMoney()"); } }
/** * @Author: create_By: chenxin * @Data:Created in 2018/8/28 10:56 * @Version: * @Acton: */ public class StarHandler implements InvocationHandler { Star star; public StarHandler(Star star) { this.star = star; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object o = null; System.out.println("商谈"); if(method.getName().equals("sing")){ o = method.invoke(star,args); } System.out.println("结款"); return o; } }
public static void test1(){ Star realStar = new RealStar(); Star proxyStar = new ProxyStar(realStar); proxyStar.confer(); proxyStar.signContract(); proxyStar.bookTicket(); proxyStar.sing(); proxyStar.collectMoney(); }
- 静态代理
/** * @Author: create_By: chenxin * @Data:Created in 2018/8/28 10:18 * @Version: * @Acton: 明星接口 */ public interface Star { void confer(); //面谈 void signContract(); //签合同 void bookTicket(); //订票 void sing(); //唱歌 void collectMoney(); //结尾款 }
/** * @Author: create_By: chenxin * @Data:Created in 2018/8/28 10:22 * @Version: * @Acton: 明星本人 */ public class RealStar implements Star { @Override public void confer() { System.out.println("RealStar.confer()"); } @Override public void signContract() { System.out.println("RealStar.signContract()"); } @Override public void bookTicket() { System.out.println("RealStar.bookTicket()"); } @Override public void sing() { System.out.println("RealStar(周杰伦本人).sing()"); } @Override public void collectMoney() { System.out.println("RealStar.collectMoney()"); } }
/** * @Author: create_By: chenxin * @Data:Created in 2018/8/28 10:24 * @Version: * @Acton: 代理人 */ public class ProxyStar implements Star{ private Star star; public ProxyStar(Star star) { this.star = star; } @Override public void confer() { System.out.println("ProxyStar.confer()"); } @Override public void signContract() { System.out.println("ProxyStar.signContract()"); } @Override public void bookTicket() { System.out.println("ProxyStar.bookTicket()"); } @Override public void sing() { star.sing(); } @Override public void collectMoney() { System.out.println("ProxyStar.collectMoney()"); } }
/* 测试静态代理 */ public static void test2(){ xin.chen.structural_type.proxy.dynamicProxy.Star realStar = new xin.chen.structural_type.proxy.dynamicProxy.RealStar(); StarHandler handler = new StarHandler(realStar); xin.chen.structural_type.proxy.dynamicProxy.Star proxy = (xin.chen.structural_type.proxy.dynamicProxy.Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{xin.chen.structural_type.proxy.dynamicProxy.Star.class}, handler); proxy.sing(); }
关系图
- 静态代理
- 动态代理