概述:
代理模式:为另一个对象提供一个替身(或占位符),以控制对该对象的访问;
使用代理模式创建代理对象,让代理对象控制某对象的访问,被代理的对象可以是远程(或创建开销大、需要安全控制的)对象。
要点:
- 代理角色内部含有对真实角色的引用:从而可以在任何时候操作真实角色对象;
- 代理角色与真实角色实现同一接口:以便可以在任何时候都可以替代真实角色,负责在需要的时候创建(删除)真实角色对象。
- 代理角色通常在将客户端调用传递给真实主题之前(或之后),都要执行某个操作(如检验参数),而非单纯将调用传递给真实角色对象。
一、uml类图
二、(静态)代理 模式的实现
1,主题角色
1 package proxy; 2 3 //主题角色(抽象) 4 public interface Subject { 5 public void request(String param); 6 }
2,真实角色
1 package proxy; 2 3 //真实角色(目标) 4 public class RealSubject implements Subject{ 5 @Override 6 public void request(String param) { 7 System.out.println("参数:"+param); 8 } 9 }
3,代理角色
1 package proxy; 2 3 public class StaticProxy implements Subject{ 4 Subject realSubject; 5 6 public StaticProxy(Subject realSubject) { 7 this.realSubject=realSubject; 8 } 9 //验证参数(代理对象处理目标对象前) 10 public void before(String param){ 11 if(!param.equals("magicalwolf")) 12 throw new IllegalArgumentException(); 13 } 14 15 @Override 16 public void request(String param) { 17 before(param); 18 realSubject.request(param); 19 } 20 }
4,测试
1 package proxy; 2 3 public class Main { 4 public static void main(String[] args) { 5 Subject target=new RealSubject(); 6 Subject proxy=new StaticProxy(target); 7 8 proxy.request("magicalwolf"); 9 10 proxy.request("hello"); 11 } 12 }
三、(动态)代理 模式的实现.
1,通过 jdk实现
JDK提供的动态代理需要实现InvocationHandler
接口的invoke
方法(此方法为整个代理的入口)。
方法签名:
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
第一个参数proxy:代理对象
第二个参数目method:目标方法
第三个参数args:目标方法的参数