代理,又稱委託代理(delegate),是iOS中經常使用的設計一種模式。顧名思義,它是把某個對象要作的事情委託給別的對象去作。那麼別的對象就是這個對象的代理,代替它來打理要作的事。反映到程序中, 首先要明確一個對象的委託方是哪一個對象,委託所作的內容是什麼。在iOS程序設計中,委託經過一種@protocol的方式實現,因此又稱爲協議。在iOS的SDK裏面,UITableView、UITextField等都有用到這種設計模式。html
協議,是多個類共享的一個方法列表,在協議中所列出的方法沒有響應的實現,由其它類來實現。委託是指給一個對象提供機會對另外一對象中的變化作出反應或者相應另外一個對象的行爲。其基本思想是協同解決問題。設計模式
從方法的定義咱們不難看出委託模式可以起到兩方面的做用:atom
第一:代理協助對象主體完成某項操做,將須要定製化的操做經過代理來自定義實現,達到和子類化對象主體一樣的做用。
第二:事件監聽,代理對象監聽對象主體的某些重要事件,對事件作出具體響應或廣播事件交給須要做出響應的對象。spa
我的理解採用委託模式的好處在於:
一、避免子類化帶來的過多的子類以及子類與父類的耦合
二、經過委託傳遞消息機制實現分層解耦設計
在程序中:通常狀況下代理
1.委託須要作的工做有:code
1.1定義協議與方法htm
1.2聲明委託變量對象
1.3設置代理blog
1.4經過委託變量調用委託方法
2.代理須要作的工做有:
2.1遵循協議
2.2實現委託方法
好比,學生想要買一本專業書,書店沒有這本書,本身又不直接去出版社,因而,學生就委託書店,幫忙買書,書店就是學生的代理。
學生 Student.h裏面:
#import <Foundation/Foundation.h> //定義協議與方法 @protocol StudentBuyBookDelegate<NSObject> -(void)buyBook:(NSString *)name price:(int)p; @end @interface Student : NSObject //聲明委託變量 @property(nonatomic,retain)id<StudentBuyBookDelegate> stu_delegate; -(void)wantBuy; @end
學生 Student.m裏面:
#import "Student.h" @implementation Student -(void)wantBuy { NSLog(@"學生:我想買IOS開發的書"); //經過委託變量調用委託方法 [self.stu_delegate buyBook:@"IOS開發" price:50]; } @end
書店BookShop.h
#import <Foundation/Foundation.h> #import "Student.h" //書店遵照StudentBuyBookDelegate的委託協議 @interface BookShop : NSObject<StudentBuyBookDelegate> @end
書店 BookShop.m
#import "BookShop.h" @implementation BookShop //書店實現協議的方法 -(void)buyBook:(NSString *)name price:(int)p { NSLog(@"我能夠以%i元的價格把%@賣個你",p,name); } @end
在ViewController.m裏面
Student *student =[[Student alloc]init]; BookShop *bookshop = [[BookShop alloc]init]; //學生設置代理,委託書店買書 student.stu_delegate=bookshop; //判斷書店是否實現了協議,避免未實現帶來的崩潰 if ([bookshop respondsToSelector:@selector(buyBook:price:)]) { [student wantBuy]; }
結果如圖:
總結:協議是一個方法簽名的列表,在其中能夠定義若干個方法。根據配置,遵照該協議的類會去實現這個協議中規定的若干個方法。代理是一個概念,很難用一個名詞去定義(如咱們能夠說協議其實就是一個方法列表)。它更像是一種關係,我要作某一個事情,但我本身不想去作這件事,我委託其餘人幫我去作這件事。這個時候,這位其餘人就是個人代理。
本文側重於概念的理解,經過學生書店購書的例子,解釋了代理協議的概念。下文《iOS 用代理實現界面反向傳值》將側重於代理協議在iOS 程序設計的應用,好比界面反向傳值等等。