ios 代理和委托的区别

搜索之,看到了两篇文章,一时不能嚼透,留待日后细究。

特别是关于那个延迟实例化的的好处,不大理解。

代理(Proxy)和委派(Delegate)的区别

http://hi.baidu.com/thinkinginlamp/item/8b54ea0b54eaea10addc70e8


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

http://www.cnblogs.com/markhy/archive/2013/06/09/3125494.html


第一篇:

模式是程序员之间的交流语言,代理(Proxy)和委派(Delegate)是模式中常见的词汇,不过很多人把他们混淆了,甚至等同起来,这会造成很多沟通交流上的误解,下面说说他们的区别,先看一个UML图:




图形已经表述的很直白了,如果还不清晰,可以看看下面的代码:

01 interface Subject
02 {
03     public function DoAction();
04 }
05
06 class RealSubject implements Subject
07 {
08     public function DoAction()
09     {
10         echo '_RealSubject::DoAction_';
11     }
12 }
13
14 class Proxy implements Subject
15 {
16     public function __construct()
17     {
18         $this->subject = new RealSubject();
19     }
20
21     public function DoAction()
22     {
23         echo 'Proxy::DoAction';
24         $this->subject->DoAction();
25         echo 'Proxy::DoAction';
26     }
27 }
28
29 $proxy = new Proxy();
30 $proxy->DoAction();

运行结果输出:Proxy::DoAction_RealSubject::DoAction_Proxy::DoAction

如果你还没有看出端倪,我就再废话几句:首先从词性来看,代理(Proxy)是名词,委派(Delegate)是动词,其次代理说明了若干个对象实现了一个共同的接口,而委派只是说明一个对象引用了另一个对象,并不牵扯接口。


第二篇:

代理模式定义

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

有以下几种代理:

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

代理模式结构图:

ios 代理和委托的区别_第1张图片

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

 

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

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

ios 代理和委托的区别_第2张图片

  图中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只是提供了其中的一些功能,需要通过装饰链动态给对象增加职能。

 


你可能感兴趣的:(进阶阅读)