代理模式
代理从字面意思来看就是代理某个人或者某个组织或者机构去完成它想完成的事;比如生活中的火车票代售窗口,代理完成火车站出售火车票;再比如婚姻介绍所,代理某个人去找自己合适的另一半;再比如房屋中介,代理房东完成出租房屋的工作等等。这种设计模式来源于生活,但是它实际应用在java代码开发中能够很好的解决实际的问题。
看下图:
图解生活中案例上图中得代理类似于java中的代理。所以有人会问代理的作用是什么呢?其实不管是生活中还是java代码中,代理的作用都是为了更好的帮你完成目标,图中的婚介所代理对象,它为了体现它的价值,,它一定会给你介绍优质单身女同胞,所以它会在你找对象的方法前加上一些判断,比如这个单身女同胞是否漂亮,是否有钱,个子是否高,学历是否可以等等等等,然后通过了这些校验然后才给你。这里就类似spring中得aop,给一些功能加上日志,异常,登录拦截的处理一样,它可以不用再改造原来的功能模块的代码的前提下,在原有的功能方法上去扩展或者完善,这就是代理模式的最大的好处。
代理模式分为静态代理和动态代理两种。
静态代理:代理和被代理对象在代理之前是确定的,他们都是事先实现相同的接口或者继承相同的抽象类。
静态代理
接口类:代理对象和被代理对象共同实现的接口
接口类被代理对象:实现接口的方法
被代理对象代理对象:实现接口的方法,并获取被代理对象
代理对象main方法运行:
测试结果以上就是静态代理模式的简单实现。
静态代理总结:
静态代理的优点:可以做到不对目标对象进行修改的前提下,对目标对象进行功能的扩展和拦截。
静态代理的缺点:因为代理对象,需要实现与目标对象一样的接口,会导致代理类十分繁多,不易维护,同时一旦接口增加方法,则目标对象和代理类都需要维护。
动态代理
java中得动态代理实现主要用到两种:JDK动态代理,CGLIB动态代理。
JDK动态代理与CGLIB动态代理的区别:
JDK动态代理: 只能代理实现接口的类,没有实现接口的类不能实现JDK动态代理。
CGLIB动态代理:针对类来实现代理的,对指定目标产生一个子类,通过方法拦截技术拦截所有父类的方法的调用。
JDK动态代理
被动态代理的接口
接口被动态代理的接口实现类
接口实现类动态代理类
package proxy.demo3;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class MatrimonialAgencyProxy implements InvocationHandler {
//定义被代理的接口
private Object target;
//构造方法获得
public MatrimonialAgencyProxy(Object target) {
this.target = target;
}
/**
* 参数:
* proxy:被代理的接口
* method:被代理接口中的方法
* agrs:方法的参数
* 返回值:方法的返回值
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
//此处的代理proxy就是我们要传的parentIdea接口
//method就是findWife()
//参数就是空
WomenCondition();
Object result = method.invoke(target,args);
Celebrate();
return result;
}
/**
* 生成代理对象
*/
public Object getProxy(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(),
target.getClass().getInterfaces(),
this);
}
//婚介所自己帮你找优质对象的方法
public void WomenCondition(){
System.out.println("婚介所提供的服务 => 找到一个肤白貌美个高有钱的单身女孩!");
}
//婚介所在你结婚后给你庆祝
public void Celebrate(){
System.out.println("婚介所提供的服务 => 祝贺你们喜结连理!!");
}
}
最后调用测试:
测试结果CGLIB的动态代理实现,需要导入CGLIB相应的jar包,这里可以自己动手尝试实现一下。
好了,最后总结一下动态代理的好处:
动态代理的优点:
1.可以使真实的角色操作更加纯粹,不用去关注一下公共的业务。
2.公共的部分交给代理角色,实现了业务的分工。
3.公共业务发生扩展时,方便集中管理。
4.一个动态代理类代理的是一个接口,一般是对应的一类业务。
5.一个动态代理类可以动态代理多个类,只要这些类都实现一个接口即可!!