一.什麼是代理模式?
1. 代理(delegate)也叫委託是iOS開發中經常使用的設計模式。
2. 藉助於protocol(協議)能夠很方便的實現這種設 計模式。
3. 舉例:嬰兒和保姆之間有個協議,保姆繼承該協議,因而保 姆就須要實現該協議中的條款成爲代理人。
4. 通俗的說法:爲別人作嫁衣
5.總而言之,代理設計默認的基本思想:兩個對象協同解決問題,一般運用於對象間通訊。
6.簡化了對象的行爲,最大化減少對象之間的耦合度 使用代理,通常來講無需子類化,簡化了咱們應用 程序的開發,既容易實現,並且靈活。
二.代理模式規範
1.協議名的規範

#import <Foundation/Foundation.h>設計模式
@protocol sicDelegate <NSObject>函數
- (void) cure;atom
@end
二、類聲明的規範
#import <Foundation/Foundation.h>
#import "Agreement.h"spa
@interface Sick : NSObject.net
@property(nonatomic,retain) NSString *name;
@property(nonatomic,strong)id<sicDelegate> delegate;
- (void) ill;設計
@end代理
三.代理模式注意點
1.在委託類中聲明方法@property(nonatomic,strong)id<sicDelegate> delegate;
2.在協議中聲明委託人須要被委託對象實現的方法
3.被委託對象,即代理者須要遵照協議code
4.好比在上篇博文中鬧鈴爲例,代理中委託方想委託某個對象實現特定功能,只需在方法實現中引入特定功能便可:
- (void) settime {
NSLog(@"人定了鬧鐘,鬧鐘響了,人才起牀");
[_delegate reveille];
}
配套行爲:
a.需委託方在接口中聲明代理方@property(nonatomic,strong)id<getUp> delegate;和本身的行爲- (void) settime;
b.需在協議中聲明委託人須要被委託對象實現特定功能的方法- (void) reveille;
c.被委託對象,即代理者遵照協議,只需在實現中實現特定功能的方法
- (void) reveille {
NSLog(@"具體寫如何實現人定了鬧鐘,鬧鐘響了,人才起牀的方法");
}orm
四.案例對象
病人小黑病了,找醫生小花開病
1.協議裏代碼:
#import <Foundation/Foundation.h> @protocol sicDelegate <NSObject> - (void) cure; @end
2.病人類.h代碼:
#import <Foundation/Foundation.h> #import "Agreement.h" @interface Sick : NSObject @property(nonatomic,retain) NSString *name; @property(nonatomic,strong)id<sicDelegate> delegate; - (void) ill; @end
3.病人.m裏代碼:
#import "Sick.h" //#import "Agreement.h" @implementation Sick - (void) ill { NSLog("%病人說:我生病了",_name); [_delegate cure]; } - (void) dealloc { NSLog("%對象釋放",_name); } @end
4.醫生揭開.h裏代碼:
#import <Foundation/Foundation.h> #import "Agreement.h" @interface Doctor : NSObject<sicDelegate> @property(nonatomic,retain) NSString *name; @end
5.醫生實現.m裏代碼:
#import "Doctor.h" @implementation Doctor - (void) cure { NSLog("%醫生說:開始治病",_name); } - (void) dealloc { NSLog("%對象釋放",_name); } @end
6.主函數裏代碼:
#import <Foundation/Foundation.h> #import "Sick.h" #import "Doctor.h" #import "Dog.h" int main(int argc, const char * argv[]) { autoreleasepool { // insert code here... NSLog("Hello, World!"); Sick *sick=[[Sick alloc]init]; sick.name=@"小花"; Doctor *doctor=[[Doctor alloc]init]; doctor.name=@"小黑"; sick.delegate=doctor; [sick ill]; } return 0; }
7.運行結果:
2015-06-03 19:19:50.854 代理[3095:1583641] Hello, World! 2015-06-03 19:19:50.856 代理[3095:1583641] 小花病人說:我生病了 2015-06-03 19:19:50.856 代理[3095:1583641] 小黑醫生說:開始治病 2015-06-03 19:19:50.856 代理[3095:1583641] 小花對象釋放 2015-06-03 19:19:50.856 代理[3095:1583641] 小黑對象釋放 Program ended with exit code: 0