设计模式之Protocol实现代理模式
- 使用场合
- 使用步骤
- 不使用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 <Cocoa/Cocoa.h> @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 <Foundation/Foundation.h> @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 <Foundation/Foundation.h> #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 <Foundation/Foundation.h> @class Baby; @protocol LookBaby <NSObject> -(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 <Foundation/Foundation.h> #import "LookBaby.h" @class Baby; @interface Nurse : NSObject <LookBaby> @end
.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:(Baby*)baby { NSLog(@"哄孩子"); } -(void)eat:(Baby*)baby { NSLog(@"喂孩子"); } -(void)sleep:(Baby *)baby { NSLog(@"哄孩子睡觉"); } @end
3⃣️Baby定义一个实现协议的属性
.h
// // Baby.h // 01-代理模式 // // Created by apple on 14-4-2. // Copyright (c) 2014年 apple. All rights reserved. // #import <Cocoa/Cocoa.h> #import "LookBaby.h" @class Nurse; @interface Baby : NSObject @property (nonatomic, assign) int age; @property (nonatomic, retain) id <LookBaby> loolBaby; -(void)cry; -(void)eat; -(void)sleep; @end
.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); [_loolBaby cry:self]; } -(void)eat { NSLog(@"%d is hugry", _age); [_loolBaby eat:self]; } -(void)sleep { NSLog(@"%d is sleep", _age); [_loolBaby sleep:self]; } @end
4⃣️创建B对象,设置A的delegate属性为B对象
// // main.m // 01-代理模式3 // // Created by apple on 14-4-2. // Copyright (c) 2014年 apple. All rights reserved. // #import <Foundation/Foundation.h> #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.loolBaby = nurse; baby.age = 10; [baby eat]; } return 0; }