模式
对象要做某事,自己不去完成,让另一个对象去完成
通知与代理的区别
共同点:
- 利用通知和代理都能完成对象之间的通信
(比如A对象告诉D对象发生了什么事情, A对象传递数据给D对象)
不同点:
- 代理 : 一对一关系(1个对象只能告诉另1个对象发生了什么事情)
- 通知 :一对一,一对多, 多对多关系(1个对象能告诉N个对象发生了什么事情, 1个对象能得知N个对象发生了什么事情)
实现步骤
代理对象拥有目标对象属性
- 定义协议,代理方法
- 目标对象: 增加属性 id类型<协议> (使用泛型来约束)
- 目标对象: 使用delegate对象调用协议方法(判断协议方法是否可以响应)
- 代理对象: 遵守协议、实现协议方法
目标对象
//
// Baby.h
#import <Foundation/Foundation.h>
// 协议中用到对象自己,使用 @class 去声明
@class Baby;
// 定义协议
@protocol BabyDelegate <NSObject>
// 定义代理需要执行的方法
@required
- (void)feed:(Baby*)baby;
@end
@interface Baby : NSObject
// 设置代理属性
@property(nonatomic,weak) id<BabyDelegate>delegate;
@property(nonatomic,retain) NSString *name;
// 定义方法(触发协议中的方法)
- (void)eat;
@end
//
// Baby.m
#import "Baby.h"
@implementation Baby
// 实现方法
- (void)eat{
NSLog(@"baby饿了");
// 检测代理方法是否可执行
if ([self.delegate respondsToSelector:@selector(feed:)]) {
// 执行协议中的方法
[self.delegate feed:self];
}
}
@end
代理对象
//
// Nurse.h
#import <Foundation/Foundation.h>
#import "Baby.h" // 引入协议所在的头文件
// 遵守协议
@interface Nurse : NSObject <BabyDelegate>
@end
//
// Nurse.m
#import "Nurse.h"
@implementation Nurse
// 实现协议中的方法
- (void)feed:(Baby *)baby {
NSLog(@"喂%@吃奶",baby.name);
}
@end
mian文件
//
// main.m
#import "Nurse.h"
@implementation Nurse
// 实现协议中的方法
- (void)feed:(Baby *)baby {
NSLog(@"喂%@吃奶",baby.name);
}
@end