上一篇博客,我们以小明买雪碧为例介绍了代理模式(静态代理)的使用场景和代码实现
静态代理模式介绍
现在再来考虑以下假设的生活场景
小明
从楼下书店下单买书,书店再向印刷厂下单,积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. 定义生产代理对象的动态工厂类
以上四步之后,就能用动态工厂类方法产生代理对象,并使用。