代理模式:封装对对象的访问
主要分为3类
远程代理: 例如java rmi
虚拟代理:例如图片缓冲技术
保护代理:实现对象访问控制
demo
远程代理
顾名思义,提供对象的远程访问,在早起的jdk版本中我们编写rmi的时候是需要手动生成stub和skeleton的。这两部分的作用是隐藏对象远程调用的细节,对于上层程序像使用本地对象一样调用远程对象。完整的反射弧是,程序向stub发出调用请求,stub通过socket向skeleton发出请求,skeleton调用本地对象,本地对象返回参数给skeleton,skeleton向stub传递返回值,最后程序获取放回结果。经过远程代理的包装,对于上层程序这些实现细节都是隐藏的。
(现在使用rmi不需要用相关工具手动生成stub和skeleton的,但是其实是这部分功能被java runtime接管了,底层通过reflect实现了这一部分)
虚拟代理
虚拟代理是提供了延迟加载或者延迟创建的功能,这部分对于消耗资源大的资源的加载具有很大价值。例如在图片显示的时候,一个页面有很多图片的时候,如果不缓冲,那么
页面会卡死,直到图片加载完 才会加载剩下的组件,这样的用户体验显然很差,于是我们可以采用另外一种方式,我们先加载页面基本组建,遇到图片我们可以后台挂起线程慢慢加载,加载完成之后显示。
保护代理
保护代理用来禁止对对象的无效访问,例如对于一个产品,有价格两个属性,售货员只能get 但是不能set,对于经理可能可以拥有两者都有的权利
public interface ProductInterface{ public void setPrice(double Price)throws Exception; public double getPrice(); } public class Product implements ProductInterface{ double Price; public double getPrice(){ return Price; } public void setPrice(double Price)throws Exception{ this.Price = Price } } public class SalesmanProxy implements ProductInterface{ .... public double getPrice(){ return productx.Price; } public void setPrice(double Price)throws Exception{ throw new Exception("不支持的操作"); } }
分析
这里就主要谈谈与其他模式的区别了
1代理模式与装饰者模式
这个看起来很像是装饰模式,但是注意装饰者模式是通过对象的包装以提供额外的行为,代理模式虽然和装饰者模式一样对外提供相同的接口,他的目的是控制外部对对象的访问,并且在虚拟代理模式中对象是延迟创建的,这点装饰者做不到
2保护代理与适配器模式
适配器模式也能通过某种手段来提供对象访问控制,他与保护模式的区别是他对外提供的是不一致的接口。