首页 > 代码库 > 设计模式之代理模式(Proxy)

设计模式之代理模式(Proxy)

1、定义

代理模式是一个使用率非常高的模式,它为其他对象提供一种代理以控制对这个对象的访问。

2、通用类图

image

subject抽象主题角色:抽象主题类可以是抽象类也可以是接口,是一个最普通的业务类型定义,无特殊要求

RelSubject具体主题角色:也叫做被委托角色、被代理角色。是业务逻辑的具体执行者。

Proxy代理主题角色:也叫委托类、代理类。它负责对真实角色的应用,把所有抽象主题类定义的方法限制委托给真实主题角色实现,并且在真实主题角色处理完毕前后做预处理和善后处理工作。

3、通用源代码

普通代理:

package proxy;/** *抽象主题类 * 2014-8-20上午10:24:17-limiracle */public interface Subject {    //定义一个方法    public void request();}
package proxy;/** *真实主题类 * 2014-8-20上午10:25:15-limiracle */public class RealSubject implements Subject{    //实现方法    public void request(){        System.out.println("处理中....");    }}
package proxy;public class Proxy implements Subject{    //要代理哪个实现类    private Subject subject=null;    //默认被代理者    public Proxy(Subject subject){        this.subject=subject;    }    //通过构造函数传递代理者    public Proxy(Object...objects ){    }    //实现接口中定义的方法    public void request(){        this.before();        this.subject.request();        this.after();    }    //预处理    private void before(){        System.out.println("开始代理...");    }    //善后处理    private void after(){        System.out.println("结束代理...");    }}
package proxy;public class Main {    public static void main(String args[]){        Proxy proxy=new Proxy(new RealSubject());        proxy.request();    }}

动态代理源码

package proxy.dynamic;/** *抽象主题类 * 2014-8-20上午10:24:17-limiracle */public interface Subject {    //定义一个方法    public void request();}
package proxy.dynamic;/** *真实主题类 * 2014-8-20上午10:25:15-limiracle */public class RealSubject implements Subject{    //实现方法    public void request(){        System.out.println("处理中....");    }}
package proxy.dynamic;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class MyInvocationHandler implements InvocationHandler{    private Object target=null;    public MyInvocationHandler(Object obj){        this.target=obj;    }    @Override    public Object invoke(Object proxy, Method method, Object[] args)            throws Throwable {        return method.invoke(this.target, args);    }    }
package proxy.dynamic;public interface IAdvice {    //通知只有一个方法,    public void exec();}
package proxy.dynamic;public class BeforeAdvice implements IAdvice {    public void exec(){        System.out.println("我是前置通知,我被执行了!");    }}
package proxy.dynamic;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Proxy;public class DynamicProxy<T> {    public static <T> T newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h){        //寻找joinpoint连接点,AOP框架使用元数据定义        if(true){            //执行一个前置通知            (new BeforeAdvice()).exec();        }        //执行目标,并返回结果        return (T)Proxy.newProxyInstance(loader, interfaces, h);    }}
package proxy.dynamic;import java.lang.reflect.InvocationHandler;public class Main {    /**     * @param args     */    public static void main(String[] args) {        //定义一个主题        Subject subject=new RealSubject();        //定义一个handler        InvocationHandler handler=new MyInvocationHandler(subject);        //定义主题的代理        Subject proxy=DynamicProxy.newProxyInstance(subject.getClass().getClassLoader(), subject.getClass().getInterfaces(),handler);        //代理行为        proxy.request();    }}