代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。简单的说就是,我们在访问实际对象时,是通过代理对象来访问的,代理模式就是在访问实际对象时引入一定程度的间接性,因为这种间接性,可以附加多种用途。
静态代理
由程序员创建或特定工具自动生成源代码,也就是在编译时就已经将接口,被代理类,代理类等确定下来。在程序运行之前,代理类的.class文件就已经生成。
public interface Marry { void prepare();//筹备婚礼 void weeding();//婚礼 void clear();//婚礼后收拾场地}
public class Bridegroom implements Marry{ @Override public void prepare() { // TODO Auto-generated method stub } @Override public void weeding() { System.out.println("新郎正在进行婚礼"); } @Override public void clear() { // TODO Auto-generated method stub }}
public class MarryProxy implements Marry{ private Marry bridegroom; public MarryProxy(Marry bridegroom) { this.bridegroom = bridegroom; } @Override public void prepare() { System.out.println("婚前场地准备"); } @Override public void weeding() { this.bridegroom.weeding(); } @Override public void clear() { System.out.println("婚后收拾场地"); }}
public class Test { public static void main(String[] args) { Marry proxy = new MarryProxy(new Bridegroom()); proxy.prepare(); proxy.weeding(); proxy.clear(); }}
结果:
婚前场地准备
新郎正在进行婚礼
婚后收拾场地
动态代理
代理类在程序运行时自动创建的代理方式被成为动态代理。
在java的java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,通过这个类和这个接口可以生成JDK动态代理类和动态代理对象。
Proxy 动态生成代理类和对象
InvocationHandler 处理器接口,可以通过invoke方法实现对真实角色的代理访问,每次通过Proxy生成代理类对象时都要指定对应的处理器对象。
public interface Marry { void prepare();//筹备婚礼 void weeding();//婚礼 void clear();//婚礼后收拾场地}
public class Bridegroom implements Marry{ @Override public void prepare() { // TODO Auto-generated method stub } @Override public void weeding() { System.out.println("新郎正在进行婚礼"); } @Override public void clear() { // TODO Auto-generated method stub }}
public class MarryHandler implements InvocationHandler{ private Marry bridegroom; public MarryHandler(Marry bridegroom) { super(); this.bridegroom = bridegroom; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { method.invoke(bridegroom, args); return null; }}
public class Test { public static void main(String[] args) { Marry bridegroom = new Bridegroom(); MarryHandler handler = new MarryHandler(bridegroom); Marry proxy = (Marry) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[] { Marry.class }, handler); proxy.weeding(); }}