您的位置:首页 > 移动开发 > IOS开发

iOS代理设计模式

2015-10-13 21:28 344 查看
什么是设计模式

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。

什么是代理设计模式
生活中大家一定遇到这样的情况了:比如说我要买一包纸,不妨就是心相印的吧,那一般人的话我应该不是去心相印的工厂里面直接去买吧,而是我们在心相印专卖店或者什么超市啊,这些地方购买,这些地方实际上就是心相印纸的代理。这其实和我们OO中的代理模式是很相似的。

代理设计模式的场合:

当对象A发生了一些行为,想告知对象B(让对象B成为对象A的代理对象)

对象B想监听对象A的一些行为(让对象B成为对象A的代理对象)
当对象A无法处理某些行为的时候,想让对象B帮忙处理(让对象B成为对象A的代理对象)

案例:

有一个婴儿,他本身不会自己吃饭和洗澡等等一些事情,于是婴儿就请了一个保姆,于是婴儿和保姆之间商定了一个协议,协议中写明了保姆需要做什么事情,而保姆就是这个代理人,即:婴儿和保姆之间有个协议,保姆遵守该协议,于是保姆就需要实现该协议中的条款成为代理人

代码实现

Baby.h

#import <Foundation/Foundation.h>
//1.声明婴儿是一个类
@class Baby;

//2.声明代理,写代理要帮婴儿做的事,将婴儿传给代理,注意代理格式
@protocol BabyDelegate <NSObject>

//喂婴儿吃饭
- (void)babyEat:(Baby *)baby;
//哄婴儿睡觉
- (void)babySleep:(Baby *)baby;

@end

@interface Baby : NSObject

@property (nonatomic, assign) NSInteger hurgryValue;

@property (nonatomic, assign) NSInteger sleepValue;

//3.将代理作为属性,类型限定代理遵守协议
@property (nonatomic, assign) id <BabyDelegate> delegate;

//4.声明方法,方法里调用代理,调用代理实现的协议方法,让代理帮婴儿吃饭,睡觉
//婴儿饿了要吃饭
- (void)hurgry;

//婴儿醒了要睡觉
- (void)wake;

@end


Baby.m

#import "Baby.h"
#import "Nurse.h"

@implementation Baby

//5.实现调用代理者的方法
- (void)hurgry{

//    6.判断代理是否实现了协议中的方法
if ([self.delegate respondsToSelector:@selector(babyEat:)]) {
//7.如果代理实现了协议中的方法,就调用
[self.delegate babyEat:self];
}

}

- (void)wake{
if ([self.delegate respondsToSelector:@selector(babySleep:)]) {
[self.delegate babySleep:self];
}

}

- (void)dealloc
{
NSLog(@"%s",__func__);
}

@end


Nurse.h

#import <Foundation/Foundation.h>

//8.导入代理
@protocol BabyDelegate ;

//9.遵守代理
@interface Nurse : NSObject <BabyDelegate>

@end


Nurse.m

#import "nurse.h"
#import "Baby.h"

@implementation Nurse

//10.实现协议中的方法,(喂婴儿,让婴儿吃饭,拿到婴儿才能给婴儿做事)
- (void)babyEat:(Baby *)baby{
baby.hurgryValue += 10;
NSLog(@"喂婴儿吃饭!饥饿值:%lu", baby.hurgryValue);

}

- (void)babySleep:(Baby *)baby{
baby.sleepValue += 5;
NSLog(@"摇婴儿睡觉!疲劳值:%lu", baby.sleepValue);
}

- (void)dealloc
{
NSLog(@"%s",__func__);
}

@end


main.m

#import <Foundation/Foundation.h>
#import "Baby.h"
#import "Nurse.h"

int main(int argc, const char * argv[]) {
@autoreleasepool {

//11.创建所需对象
Baby *b = [[Baby alloc]init];
Nurse *n = [[Nurse alloc]init];

//12.将代理对象作为接受代理者的代理
//(让保姆作为婴儿的代理)
b.delegate = n;

//设定婴儿初始饥饿值,疲劳值
b.hurgryValue = -5;
b.sleepValue = -5;

//13.接受代理者调用代理者的方法
//(婴儿饿了,醒了,需要吃饭和哄一哄)
[b hurgry];
[b wake];

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息