Objective
来源:互联网 发布:莉莉柯林斯长相知乎 编辑:程序博客网 时间:2024/05/19 00:07
在计算机编程语言中有32种设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样,在iOS中常用的实际模式为:代理模式,MVC模式,MVVC模式,单例模式等。
2. 代理设计模式是iOS开发中非常重要的一种设计模式,在UI中用的最多.
其应用场景:
> 当对象A无法处理某些行为的时候,想让B对象帮助处理(B对象成为A对象的代理)
> 当对象A发生一些行为,想通知对象B来解决(B对象成为A对象的代理)
> 当对象A想监听对象B的一些变化(A对象成为B对象的代理)
3. 如果想成为某个对象的代理,且必须遵守某个对象所指定的协议.帮助这个对象处理协议中的行为.
比如.
学生找房子,学生会找一个中介,让他来帮忙找房子,这个中介就是一个代理.且这个代理要遵守一定的协议,
这个中介一定要具备帮学生找房子的行为.
再比如婴儿和保姆的例子,婴儿需要照顾,可以找一个保姆来照顾婴儿,这个保姆要具备这样的协议,喂孩子喝奶,哄孩子睡觉等行为.这样保姆就成为了婴儿的代理.
4. 好了话不多少,直接上代码.(婴儿和保姆为例)
注意: 这里为了代码看着直观,我把每个类的.h和.m文件合并在一起了.在开发中一般都是多文件开发!
Baby文件:
#import <Foundation/Foundation.h>@class Baby,Nanny;@protocol babyProtocol <NSObject>// 喂孩子吃东西- (void) babyFeedFood : (Baby *)baby;// 哄孩子睡觉- (void) babyHongSleep : (Baby *)baby;@end@interface Baby : NSObject// 饥饿值@property(nonatomic,assign)int hungry;// 睡意值@property(nonatomic,assign)int sleep;// 吃东西- (void) eatFood;// 困了- (void) sleepy;// 为婴儿找一个代理@property(nonatomic,strong)id<babyProtocol> delegate;@end@implementation Baby- (void)eatFood{ self.hungry += 5; NSLog(@"baby: 宝宝饿了要吃东西! 饥饿值 = %i",_hungry); // 判断保姆是否实现了协议中的方法 if ([self.delegate respondsToSelector:@selector(babyFeedFood:)]) { [self.delegate babyFeedFood:self]; }}- (void)sleepy{ self.sleep = 3; NSLog(@"baby: 宝宝困了要睡觉! 睡意值 = %i",_sleep); if ([self.delegate respondsToSelector:@selector(babyHongSleep:)]) { [self.delegate babyHongSleep:self]; }}@end
#import "Nanny.h"#import "Baby.h"@implementation Nanny// 实现协议中的方法- (void)babyFeedFood:(Baby *)baby{ baby.hungry -= 5; NSLog(@"delegate: 别哭了,喂你喝奶! 饥饿值 = %i",baby.hungry);}- (void)babyHongSleep:(Baby *)baby{ baby.sleep += 15; NSLog(@"delegate: 别哭了,哄你睡觉! 睡意值 = %i",baby.sleep);}@end#import "Nanny.h"#import "Baby.h"@implementation Nanny// 实现协议中的方法- (void)babyFeedFood:(Baby *)baby{ baby.hungry -= 5; NSLog(@"delegate: 别哭了,喂你喝奶! 饥饿值 = %i",baby.hungry);}- (void)babyHongSleep:(Baby *)baby{ baby.sleep += 15; NSLog(@"delegate: 别哭了,哄你睡觉! 睡意值 = %i",baby.sleep);}@end
main文件.
#import <Foundation/Foundation.h>#import "Baby.h"#import "Nanny.h"#import "Student.h"int main(int argc, const char * argv[]) { // 创建一个婴儿 Baby *baby = [[Baby alloc] init]; // 创建一个保姆 Nanny *nanny = [[Nanny alloc] init]; baby.delegate = nanny; // Student *stu = [[Student alloc] init];// baby.delegate = stu; [baby eatFood]; [baby sleepy]; return 0;}
2017-07-31 12:51:17.398101+0800 婴儿和保姆代码优化[1843:63899] baby: 宝宝饿了要吃东西! 饥饿值 = 52017-07-31 12:51:17.398352+0800 婴儿和保姆代码优化[1843:63899] delegate: 别哭了,喂你喝奶! 饥饿值 = 02017-07-31 12:51:17.398377+0800 婴儿和保姆代码优化[1843:63899] baby: 宝宝困了要睡觉! 睡意值 = 32017-07-31 12:51:17.398413+0800 婴儿和保姆代码优化[1843:63899] delegate: 别哭了,哄你睡觉! 睡意值 = 18
总结:
协议的编写规范:
1. 一般情况下,当前协议属于谁,我们就讲协议定义到谁的头文件中
2. 协议的名称一般以它属于的那个类的类名开头,后面跟上protocol 或者 delegate
3. 协议中的方法起名: 一般以写明名称protocol或delegate之前的作为开头
4. 一般情况下协议中的方法会将触发该协议的对象传递出去
5. 一个类的代理名称叫delegate.(见名知意)
6. 当某一个类要称为另一个类的代理的时候,一般情况下,
在.h文件中使用@protocol 协议名称; 告诉当前类,这是一个协议,并遵守它.
在.m文件中使用 #import 真正的导入一个协议的声明
- objective
- Objective
- Objective
- Objective
- Objective
- Objective
- Objective
- Objective
- Objective
- Objective
- Objective
- Objective
- Objective
- Objective
- Objective-C
- Objective-C
- Objective-C
- RH033 Objective
- 开源ETL 工具 Kettle使用
- poj题目分类
- 线程和socke
- 开始PHP的学习!
- ArrayList和LinkedList的简单实现
- Objective
- Scala之类型参数化:Type Parameterization
- 闭包
- 网页版2048实战--简介及构建页面
- Linux yum安装包的更新列表
- python实现动态规划求解给定矩阵的和最大的子数组(矩阵中数字正负均存在)
- 一篇文章看明白 HTTP,HTTPS,SSL/TSL 之间的关系
- spring源码(7)alias标签的解析
- 关于UGUI的个人优化总结