iOS代理设计模式
2015-10-13 21:28
344 查看
什么是设计模式
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。
什么是代理设计模式
生活中大家一定遇到这样的情况了:比如说我要买一包纸,不妨就是心相印的吧,那一般人的话我应该不是去心相印的工厂里面直接去买吧,而是我们在心相印专卖店或者什么超市啊,这些地方购买,这些地方实际上就是心相印纸的代理。这其实和我们OO中的代理模式是很相似的。
代理设计模式的场合:
当对象A发生了一些行为,想告知对象B(让对象B成为对象A的代理对象)
对象B想监听对象A的一些行为(让对象B成为对象A的代理对象)
当对象A无法处理某些行为的时候,想让对象B帮忙处理(让对象B成为对象A的代理对象)
案例:
有一个婴儿,他本身不会自己吃饭和洗澡等等一些事情,于是婴儿就请了一个保姆,于是婴儿和保姆之间商定了一个协议,协议中写明了保姆需要做什么事情,而保姆就是这个代理人,即:婴儿和保姆之间有个协议,保姆遵守该协议,于是保姆就需要实现该协议中的条款成为代理人
代码实现
Baby.h
Baby.m
Nurse.h
Nurse.m
main.m
设计模式(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; }
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- 七、设计模式——装饰模式
- 设计模式总结
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 设计模式之创建型模式
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- 浅谈设计模式的学习
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- PHP设计模式之装饰者模式代码实例
- php设计模式之单例模式实例分析
- 介绍php设计模式中的工厂模式
- PHP设计模式之适配器模式代码实例
- 深入浅出23种设计模式