原文首发于微信公众号:jzman-blog,欢送关注交换!

明天来看一下什么是代理设计模式,顾名思义,代理就是通过中介代替某人做某一件事,对应到咱们的程序中就是通过代理对象来管制某个具体对象某个办法的拜访,在该办法之前和之后能够做一些额定解决。

  1. 概念了解
  2. 动态代理
  3. 动静代理

概念了解

  • 形象角色:用于定义实在角色和代理角色共有的办法。
  • 实在角色:实在角色要实现的具体业务逻辑以供代理角色调用。
  • 代理角色:用于代理实在角色,可在实在角色具体逻辑前后进行额定解决。

那么代理的意义在于,当须要具体的业务逻辑时才调用实在角色的具体业务办法,即与实在角色具体业务逻辑无关的解决都放在代理类中的解决。

动态代理

先来看一下动态代理的代码实现,定义形象角色申明共用的业务逻辑,具体如下:

/** * 形象角色 * @author jzman */public interface IBusiness {    /**     * 购物     */    void buy();}

而后,创立实在角色并实现具体的业务逻辑,具体如下:

/** * 实在角色 * @author jzman */public class RealRole implements IBusiness{    @Override    public void buy() {        System.out.println("我要买货色");    }}

而后,创立代理角色,在进行具体业务逻辑的时候必须调用实在角色的业务逻辑办法,具体如下:

/** * 代理角色 * @author jzman */public class ProxyRole implements IBusiness{        private IBusiness mRealRole;        public ProxyRole(IBusiness realRole) {        this.mRealRole = realRole;    }    @Override    public void buy() {        //购买之前的额定评估        System.out.println("购买之前的额定评估...");        //具体的业务逻辑        mRealRole.buy();        //购买之后的满意度考察        System.out.println("购买之后的满意度考察...");    }}

最初,应用方才创立的相干动态代理类,具体如下:

/** * 测试动态代理 * @author jzman */public class StaticClient {    public static void main(String[] args) {        //创立实在角色        IBusiness realRole = new RealRole();        //创立代理角色        IBusiness proxyRole = new ProxyRole(realRole);        //代购帮你买货色        proxyRole.buy();    }}

测试成果如下:

购买之前的额定评估...我要买货色购买之后的满意度考察...

这个案例中,代购不仅帮咱们买到了货色,而且在购买行为产生之前和之后做了额定的解决,是不是比拟非常灵活呢。

动静代理

下面理解了动态代理,那么动静代理与动态代理有什么区别呢,实际上动态代理和动静代理次要区别是动态代理须要本人生成代理类,而动静代理是在代码运行过程中主动生成代理类,那么动静代理如下实现呢,先来看一看 Java JDK 自带的实现动静代理的要害的两个类或接口,具体如下:

//用于动静生成代理类及其对象java.lang.reflect.Proxy//代理角色的调用处理程序须要实现的接口//用于束缚调用者的实现,形象角色调用办法的时候会被该接口的invoke办法调用java.lang.reflect.InvocationHandler

上面就来实现一下 Java JDK 自带的动静代理,首先形象角色和实在角色和上文中动态代理的一样,这里就不在赘述,创立一个代理角色的调用处理程序如下:

/** * 代理角色的调用处理程序 * @author jzman */public class BusinessHandler implements InvocationHandler{    private IBusiness mRealRole;        public BusinessHandler(IBusiness mRealRole) {        super();        this.mRealRole = mRealRole;    }    @Override    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        //购买之前的额定评估        System.out.println("购买之前的额定评估...");                //实在角色具体的业务逻辑        method.invoke(mRealRole, args);                //购买之后的满意度考察        System.out.println("购买之后的满意度考察...");                return null;    }}

应用 Proxy 的静态方法 newProxyInstance() 来生成代理对象,具体如下:

/** * 测试JDK自带的动静代理 * @author jzman * */public class DynamicProxyClient {    public static void main(String[] args) {        //创立实在角色        IBusiness mRealRole = new RealRole();                //创立处理器接口        InvocationHandler handler = new BusinessHandler(mRealRole);        /**         * 获取代理角色对应的代理对象         * newProxyInstance参数(类加载器,主动生成的代理类实现的接口,代理对象的调用处理程序)         */        IBusiness proxy = (IBusiness) Proxy.newProxyInstance(handler.getClass().getClassLoader(), mRealRole.getClass().getInterfaces(), handler);                //代理角色帮你买货色        proxy.buy();    }}

上述代码的执行后果如下:

购买之前的额定评估...我要买货色购买之后的满意度考察...

学习动态代理有助于对动静代理的学习,两者次要的区别就是动静代理不须要写代理类,其相应的代理类会在代码运行期间动静生成,当然生成的代理类也实现了形象角色对应的接口,同时创立个代理角色的调用者处理程序(InvocationHandler)也会接管具体的业务逻辑。对于动态代理和动静代理就到此为止。能够抉择关注集体微信公众号:躬行之 获取最新更新,一起交流学习!