代理模式有的時候也被稱之爲委託模式,可是實際上二者是有分別的,代理模式爲另外一個對象提供一個替身或佔位符訪問這個對象,代理對象和控制訪問對象屬於同一類,委託對象和對象不必定屬於同一類。二者均可以控制類的訪問,訪問代理的方法A也就意味着訪問對象的方法A,訪問委託對象方法A執行的是能夠是對象的方法B。從實際開發的角度看,委託屬於代理模式的擴大版,並無那麼多的限制。atom
代理模式相對比較簡單,能夠簡單的看一下UML類圖:
spa
代理模式以便管理客戶對對象的訪問,管理訪問的方式有不少種。遠程代理管理客戶和遠程對象之間的交互,虛擬代理控制方式實例開銷大的對象,代理模式和裝飾者模式有點類似,裝飾者模式爲對象加上行爲,代理模式控制對另外一個對象的訪問。代理
咱們就根據上面的UML的類圖寫一個比較常規的例子,先定義定義Subject:指針
@protocol SubjectProtocol<NSObject> -(void)displayImage; @end @interface Subject : NSObject<SubjectProtocol> @end
Proxy中的subject屬性至關於UML中的delegate指向了真實對象的引用:對象
@interface SubjectProxy() @property (strong,nonatomic) Subject *subject; @property (strong,nonatomic) NSString *fileName; @end @implementation SubjectProxy -(instancetype)initWithFileName:(NSString *)fileName{ self=[super init]; if (self) { self.fileName=fileName; } return self; } -(void)displayImage{ if (!self.subject) { self.subject=[[RealSubject alloc]initWithFileName:self.fileName]; } [self.subject displayImage]; } @end
RealSubject的實現:blog
@interface RealSubject() @property (strong,nonatomic) NSString *fileName; @end @implementation RealSubject -(instancetype)initWithFileName:(NSString *)fileName{ self=[super init]; if (self) { self.fileName=fileName; } return self; } -(void)loadFromDisk{ NSLog(@"Loading--%@",self.fileName); } -(void)displayImage{ NSLog(@"Display--%@",self.fileName); } @end
調用:開發
Subject *sub=[[SubjectProxy alloc]initWithFileName:@"博客園-FlyElephant"]; Subject *proxy=[[SubjectProxy alloc]initWithFileName:@"Book"]; [sub displayImage]; [proxy displayImage];
輸出:get
2016-01-19 08:22:28.305 iOS[24822:5266030] Display--博客園-FlyElephant 2016-01-19 08:22:28.305 iOS[24822:5266030] Display--Subject---Book
iOS開發中咱們對委託用的比較多,理解代理模式也很容易,代理在Objective-C中有一種更重要的例子是用於引用計數指針對象,當一個複雜對象的多份副本須存在時,代理模式能夠結合享元模式以減小存儲器用量。典型做法是建立一個複雜對象及多個代理者,每一個代理者會引用到本來的複雜對象。而做用在代理者的運算會轉送到本來對象。一旦全部的代理者都不存在時,複雜對象會被移除。博客
關於iOS中的委託若是不熟悉能夠參考本文以前的iOS開發-委託實戰~it