标签:
什么是代理设计模式(这里主要是利用OC来实现代理设计模式)
简单来讲,代理就是实现消息传递的,当然与此同时我们还可以选择通知,KVO,block来实现这一过程,
什么时候使用代理设计模式
当然就是在需要完成信息传递的时候,就去使用。那么,为什么不去使用代理而不去使用通知或KVO呢?这是一个比较具体的问题,可以参考下面的(代理,通知,KVO的优缺点)
1. 你要明确你的协议名称,一般来讲名称都是:控件类名 + Delegate 2. 代理方法中一般都是声明为@optional(程序默认情况下是@required) 3. 代理方法名一般以控件开头 4. 代理方法至少有一个参数
那么举个例子,来个保姆和婴儿之间是怎样利用代理协议来实现一个简单的找过过程吧。啥都不说,然后我们上代码。 在写例子之前,我们有一点需要明确,谁是谁的代理。
接下来我们要毫不犹豫的上代码,
首先,我们创建一个婴儿类
,继承自NSObject
,接下来在.h文件中创建下面的代码
#import <Foundation/Foundation.h> @class Baby; // 定义一份代理协议 @protocol BabyDelegate <NSObject> - (void)babyWantEat:(Baby *)baby; - (void)babyWantSleep:(Baby *)baby; @end @interface Baby : NSObject /** 吃了多少东西 */ @property (nonatomic, assign) int food; /** 睡意 */ @property (nonatomic, assign) int sleep; /** 饿了 */ - (void)wantEat; /** 困了 */ - (void)wantSleep; /** 代理对象 */ @property (nonatomic, strong) id<BabyDelegate> delegate; @end
接下来是.m文件中创建下面的文件
#import "Baby.h" @implementation Baby - (void)wantEat { NSLog(@"婴儿想吃东西"); // 通知保姆喂婴儿 [self.delegate babyWantEat:self]; } - (void)wantSleep { NSLog(@"婴儿想睡觉"); // 通知保姆哄婴儿睡觉 [self.delegate babyWantSleep:self]; } @end
下面创建一个保姆类
同样继承自NSObject
,下面是.h文件中的代码
#import <Foundation/Foundation.h> @protocol BabyDelegate; @interface Nurse : NSObject <BabyDelegate> @end
接下来是.m文件中保姆需要在什么时候做什么事情,这个还是很有必要的,
#import "Nurse.h" #import "Baby.h" @implementation Nurse - (void)babyWantEat:(Baby *)baby { baby.food += 20; NSLog(@"Nurse喂婴儿吃东西--现在的食量是%d", baby.food); } - (void)babyWantSleep:(Baby *)baby { baby.sleep += 20; NSLog(@"Nurse哄婴儿睡觉--现在的睡意是%d", baby.sleep); } @end
到这里,一个基本的代理就已经完成了。
标签:
原文地址:http://my.oschina.net/zboy/blog/493104