代理模式(动态代理)

接着我们来写一个动态代理的实例

public interface HyBusiness {

    //进口业务
    public void in();

    //出口业务
    public void out();

}

同样写一个顶层接口


public class HjlBussinessImpl implements HyBusiness {

    /**
     * HJL进口业务
     */
    @Override
    public void in() {
        System.out.println("HJL进口业务");
    }

    /**
     * HJL出口业务
     */
    @Override
    public void out() {
        System.out.println("HJL出口业务");
    }

}

被代理类实现顶层接口


public class DynamicProxy {

    /**
     * 动态代理方法
     *
     * @param object 被代理的船公司
     * @return
     * @throws Exception
     */
    public static Object dynamicProxyMethod(Class<?> object) throws Exception {
        Object entity = object.newInstance();
        //船代
        InvocationHandler handler = new SuniscoProxy(entity);

        //被代理的船公司对应类加载器
        ClassLoader cl = entity.getClass().getClassLoader();

        //代理
        HyBusiness proxy = (HyBusiness) Proxy.newProxyInstance(cl, entity.getClass().getInterfaces(), handler);
        return proxy;
    }
}

public class SuniscoProxy implements InvocationHandler {

    Object object = null;

    /**
     * 通过构造注入被代理船公司
     *
     * @param _obj 被代理船公司
     */
    public SuniscoProxy(Object _obj) {
        object = _obj;
    }

    /**
     * 代理调用实际业务逻辑方法(船公司实现接口类方法)
     *
     * @param proxy
     * @param method 方法
     * @param args   方法形参值
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = method.invoke(this.object, args);
        return result;
    }
}

动态代理


public class Customer {
    public static void main(String[] args) throws Exception {
        //客户到船代办理HJL业务
        HyBusiness proxy = (HyBusiness) DynamicProxy.dynamicProxyMethod(HjlBussinessImpl.class);

        //客户到船代办理WHL业务
        // HyBusiness proxy = (HyBusiness) DynamicProxy.dynamicProxyMethod(WhlBusinessImpl.class);

        //办理进口业务
        proxy.in();

        //办理出口业务
        proxy.out();
    }
}


小结:程序中的代码注释写的比较细,这边就不做过多解释,大家一定发现了代理类动态生成,无须像普通代理一样和被代理都一同实现顶层接口。有写的不好的地方请指正,欢迎评论交流,谢谢!





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值