设计模式之Protocol实现代理模式(一)

2014-11-23 23:41:28 · 作者: · 浏览: 2
使用场合
使用步骤
不使用protocol实现代理
使用protocol实现代理
一、使用场合
A想让B帮忙,就让B代理
A想通知B发生了一些事情,或者传一些数据给B
观察者模式
二、使用步骤
定义一份协议
B遵循协议,并且实现相应的方法
A中定义一个代理属性:id <协议> delegate
创建B对象,将其附值给A的delegate属性
三、不使用protocol实现代理
首先不使用protocol来实现,这样就可以更好的对比:代理到底有什么好的。
项目中使用到的类
我们现在想让护士来照看孩子,如果孩子出现哭、吃、睡等行为时,护士立马相应,并且做出相应的动作
Baby.h
复制代码
//
// Baby.h
// 01-代理模式
//
// Created by apple on 14-4-2.
// Copyright (c) 2014年 apple. All rights reserved.
//
#import
@class Nurse;
@interface Baby : NSObject
@property (nonatomic, assign) int age;
@property (nonatomic, retain) Nurse *nurse;
-(void)cry;
-(void)eat;
-(void)sleep;
@end
复制代码
Baby.m
复制代码
//
// Baby.m
// 01-代理模式
//
// Created by apple on 14-4-2.
// Copyright (c) 2014年 apple. All rights reserved.
//
#import "Baby.h"
#import "Nurse.h"
@implementation Baby
-(void)cry
{
NSLog(@"%d is crying", _age);
[_nurse cry:self];
}
-(void)eat
{
NSLog(@"%d is hugry", _age);
[_nurse eat:self];
}
-(void)sleep
{
NSLog(@"%d is sleep", _age);
[_nurse sleep:self];
}
@end
复制代码
Nurse.h
复制代码
//
// Nurse.h
// 01-代理模式
//
// Created by apple on 14-4-2.
// Copyright (c) 2014年 apple. All rights reserved.
//
#import
@class Baby;
@interface Nurse : NSObject
-(void)cry:(Baby*) bady;
-(void)eat:(Baby*) bady;
-(void)sleep:(Baby*) bady;
@end
复制代码
Nurse.m
复制代码
//
// Nurse.m
// 01-代理模式
//
// Created by apple on 14-4-2.
// Copyright (c) 2014年 apple. All rights reserved.
//
#import "Nurse.h"
@implementation Nurse
-(void)cry
{
NSLog(@"哄孩子");
}
-(void)eat
{
NSLog(@"喂孩子");
}
-(void)sleep
{
NSLog(@"让孩子睡觉");
}
@end
复制代码
main.m
复制代码
//
// main.m
// 01-代理模式2
//
// Created by apple on 14-4-2.
// Copyright (c) 2014年 apple. All rights reserved.
//
#import
#import "Baby.h"
#import "Nurse.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Nurse *nurse = [[Nurse alloc] init];
Baby *baby = [[Baby alloc] init];
baby.nurse = nurse;
[baby cry];
}
return 0;
}
复制代码
似乎这样的实现,并没有什么问题,但是如果有一天,护士突然不照护孩子了,我们将孩子交给一个老师来照料,是不是很多内容还改?
甚至有一天老师也不照料了,我们给孩子的爷爷奶奶来照料,又需要改很多内容
所以,我们可以使用protocol来实现
四、使用protocol实现代理
1 我们先定义一份协议
复制代码
//
// LookBaby.h
// 01-代理模式3
//
// Created by apple on 14-4-2.
// Copyright (c) 2014年 apple. All rights reserved.
//
#import
@class Baby;
@protocol LookBaby
-(void)cry:(Baby*) baby;
-(void)eat:(Baby*) baby;
-(void)sleep:(Baby*) baby;
@end
复制代码
2 Nurse遵循协议,且实现协议中的方法
.h
复制代码
//
// Nurse.h
// 01-代理模式
//
// Created by apple on 14-4-2.
// Copyright (c) 2014年 apple. All rights reserved.
//
#import
#import "LookBaby.h"
@class Baby;
@interface Nurse : NSObject
@end
复制代码
.m
复制代码
//
// Nurse.m
// 01-代理模式
//
// Created by apple on 14-4-2.
// Copyri