iOS開發-代理模式

代理模式有的時候也被稱之爲委託模式,可是實際上二者是有分別的,代理模式爲另外一個對象提供一個替身或佔位符訪問這個對象,代理對象和控制訪問對象屬於同一類,委託對象和對象不必定屬於同一類。二者均可以控制類的訪問,訪問代理的方法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

相關文章
相關標籤/搜索