您的位置:首页 > 其它

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

2017-10-28 13:45 393 查看
上一篇博客,我们以小明买雪碧为例介绍了代理模式(静态代理)的使用场景和代码实现

静态代理模式介绍

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

小明
从楼下书店下单买书,书店再向印刷厂下单,积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. 定义生产代理对象的动态工厂类

以上四步之后,就能用动态工厂类方法产生代理对象,并使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息