现在的位置: 首页 > 综合 > 正文

设计模式–代理模式

2019年06月12日 ⁄ 综合 ⁄ 共 1304字 ⁄ 字号 评论关闭

代理模式:封装对对象的访问

主要分为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保护代理与适配器模式

适配器模式也能通过某种手段来提供对象访问控制,他与保护模式的区别是他对外提供的是不一致的接口。

抱歉!评论已关闭.