Objective-C 设计模式-代理模式 (Proxy)

代理模式定义

  代理模式(Proxy),为其他对象提供一种代理,以控制对这个对象的访问。属于结构型模式,它为一个对象提供替代者或占位者,客户端通过代理对象访问目标对象,代理对象在客户端和目标对象之间起到中介的作用。

有以下几种代理:

  1. 远程代理(Remote proxy),为一个不同地址空间或网络上的对象提供本地代表。好处是代理对象将网络的细节封装起来,客户端不必关心网络的存在。
  2. 虚拟代理(Virtual proxy),根据需要创建重型或开销很大的对象。如果需要创建一个资料消耗较大的对象,先创建一个开销较小的对象来占位表示,等真正需要时才创建实体对象。这里起到了延迟对象实例化,来减缓对系统资源的消耗的作用。
  3. 保护代理(protection proxy),通过不同的访问权限控制对原始对象的访问。
  4. 智能引用代理(Smart reference proxy),当一个对象被引用时,提供一些额外的操作,比如将对此对象调用的次数记录下来等。

代理模式结构图:

代理模式中的角色都实现的类似相同的接口,客户端向Proxy发送request消息时,Proxy持有RealSubject的引用,会将消息通过request接口转发给RealSubject对象,RealSubject会执行实际的操作间接满足了客户端的请求。

 

虚拟代理实现图片延时加载

  在ios中应用开发中,经常需要显示大量的图像,如定义一个允许用户浏览相册的需求,视图以列表的形式呈现。如果将相册中的图片全部加载又不可行,移动设备上的内存很有限,必然会影响性能。而且在图像渲染到屏幕上之前,系统需要进行从磁盘上加载图片、解压缩等一些耗时操作,这些可能会影响视图显示的即时性。通过虚拟代理实现图片延时加载可以很好的解决这些问题,实现的方式如下图所示。

  图中ImageLoadProtocol协议表示代理模式中的抽象类,并定义了loadImage接口,ImageLoader表示目标对象,而ImageViewController既充当代理对象,它也是代理模式中的客户端角色,本来客户端角色应该是继承UITableView的子类来表示,但是这里视图不是通过继承,而是使用ios中的delegate委托模式把处理数据、加载图片等这些本属于UITableView的工作给它的委托对象ImageViewController来完成,这样ImageViewController也就相当于充当了客户端角色。

  

  

代理模式的优缺点

优点:

  1. 当目标对象比较复杂时,客户端使用起来可能太复杂,这时可以通过代理对象封装目标对象的细节,使客户端通过代理对象访问目标对象变得简单,这样不仅降低了复杂性,也降低了耦合性。
  2. 延迟对象的创建和实例化,减少系统资源的消耗,提高系统性能。

 

Proxy和ios中的delegate区别

  在ios中使用proxy代理模式,经常容易和delegate委托模式混淆。

委托模式,是简单的强大的模式,可让一个对象扮演另外对象的行为。委托对象保持到另外对象的引用,并在适当的时候发消息给另外对象。委托对象可以在发送消息的时候做一些额外的事情。

代理模式,代理模式一般要更严格,若干对象实现一个共同的接口。委托只是引用被委托对象

 

代理模式(Proxy)与装饰模式(Decorator)

它们都提供间接访问对象层,都保存被调用对象的引用。

代理模式(Proxy),为另一个对象提供一个替代或占位以控制对这个对象的访问。

装饰者(Decorator),动态地给一个对象添加一些额外的职责,就增加功能来说,Decorator模式比生成子类更为灵活,它避免了类爆炸问题,像装饰者(Decorator),代理模式(Proxy)组成一个对象并提供相同的接口,但代理模式并不关心对象动态职能的增减。

在代理模式(Proxy)中Subject定义了主要的功能,而且Proxy根据Subject提供功能控制对象的访问权限。在装饰者(Decorator)中Component只是提供了其中的一些功能,需要通过装饰链动态给对象增加职能。

 

posted on 2013-06-09 23:27  Markhy  阅读(985)  评论(0编辑  收藏

导航