设计模式之代理模式

  代理模式,属于结构型设计模式,它是使用者和对象之间的访问层。

  定义:为其它对象提供一种代理以控制对这个对象的访问。

  问题描述:有些对象由于某些原因,如对象的创建开销很大或者一些安全控制,直接访问会给系统增加没必要的负担。

  解决方案:在使用者和对象之间增加一个代理类,通过代理类来创建对象以及对此对象的一些访问控制。

  结构图

  举个栗子:讲一个购买火车票的故事。。。

  我们都知道,购买火车票的方式有很多种,直接在火车站购票,可以在代售点购票,也可以在网上购票,代售点和网络都属于代理,三种购票方式的区别为:火车站购票,可以退票,获得的是纸质票;代售点购票,不可以退票,获得的是纸质票;网上购票,可以退票,获得的是电子票。使用代理模式,实现对三种购票方式的权限进行控制,具体实现方式如下:

  1. 新增一个抽象购票类BuyTickets,定义一些具体购票类和购票代理类需要实现的方法。代码如下:

         

  2. 新增一个普通购票类TrainTickets,实现抽象购票类总定义的方法。代码如下:

         

  3. 新增一个购票代理类ProxyBuyTickets,同样实现抽象购票类总定义的方法,以及自己的方法。代码如下:

         

  4. 在使用者类中通过代理类的实例分别实现三种购票方式的功能。代码如下:

         

  5. 运行后的效果,如图所示:

         

  以上是静态代理的实现方式,代理类就是使用者和对象之间的访问层,通过给代理类传入参数来指定所需要的功能,对对象的访问做了一些控制,避免了去创建一些无关的对象,节省了内存。

  动态代理实现比较简单,直接上代码了:

         

         

  优点:对实际访问的对象进行控制,并可以添加额外的功能;不同的代理器可以实现不同的功能,提高了系统的可扩展性。

  缺点:需要额外的工作,有些代理模式的实现比较复杂,也可能造成请求的处理速度很慢。

  适用场景

  1. 远程代理:使得客户端可以访问远程主机上的对象,远程主机上的对象可能有更良好的性能和处理速度,并且可以向客户隐藏网络细节,有代理对象来处理网络连接和通信工作。

  2. 虚拟代理:对于一些加载时间比较长或者占用系统资源比较多的对象,可以创建虚拟对象来先行处理与客户端的交互,再有虚拟代理转发对应的请求给真实的对象。

  3. 缓冲代理:对于一些操作频繁,而且每次操作消耗比较大的对象可以代用缓冲代理的方式,建立临时的缓冲空间,统一进行批量处理。

原文地址:https://www.cnblogs.com/chenxkang/p/6769782.html