码迷,mamicode.com
首页 > 其他好文 > 详细

Objective-C 中protocol(协议)及delegate(委托、代理)

时间:2015-11-13 20:43:23      阅读:351      评论:0      收藏:0      [点我收藏+]

标签:

一、什么是代理模式?

代理模式是在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:@"小帅哥??"];
12         
13         LFNurse *nurseOfdengzhiqi = [[LFNurse alloc]initWithName:@"邓紫棋"];
14         LFMather *mather = [[LFMather alloc]initWithName:name deleagete:nurseOfdengzhiqi];
15         
16         [mather delegateThingWithSomeBody:nurseOfdengzhiqi];
17         
18     }
19     return 0;
20 }

测试结果:

技术分享

 

四、总结:

代理中,需要记住的关键是在发出代理请求的类A中声明代理人B的实例变量,这样就可以保证A 能通过调用B中B代理的方法来完成A被代理的事情,即自己交代(代理)给B 的事情。

Objective-C 中protocol(协议)及delegate(委托、代理)

标签:

原文地址:http://www.cnblogs.com/ylfeiu/p/4963117.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!