Objective-C 中protocol(协议)及delegate(委托、代理)--好文集锦(转载)

一、什么是代理模式?

代理模式是在oc中经常遇到的一种设计模式,那什么叫做代理模式呢?

举个例子:

有一个婴儿,他本身不会自己吃饭和洗澡等等一些事情,婴儿妈妈上班又很忙,于是婴儿妈妈就请了一个保姆,于是婴儿妈妈和保姆之间商定了一个协议,协议中写明了保姆需要做什么事情,而保姆就是这个代理人。

二、 代理模式的关键点:

A完成一件事,但是自己不能完成,于是他找个代理人B 替他完成这个事情,他们之间便有个协议 (protocol,oc中的协议类似Java中的接口,只不过它只申明方法),B继承该协议来完成A代理给他的事情。

三、实例分析

下面来举一个经典的实例,妈妈和保姆的例子:妈妈把孩子委托给保姆照顾,于是将需要完成的事情写成一个协议:协议声明如下:

 Works.h

Objective-C 中protocol(协议)及delegate(委托、代理)--好文集锦(转载)
 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
Objective-C 中protocol(协议)及delegate(委托、代理)--好文集锦(转载)

实现协议的保姆类头文件LFNurse.h

Objective-C 中protocol(协议)及delegate(委托、代理)--好文集锦(转载)
 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
Objective-C 中protocol(协议)及delegate(委托、代理)--好文集锦(转载)

LFNurse.m

Objective-C 中protocol(协议)及delegate(委托、代理)--好文集锦(转载)
 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
Objective-C 中protocol(协议)及delegate(委托、代理)--好文集锦(转载)

定义妈妈头文件LFMather.h

Objective-C 中protocol(协议)及delegate(委托、代理)--好文集锦(转载)
 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
Objective-C 中protocol(协议)及delegate(委托、代理)--好文集锦(转载)

实现文件LFMather.m

Objective-C 中protocol(协议)及delegate(委托、代理)--好文集锦(转载)
 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
Objective-C 中protocol(协议)及delegate(委托、代理)--好文集锦(转载)

main函数测试代码:

Objective-C 中protocol(协议)及delegate(委托、代理)--好文集锦(转载)
 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:@"小帅哥
上一篇:shell脚本操作mysql数据库—创建数据库,在该数据库中创建表(插入,查询,更新,删除操作也可以做)


下一篇:jQuery的事件委托方法bind 、live、delegate、on之间有什么区别?