有关模式的课堂笔记
2015-08-05 18:59
411 查看
设计模式
设计模式是用来解决编程某些特定问题。单例模式
什么时候使用单例模式?在一个工程中,有一些类只需要一个实例变量,我们就可以将这些类设计成单例模式
单例模式的作用?
当一个
类A被设计成单例模式时,由
A构造出的实例对象之于其它类来讲为全局实例对象,即在每一个类中由
A构造出的实例对象,都为相同对象
在OC中如何将一个类设计成单例模式?
在要被设计成单例的类的.h文件中声明一个构造单例方法,如:
+(Student *)shareIntance;
实现该方法
static Student *st = nil;//声明一个静态实例对象 +(Student *)shareIntance{ if (st == nil) { st = [[Student alloc] init]; } return st; } //为了防止通过 alloc 或 new 创建新的实例 +(id)allocWithZone:(struct _NSZone *)zone{ @synchronized(self){ if (st == nil) { st = [[super allocWithZone:zone] init]; } } return st; } //为了防止copy产生出新的对象,需要实现 NSCopying 协议 -(id)copyWithZone:(NSZone *)zone{ return self; }
观察者模式
什么是观察者模式?在工程中,一些类去观察
A类,当
A类发生变化时,这些观察类就会收到消息,做出相应反应。
什么时候使用观察者模式?
当一个类需要发送消息给多个类的时候,就用观察者模式
观察者模式的作用?
一对多的发送消息
如何在OC中实现观察者模式?
OC中观察者模式的设计基础:
KVC / KVO
KVC的由来:在iOS2.0之前,并没有属性来访问类中实例变量,那时候开发人员使用
键值编码的方式来访问类中的实例变量,即
KVC方式。
使用KVC来访问类中实例变量:
Student *st = [[Student alloc] init]; //赋值 [st setValue:@"vincent" forKey:@"_name"]; [st setValue:@25 forKey:@"_age"]; //访问 NSString *name = [st valueForKey:@"_name"]; NSNumber *age = [st valueForKey:@"_age"]; //键路径编码 Book *book = [Book new]; //st.book = book; //st.book.bookName = @"金品梅"; [st setValue:book forKeyPath:@"_book"]; [st setValue:@"金品梅" forKeyPath:@"_book._bookName"]; NSLog(@"%@",[book description]); NSString *bookName = [st valueForKeyPath:@"_book._bookName"]; [st setValue:@"guangzhou" forKeyPath:@"_address"]; NSLog(@"des = %@",[st description]);
KVO的由来:在编程过程中,我们经常需要判断目标是否发生改变,以便及时的做出对应的处理。此时苹果公司就提供一种策略,即
OC运行时提供了
kVO技术。其中
KVO是基于
KVC实现。
KVO的实现:
1. 注册成为观察者
2. 观察者定义KVO回调
3. 移除观察者
代码示例:
-(id)initWithStudent:(Student *)st{ if (self = [super init]) { self.st = st; //1.注册观察者 [self.st addObserver:self forKeyPath:@"_name" options:NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld context:nil]; [self.st addObserver:self forKeyPath:@"_age" options:NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld context:nil]; [self.st addObserver:self forKeyPath:@"_book._bookName" options:NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld context:nil]; } return self; } //注册KVO回调 -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ if ([keyPath isEqualToString:@"_name"]) { NSLog(@"name change = %@",change); } if ([keyPath isEqualToString:@"_age"]) { NSLog(@"age change = %@",change); } if ([keyPath isEqualToString:@"_book._bookName"]) { NSLog(@"book change = %@",change); } } //移除观察者 -(void)dealloc{ [self.st removeObserver:self forKeyPath:@"_name" context:nil]; [self.st removeObserver:self forKeyPath:@"_age" context:nil]; [self.st removeObserver:self forKeyPath:@"_book._bookName" context:nil]; }
相关文章推荐
- 4.5 局部区域颜色变化的面积图
- 实训笔记(Java基础)
- QT编译oracle驱动
- shell脚本统计出日志文件操作以及其对应的平均时间
- 数字钟的制作
- 集训第四周(高效算法设计)M题 (扫描法)
- MFC类之间获取指针的方法
- Lua笔记6-闭包1
- 导出特定内容成insert语句
- 非文人,非墨客,以竹开题
- Spring MVC使用RESTful风格的PUT请求
- 文档、视图和框架:分割窗口
- 扑克牌算24点 DFS
- 字符串分割
- 有关截取歌词中字符串的作业(用工程实现)
- spark资料汇总
- 重学java23种设计模式(13)责任链模式
- Mybatis 源码解析(三) - properties标签
- UVA10815 Andy's First Dictionary
- POJ-3620Avoid The Lakes (搜索)