设计模式02-动态代理模式

上一篇博客,我们以小明买雪碧为例介绍了代理模式(静态代理)的使用场景和代码实现
静态代理模式介绍

现在再来考虑以下假设的生活场景

小明
从楼下书店下单买书,书店再向印刷厂下单,积100分;
从楼下五金店下单买锤子,五金店再想机械厂下单,同样积100分;
...
此处省略n种类似场景

如果按照静态代理的方式,我们需要n个代理类,
会增加系统的复杂性和代码量,显然不够优雅。

这时轮到动态代理登场了,代码实现如下

1. 先定义ISeller接口

public interface ISeller {
    public void sell();
}

2. BookSeller、Hammer实现类

public class BookSeller implements ISeller {
    @Override
    public void sell() {
        System.out.println("花三天从印刷厂买书");
    }
}

public class HammerSeller implements ISeller {
    @Override
    public void sell() {
        System.out.println("花三天从机械厂买锤子");
    }
}

3. 实现InvocationHandler

public class SellerInvocationHandler implements InvocationHandler {
    private Object target;

    public SellerInvocationHandler(Object target) {
        this.target = target;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
         Object result = method.invoke(target,args);
         System.out.println("动态代理--积100分");
         return result;
    }
}

4.动态代理对象工程类DynamicSellerProxyFactory

public class DynamicSellerProxyFactory {
    public static ISeller getProxy(ISeller seller){
        SellerInvocationHandler sh = new SellerInvocationHandler(seller);
        ISeller bs = (ISeller)     Proxy.newProxyInstance(Client.class.getClassLoader(), BookSeller.class.getInterfaces(), sh);
        return bs;
    }
}

5.客户端测试程序

public class Client {
    public static void main(String[] args) {
        /**
         * 得到BookSeller的代理
         */
        ISeller seller = DynamicSellerProxyFactory.getProxy(new BookSeller());
        seller.sell();

        System.out.println("*************分界线*****************");
        /**
         * 得到HammerSeller的代理
         * 不用新增代理类
         */
        seller = DynamicSellerProxyFactory.getProxy(new HammerSeller());
        seller.sell();
    }
}

测试结果如下:
测试结果

总结

示例代码为Java JDK原生支持的动态代理实现,分成四步
1. 定义被代理对象的接口、方法
2. 定义被代理对象的实现类
3. 定义实现InvocationHandler的实现类
4. 定义生产代理对象的动态工厂类

以上四步之后,就能用动态工厂类方法产生代理对象,并使用。

猜你喜欢

转载自blog.csdn.net/wwhrestarting/article/details/78375133