前提
不知道大家是否看过《大话设计模式》,其中大话设计模式中讲代理模式的故事感觉还是很搞笑的,自己想追求女朋友,但却请朋友代劳,结果变成了朋友和期待的女朋友在一起。唉,这还是说明有些事情还是需要自己勇敢出击才能得到,否则是人财两空啊。其实小故事中却讲述了一个代理模式的机制。
2、可以通过重写一些类满足特定的需要
2、虚拟代理,根据需要创建开销很大的对象,通过它存放实例化需要很长时间的真实对象
3、安全代理,用于控制真实对象访问时的权限
4、智能指引,调用真实对象时,代理处理另外一些事
【总结】
代理模式是很常用的一种设计,也是反射机制实现的原理。而且在需要优秀的框架中均有。目前常用两种动态代理方式,一是JDK中通过反射机制实现,二是开源框架CGLIB实现动态代理。后续的博客会详细说明上述两种动态代理实现方式。
文章纯属个人认知,如有理解偏颇之处,还请各位大神赐教,不胜感激!
不知道大家是否看过《大话设计模式》,其中大话设计模式中讲代理模式的故事感觉还是很搞笑的,自己想追求女朋友,但却请朋友代劳,结果变成了朋友和期待的女朋友在一起。唉,这还是说明有些事情还是需要自己勇敢出击才能得到,否则是人财两空啊。其实小故事中却讲述了一个代理模式的机制。
何为代理模式?
所谓的代理模式就是在原有服务上多加一个占位,通过占位去控制服务的访问。通过为其他对象提供一种代理以控制对这个对象的访问。
例子
假如是自己是一位工程师,提供技术帮助,公司有一位客服,不懂技术,此时有一位用户,需要公司提供技术服务,此时用户只能联系客服沟通,而不是直接找工程师,再由客服根据公司的规章制度和业务规则和业务规则决定是否来找工程师服务。此时客服就是一个代理,客户只能通过客服代理访问工程师。站在用户的角度,只需要认识客服就行了。站在工程师的角度,只需认为客服代表公司,不用管工程师是如何为用户服务的。
调用机制
用图形来代表代理模式
调用方式UML图
代码实践
public interface Subject {
void Request();
}
//真实对象
public class RealSubject implements Subject {
@Override
public void Request() {
System.out.println("我是真实的对象");
}
}
//代理对象
public class Proxy implements Subject {
@Override
public void Request() {
System.out.println("##########################");
System.out.println("我是代理对象,关联真实对象");
RealSubject realSubject = new RealSubject();
System.out.println("调用真实对象的方法");
System.out.println("###################################");
realSubject.Request();
}
}
//调用
public class client {
public static void main(String[] args) {
Proxy proxy = new Proxy();
proxy.Request();
}
}
为什么要用代理模式?
1、通过代理模式可以控制如何访问真正的服务对象提供额外的服务。2、可以通过重写一些类满足特定的需要
代理模式应用场景
1、远程代理,为一个对象在不同的地址空间提供局部代表,隐藏一个对象存在于不同地址空间的事实2、虚拟代理,根据需要创建开销很大的对象,通过它存放实例化需要很长时间的真实对象
3、安全代理,用于控制真实对象访问时的权限
4、智能指引,调用真实对象时,代理处理另外一些事
【总结】
代理模式是很常用的一种设计,也是反射机制实现的原理。而且在需要优秀的框架中均有。目前常用两种动态代理方式,一是JDK中通过反射机制实现,二是开源框架CGLIB实现动态代理。后续的博客会详细说明上述两种动态代理实现方式。
文章纯属个人认知,如有理解偏颇之处,还请各位大神赐教,不胜感激!