【非凡程序员】 OC第十五节课 (观察者模式和KVO进行对比)

今天主要学了观察者模式,以及回顾复习了KVO,两者进行对比

什么是观察者模式?

我们先打个比方,这就像你订报纸。比如你想知道美国最近放生了些新闻,你可能会订阅一份美国周刊,然后一旦美国有了新的故事,美国周刊就发一刊,并邮寄给你,当你收到这份报刊,然后你就能够了解美国最新的动态。其实这就是观察者模式,A对B的变化感兴趣,就注册为B的观察者,当B发生变化时通知A,告知B发生了变化。这是一种非常典型的观察者的用法,我把这种使用方法叫做经典观察者模式

KVO的全称是Key-Value Observer,即键值观察。是一种没有中心枢纽的观察者模式的实现方式。一个主题对象管理所有依赖于它的观察者对象,并且在自身状态发生改变的时候主动通知观察者对象。

观察者模式是可以观察一个对象,这个对象的所有属性变化,都可以进行观察得到

KVO知识观察一个属性的改变

main函数:

//  main.m
//  商场打折
//
//  Created by 非凡程序员 on 15/6/5.
//  Copyright (c) 2015年 非凡程序员. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Goods.h"
#import "Student.h"
int main(int argc, const char * argv[]) {
   
    NSLog(@"helloworld");
    Person * person1=[[Person alloc]init];
    person1.name = @"岁岁";
   
    Person * person2=[[Person alloc]init];
    person2.name = @"平平";
   
    Goods * good1=[[Goods alloc]init];
    good1.name = @"苹果6";
    good1.price = 5500.88;
    [email protected]"白色";
   
    Goods * good2=[[Goods alloc]init];
    good2.name = @"华为P7";
    good2.price = 2000.88;
    [email protected]"黑色";
    //----------KVO--------//
    //注册
    [good1 addObserver:person1 forKeyPath:@"price" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
    [good2 addObserver:person2 forKeyPath:@"name" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
    //改值
    good1.price = 6500.88;
    good1.name = @"苹果6plus";
    good2.price = 3555.88;
    good2.name = @"华为P8";
    //移除
    [good1 removeObserver:person1 forKeyPath:@"price"];
    [good2 removeObserver:person2 forKeyPath:@"name"];
  
   
    //观察者模式
    //步骤: 注册/接收 --> 通知 --> 移除
   
    //接收 +注册  addObserver:观察者 selector:@selector(repe:)repe为方法,记得加上冒号 name:通知名称 object:通知发送人
    //注册(某个对象 student) + 接收的方法(@select(自定义方法名))
    //注意:每当写入注册对象,请在注册对象里写上接收方法。
    //参数说明:addObserver: 观察者 selector:@select(接收方法)
    //接收方法最好加:,为了参数传参数。name: 通知名称 object:通知发送人 可为nil
    [[NSNotificationCenter defaultCenter] addObserver:person1 selector:@selector(repe:) name:@"st" object:nil];
    //通知  一般为发送通知消息
    //注意:通知名称必须为已注册的通知名称,发送的通知可为任意对象类型
    //参数说明:postNotificationName: 通知名称 objects: 被发送消息
    [[NSNotificationCenter defaultCenter] postNotificationName:@"st" object:good1];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"st" object:good2];
   
    //移除 防止内存泄漏
    //方法说明: removeObserver: 观察者 name: 通知名称 object 发送人 该方法为移除观察者的消息通知
    [[NSNotificationCenter defaultCenter] removeObserver:person1 name:@"st" object:nil];
     //方法说明: removeObserver: 观察者  该方法为移除观察者对象
    [[NSNotificationCenter defaultCenter] removeObserver:person1];
    
       return 0;
}

Person.h 文件:

#import <Foundation/Foundation.h>
#import "Goods.h"

@interface Person : NSObject

@property (nonatomic,assign) NSString * name;
-(void)repe:(NSNotification *)nn;

@end

Person.m 文件:

#import "Person.h"

@implementation Person

//KVO
//回调
-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

{
        NSLog(@"%@想知道%@--%@的变动情况----现在是:%@ 原来是:%@",_name,[object name],keyPath,[change valueForKeyPath:NSKeyValueChangeNewKey],[change valueForKeyPath:NSKeyValueChangeOldKey]);
//    NSLog(@"%@,[object valueForKey:keyPath]);
//    NSLog(@"%@,[change valueForKey:@"new"]);
//    NSLog(@%@,change[@"new"]);
   
}
//观察者模式
-(void)repe:(NSNotification *)nn
{
    Goods * ppp=[nn object];
    NSLog(@"%@你好--新产品名称:%@ 价格:%.2f 颜色:%@",_name,[ppp name],[ppp price],[ppp clour]);
}

Goods.h文件:

#import <Foundation/Foundation.h>

@interface Goods : NSObject

@property (nonatomic,assign) NSString * name;
@property (nonatomic,assign) float price;
@property (nonatomic,assign) NSString * clour;
@end

Goods.m文件:

#import "Goods.h"

@implementation Goods

@end

时间: 2024-12-23 19:08:13

【非凡程序员】 OC第十五节课 (观察者模式和KVO进行对比)的相关文章

【非凡程序员】 OC第十一节课 (协议)

//协议特点:制定一份协议,其他类如果遵守就需要去实现前提是required(默认)// < > 遵守// NSObject 既是基协议 又是基类,因此,协议最终都需遵守NSObject// required 必须实现  optional 可选实现// respondToSelector:@selector(方法名) 判断一个方法是否存在// 子类继承父类 那么子类也遵守父类的协议// 协议可以多遵守,如: <myProtocol , NSObject>// 警记! 协议只是类似方

centos lamp/lnmp阶段复习 第二十五节课

centos  lamp/lnmp阶段复习   第二十五节课 上半节课 下半节课 f

centos mysql 优化 第十五节课

centos mysql  优化  第十五节课 f

centos NFS/FTP服务配置 第二十五节课

centos  NFS/FTP服务配置   第二十五节课 上半节课 下半节课 f

【非凡程序员】 OC第十六节课 初识OS X开发二(设置时间和定闹钟练习)

设置时间和定闹钟练习: ViewController.h文件:#import <Cocoa/Cocoa.h> @interface ViewController : NSViewController- (IBAction)shezhijian:(id)sender;@property (weak) IBOutlet NSTextField *Song;@property (weak) IBOutlet NSTextField *ShiJian;@property (nonatomic,stro

【非凡程序员】 OC第十四节课 (代理模式 二 闹铃响了)

这是一个人定闹钟的例子,就是人委托闹钟叫醒自己 main函数: #import <Foundation/Foundation.h>#import "Person.h"#import "Clock.h" int main(int argc, const char * argv[]) {    @autoreleasepool  {        // insert code here...        NSLog(@"Hello, World!

【非凡程序员】 OC第十四节课 (代理模式)

1.代理模式 举个例子:有一个婴儿,他本身不会自己吃饭和洗澡等等一些事情,于是婴儿就请了一个保姆,于是婴儿和保姆之间商定了一个协议,协议中写明了保姆需要做什么事情,而保姆就是这个代理人,  即:婴儿和保姆之间有个协议,保姆继承该协议,于是保姆就需要实现该协议中的条款成为代理人.2.代理模式的关键点: A完成一件事,但是自己不能完成,于是他找个代理人B 替他完成这个事情,他们之间便有个协议(protocol),B继承该协议来完成A代理给他的事情. 3.病人找医生看病 的案例: SickProtoc

黑马程序员--oc基础第五篇

五.oc的语法基础(内存管理上) 1.引用计数器:在每一个对象里都有一个引用计数器,占用4个字节的空间,在一个对象创建时引用计数器的值初始化为1. *给对象发送一条retain消息,可以使引用计数器的值+1(retain方法返回对象本身) *给对象发一条release消息,则计数器的值-1 *可以给对象发送retaincount消息来获取当前引用计数器的值 *当一个对象被销毁时,系统会自动向对象发送一条dealloc消息,就像遗言一样,可以对他进行改写,一但改写就必须调用[super deall

奋斗吧,程序员——第三十五章 莫愁前路无知己,天下谁人不识君

又是一年情人节,繁华和歌舞升平如故,诺言和鲜花令女孩们迷醉如故. 今年经历了太多的离别,很多朋友离开或者说我离开. 我知道我们不会再象以前的圣诞节一样在一起,听教堂的钟声或者看狂欢的人群. 彼此的生活是正切曲线的函数图像,在第一和第三象限画出轨迹背道而驰的弧. 她让我们渐行渐远. 路灯在雨后的路面上晕开拉长的光线,让人昏昏欲睡.灯火辉煌的街头人流如织一如往年的繁盛,我不知道当喧嚣散尽之时,树叶落下会有怎样寂寞的声响. 我透过车窗看到路边踢铝制易拉罐的男孩们,每次见到这样的孩子我总是很欣慰,他们中