一、什么是代理模式?
代理模式是在oc中经常遇到的一种设计模式,那什么叫做代理模式呢?
举个例子:
有一个婴儿,他本身不会自己吃饭和洗澡等等一些事情,婴儿妈妈上班又很忙,于是婴儿妈妈就请了一个保姆,于是婴儿妈妈和保姆之间商定了一个协议,协议中写明了保姆需要做什么事情,而保姆就是这个代理人。
二、 代理模式的关键点:
A完成一件事,但是自己不能完成,于是他找个代理人B 替他完成这个事情,他们之间便有个协议 (protocol,oc中的协议类似Java中的接口,只不过它只申明方法),B继承该协议来完成A代理给他的事情。
三、实例分析
下面来举一个经典的实例,妈妈和保姆的例子:妈妈把孩子委托给保姆照顾,于是将需要完成的事情写成一个协议:协议声明如下:
Works.h
1 #import <Foundation/Foundation.h> 2 /** 3 * 定义保姆照顾小孩的一些协议 4 * NSObject 是基协议 5 */ 6 @protocol Works <NSObject> 7 8 /** 9 * 保姆喂饭协议 10 */ 11 -(void) feed; 12 13 /** 14 * 照顾小孩协议 15 */ 16 -(void)lookAfter; 17 18 @end
实现协议的保姆类头文件LFNurse.h
1 #import <Foundation/Foundation.h> 2 #import "Works.h" 3 4 @interface LFNurse : NSObject <Works>//实现保姆照顾小孩的协议 5 6 @property(nonatomic,copy) NSString *nurseName; 7 8 -(instancetype)initWithName:(NSString*)nuserName; 9 10 @end
LFNurse.m
1 #import "LFNurse.h" 2 3 @implementation LFNurse 4 5 -(instancetype)initWithName:(NSString*)nuserName{ 6 7 if(self = [super init]){ 8 _nurseName = nuserName; 9 } 10 return self; 11 } 12 13 -(void)feed{ 14 NSLog(@"小孩肚子饿了,给他喂饭"); 15 } 16 17 -(void)lookAfter{ 18 NSLog(@"小孩开始调皮了,得照顾他"); 19 } 20 21 @end
定义妈妈头文件LFMather.h
1 #import <Foundation/Foundation.h> 2 #import "Works.h" 3 @class LFNurse; 4 5 @interface LFMather : NSObject 6 7 @property(nonatomic,strong) id<Works> delegate;//代理人,mather工作忙,得找个保姆代理照顾小孩 8 @property(nonatomic,copy) NSString *childName;//小孩得名字 9 10 -(instancetype)initWithName:(NSString*)name deleagete:(id<Works>)delegate; 11 -(void)delegateThingWithSomeBody:(LFNurse*) nurse; 12 13 @end
实现文件LFMather.m
1 #import "LFMather.h" 2 #import "LFNurse.h" 3 4 5 @implementation LFMather 6 7 -(instancetype)initWithName:(NSString*) name deleagete:(id<Works>) delegate{ 8 9 if(self = [super init]){ 10 self.childName = name; 11 self.delegate = delegate; 12 } 13 return self; 14 } 15 16 -(void)delegateThingWithSomeBody:(LFNurse *)nurse{ 17 18 NSLog(@"mather小孩的名字:%@",self.childName); 19 [self.delegate feed]; 20 [self.delegate lookAfter]; 21 NSLog(@"保姆的名字:%@",nurse.nurseName); 22 } 23 24 @end
main函数测试代码:
1 #import <Foundation/Foundation.h> 2 #import "LFMather.h" 3 #import "Works.h" 4 #import "LFNurse.h" 5 6 int main(int argc, const char * argv[]) 7 { 8 9 @autoreleasepool { 10 11 NSString *name = [[NSString alloc] initWithFormat:@"小帅哥