代理模式是常用的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();    }}

结果:

婚前场地准备

新郎正在进行婚礼

婚后收拾场地

动态代理

 

代理类在程序运行时自动创建的代理方式被成为动态代理。

javajava.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();    }}