一.什么是代理模式?
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