IOS:观察者模式
来源:互联网 发布:Os软件 编辑:程序博客网 时间:2024/05/28 15:34
什么是观察者模式
什么是观察者模式?你曾经订阅过报纸吗?在订阅报纸的时候,你不用去任何地方,只需要将你的个人地址信息以及订阅信息告诉出版社,出版社就知道如何将相关报纸传递给你。这种模式的第二个名称叫做发布/订阅模式。
在GoF中是这样描述观察者模式的——观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
观察者模式的的思想非常简单,Subject(主题)允许别的对象——观察者(这些对象实现了观察者接口)对这个Subject的改变进行订阅和取消订阅。当Subject发生了变化——那么Subject会将这个变化发送给所有的观察者,观察者就能对Subject的变化做出更新。在这里,Subject是报纸的出版社,而观察者则是订阅报纸的我和你,当Subject发生变化——有新的报纸,会做出通知——将报纸发送给所有的订阅者。
什么时候使用观察者模式?
当你需要将改变通知所有的对象时,而你又不知道这些对象的具体类型,此时就可以使用观察者模式。 改变发生在同一个对象中,并在别的地方需要将相关的状态进行更新。
iOS中观察者模式的实现方法
在iOS中观察者模式的实现有三种方法:Notification、KVO以及标准方法。
1.Notification
Notification - NotificationCenter机制使用了操作系统的功能。通过NSNotificationCenter可以让对象之间进行进行通讯,这些对象相互间可以不认识。当你用一个并行的流来推送通知,或者刷新数据库,并希望在界面中能够看到时,这非常有用。
NotificationCenter发布消息的方法如下所示:
1.NSNotification * broadcastMessage = [ NSNotification notificationWithName: AnyNotification object: Self ];
2.NSNotificationCenter * notificationCenter = [ NSNotificationCenter defaultCenter];
3.[NotificationCenter postNotification: broadCastMessage];
上面的代码中,创建了一个NSNotification类型的对象,并指定名称为”broadcastMessage”,然后通过notificationCenter来发布这个消息。
要订阅感兴趣的对象中的相关事件,可以按照如下方法进行:
1.NSNotificationCenter * notificationCenter = [ NSNotificationCenter defaultCenter];
2.[NotificationCenter addObserver: Self selector: @ selector (update:) name: AnyNotification object: nil ];
还要及时释放观察值
//释放观察值
[[NSNotificationCenterdefaultCenter]removeObserver:selfname:@"moviename"object:nil];
2.KVO
通过KVO,某个对象中的特定属性发生了改变,别的对象可以获得通知。苹果官方文档对KVO有了很好的解释:Key-Value Observing Programming Guide。下面两种方法都可以改变对象中属性的值1.kvoSubj.changeableProperty = @"新的一个值";
2.
3.[kvoSubj setValue:@"新的一个值" forKey:@"changeableProperty"];
上面这种值改变的灵活性可以让我们对键值进行观察。
下面是新建的一个类KVOSubject,这个类中有一个属性changeableProperty:
1.@interface KVOSubject : NSObject
2.
3.@property (nonatomic, strong) NSString *changeableProperty;
4.
5.@end
6.
7.@implementation KVOSubject
8.
9.@end
接着新建了另外一个类KVOObserver,通过该类可以监听changeableProperty属性值的改变。
1.@interface KVOObserver : NSObject
2.@end
3.
4.@implementation KVOObserver
5.
6.-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
7.{
8.NSLog(@"KVO:值发生了改变");
9.}
10.
11..@end
如上代码所示,KVOObserver类只有一个方法observeValueForKeyPath。当changeableProperty属性值的改变时,这个方法会被调用。下面是测试的代码:
1.- (IBAction)btnKVOObservationTest:(id)sender {
2.KVOSubject *kvoSubj = [[KVOSubject alloc] init];
3.KVOObserver *kvoObserver = [[KVOObserver alloc] init];
4.
5.[kvoSubj addObserver:kvoObserver forKeyPath:@"changeableProperty" 6.options:NSKeyValueObservingOptionNew context:nil];
7.
8.kvoSubj.changeableProperty = @"新的一个值";
9.
10.[kvoSubj setValue:@"新的一个值" forKey:@"changeableProperty"];
11.
12.[kvoSubj removeObserver:kvoObserver forKeyPath:@"changeableProperty"];
13.}
执行上面的代码,可以看到控制台输出如下结果:
1.2013-05-05 23:10:20.789 ObserverPattern[1358:c07] KVO:值发生了改变
2.2013-05-05 23:10:20.790 ObserverPattern[1358:c07] KVO:值发生了改变标准方法
3.标准方法
先来看看Gof中对观察者模式定义的结构图:
标准方法的实现是这样的:Subject(主题)知道所有的观察者,但是不知道它们的类型
- IOS 观察者模式
- iOS设计模式:观察者
- iOS观察者模式
- iOS设计模式:观察者
- iOS--观察者模式
- iOS--观察者模式
- [ios]观察者模式【转】
- IOS 观察者模式
- IOS 观察者模式
- IOS:观察者模式
- iOS设计模式:观察者
- ios-使用观察者模式
- IOS-观察者模式
- iOS-观察者模式
- ios 观察者模式
- IOS 观察者模式
- iOS 观察者模式
- [iOS]观察者模式
- WebService<一>
- HashMap实现原理
- 线程的(同步synchronized)控制
- static inline
- linux 禁止修改和删除文件i18n
- IOS:观察者模式
- jQuery Mobile 导航栏
- 图文解说Keil MDK下ST-Link II的连接设置
- 数据库第三范式
- [ACM] hdu Lifting the Stone(多边形的重心)
- make: *** [out/target/common/obj/PACKAGING/checkapi-current-timestamp] 错误 38 处理
- 大家都来设计模式---适配器(Adapter)模式
- BroadcastReceiver的两种注册方式(静态注册和动态注册)
- 计算机网络