设计模式2 观察者模式

来源:互联网 发布:重庆seo入门基础教程 编辑:程序博客网 时间:2024/04/30 20:24

1,观察者模式的定义:在gof中是这样描述观察者模式的。观察者模式定义了一种一对多的依赖关系。让多个观察者同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知多个观察者对象,让它们自动更新。

2,ios中观察者模式的实现方法有三种:Notification,kvo,以及标准方法。

Notification方法

1)注册通知,即告诉通知中心我对啥感兴趣。

[[NSNotificationCenter defaultCenter]addObserver:selfselector:@selector(doHandleLogInSuccess:)name:@"登录成功" object:nil];

注:doHandleLogInSuccess是自定义的回调方法,即收到通知后我应该去做what。

2)在程序任何一个地方都可以发送通知

[[NSNotificationCenterdefaultCenter]postNotificationName:@"登录成功" object:niluserInfo:nil];

注:还可以通过userInfo这个dic传递数据


kvo方法

介绍:key-value observing.。当被观察者的属性被修改后,kvo就会自动通知各个观察者。

kvo主要用于界面交互,当多个uiview共同作用于一个实体时,当该实体的某个属性改变时,如果需要更新多个页面,则kvo就会很好使。

使用方法:

1)监听者通过addobserver方法注册监听 指定被观察者的属性。

//被监听对象将监听者加入监听者行列

  格式:【被监听对象 addObserver 监听者 forKeyPath 被监听对象的属性 options 监视内容(新值或旧值) context 额外信息】

    kvoSub = [[KVOSubject  alloc]  init];

    [kvoSub  setValue:@"testtestName"  forKey:@"name"];

    [kvoSub setValue:@"10.0"  forKey:@"price"];

//在监听者的类中实现

   [kvoSub addObserver:self  forKeyPath:@"price"   options:NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld   context:nil];

 

2)观察者实现回调方法

//实现回调方法

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

{

    if ([keyPath isEqualToString:@"price"]) {

        NSLog(@"old price is %@",[changeobjectForKey:@"old"]);

        NSLog(@"new price is %@",[changeobjectForKey:@"new"]);

    }


}

3)移除观察者。

增加观察与取消观察是成对出现的。所以需要在最后的时候取消观察。

- (void)dealloc {

    [_priceLab release];

    [kvoSub removeObserver:self  forKeyPath:@"price"];

    [kvoSub release];

    [super dealloc];

}

    给观察者发送通知时有两种方式:自动方式和手动方式。其中自动方式是有NSObject实现的一个默认实现。通常情况下,如果你自定义了一个类是从NSObject继承而来,那么该类就已经具有了NSObject的自动通知功能。

 手动控制方式 需要重写automaticallyNotifiesObserversForKey方法,返回NO。

//改为手动通知方式

+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key

{

    BOOL automatic = NO;

    if ([key isEqualToString:@"price"]) {

        automatic = NO;

    }

    else {

        automatic = [super    automaticallyNotifiesObserversForKey:key];

    }

    return automatic;

}



kvo优点:

1)当有属性改变,kvo会自动提供消息通知

2)支持多个观察者观察同一个属性,以及相关的值。