一、什么是代理模式
Proxy模式又叫做代理模式,是构造型的设计 模式之一,它可以为其他对象提供一种代理(Proxy)以 控制对这个对象的访问。
所谓代理,是指具有与代理元(被代理的对象)具有 相同的接口的类,客户端必须通过代理与被代理的目标 类交互,而代理一般在交互的过程中(交互前后),进行某些特别的处理。
二、代理模式的结构
三、代理模式的角色和职责
subject(抽象主题角色): 真实主题与代理主题的共同接口。
RealSubject(真实主题角色): 定义了代理角色所代表的真实对象。
Proxy(代理主题角色): 含有对真实主题角色的引用,代理角色通常在将客户端调用传递给真是主题对象之前或者之后执行某些操作,而不是单纯返回真实的对象。
四、动态代理
1. InvocationHandler 接口 2. invoke方法 3. Proxy.newProxyInstance();
没用代理模式
主题
1 //主题 2 public interface Subject { 3 public void sailBook(); 4 }
现实主题
1 //现实主题 2 public class RealSubject implements Subject { 3 4 public void sailBook() { 5 System.out.println("卖书"); 6 } 7 }
代理主题
1 //代理主题 2 public class ProxySubject implements Subject{ 3 private RealSubject realSubject; 4 5 public void sailBook() { 6 dazhe(); 7 if(realSubject == null) { 8 realSubject = new RealSubject(); 9 } 10 realSubject.sailBook(); 11 give(); 12 } 13 14 public void dazhe() { 15 System.out.println("打折"); 16 } 17 18 public void give() { 19 System.out.println("赠送代金券"); 20 } 21 }
测试
1 public class MainClass { 2 public static void main(String[] args) { 3 ProxySubject proxySubject = new ProxySubject(); 4 proxySubject.sailBook(); 5 } 6 }
==============================================================
使用代理模式
主题
1 //主题 2 public interface Subject { 3 public void sailBook(); 4 }
真实主题
1 //真实主题 2 public class RealSubject implements Subject { 3 4 public void sailBook() { 5 System.out.println("卖书"); 6 } 7 }
My处理程序 实现 调用处理程序
1 public class MyHandler implements InvocationHandler { 2 private RealSubject realSubject; 3 4 public void setRealSubject(RealSubject realSubject) { 5 this.realSubject = realSubject; 6 } 7 8 public Object invoke(Object proxy, Method method, Object[] args){ 9 Object result = null; 10 dazhe(); 11 try { 12 result = method.invoke(realSubject, args); 13 } catch (IllegalArgumentException e) { 14 e.printStackTrace(); 15 } catch (IllegalAccessException e) { 16 e.printStackTrace(); 17 } catch (InvocationTargetException e) { 18 e.printStackTrace(); 19 } 20 give(); 21 return result; 22 } 23 24 public void dazhe() { 25 System.out.println("打折"); 26 } 27 28 public void give() { 29 System.out.println("赠送代金券"); 30 } 31 }
测试
1 import java.lang.reflect.Proxy; 2 3 public class MainClass { 4 public static void main(String[] args) { 5 RealSubject realSubject = new RealSubject(); 6 MyHandler myHandler = new MyHandler(); 7 myHandler.setRealSubject(realSubject); 8 9 Subject proxySubject = (Subject)Proxy.newProxyInstance(RealSubject.class.getClassLoader(),
realSubject.getClass().getInterfaces(), myHandler); 10 proxySubject.sailBook(); 11 } 12 }