文档章节

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

七月流火zsp
 七月流火zsp
发布于 2015/06/05 21:38
字数 948
阅读 101
收藏 2
点赞 0
评论 0

今天主要学了观察者模式,以及回顾复习了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;
    good1.clour=@"白色";
   
    Goods * good2=[[Goods alloc]init];
    good2.name = @"华为P7";
    good2.price = 2000.88;
    good2.clour=@"黑色";
    //----------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

© 著作权归作者所有

共有 人打赏支持
七月流火zsp
粉丝 9
博文 29
码字总数 11273
作品 0
西安
设计模式(Swift) - 3.观察者模式、建造者模式

上一篇 设计模式(Swift) - 2.单例模式、备忘录模式和策略模式中讲了三种常见的设计模式. 单例模式: 限制了类的实例化,一个类只能实例化一个对象,所有对单例对象的引用都是指向了同一个对象....

Dariel
07/01
0
0
教程1:Objective-C

Objective-C的教程已经看过了。 内容大概有:[Objective-C基础语法(if/else/switch/for...),关键字,运算符],[面向对象(封装/继承/多态)],[Foundation框架常用类],[内存管理],[协...

殷美洪
2013/03/11
0
0
iOS设计模式--适配器模式与观察者模式

何为适配器模式? 适配器模式,可以这么说,用于连接两种不同种类的对象,使其毫无问题地协同工作。有时它也称为包装器。其思想相当简单,适配器实现客户端所要的某种接口的行为,同时,它又...

国士梅花
2015/08/20
0
0
代理模式(Proxy Pattern):动态代理 - 最易懂的设计模式解析

前言 今天我来全面总结开发中最常用的设计模式 - 代理模式中的动态代理模式 其他设计模式介绍 1分钟全面了解“设计模式” 单例模式(Singleton) - 最易懂的设计模式解析 简单工厂模式(Sim...

Carson_Ho
04/09
0
0
简单工厂和工厂方法以及抽象工厂模式

工厂模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类 抽象工厂模式:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类 个人觉得这个区别在于产品,如果产...

王大叔爱编程
2014/09/26
0
0
总结一些IOS的面试题吧~不定期更新~附带个人理解的“参考”答案哈

除了MVC模式 你还熟悉什么设计模式 代理模式:当一个类的某些功能需要由别的类实现,但是又不确定具体是哪个类实现的 单例模式:当确保程序运行期间,某个类只有一份实例,用于进行资源共享 ...

RainOrz
2015/08/18
0
0
设计模式什么的哪有那么神秘 --开篇吐槽

我最近重新看了一遍23种设计模式,颇有感受,工作3年多了,第一次接触是在大学的时候.那个时候没什么实际项目经验,感觉设计模式学的仅仅是理论的上的存在.最近重新看过.结合3年实际的经验.感觉比...

架构梦想
2013/08/04
0
0
如何判断你是合格的高级iOS开发工程师?

前言 随着移动互联网的高速发展泄洪而来,有意学习移动开发的人越来越多了,竞争也是越来越大,需要学习的东西很多。如何才能在激烈的移动开发者竞争中一枝独秀,成为一名真正合格的高级iOS...

_小迷糊
05/26
0
0
javascript 设计模式之工厂(Factory)模式

工厂模式介绍 工厂模式是一个创建型的模式,主要就是创建对象。其中工厂模式又分为简单工厂模式和抽象工厂模式。简单工厂模式是通过工厂方法确定创建 对应类型的对象。抽象工厂模式是通过子类...

hlxiong
2014/04/14
0
0
一天一篇设计模式之--工厂模式与抽象工厂模式(创建型模式)

工厂模式与抽象工厂模式主要解决接口选择问题。 一、工厂模式 当明确计划需要在不同条件下创建不同实例时,可以使用工厂模式。 实例:发送邮件或者短信 1、创建发送信息的接口 2、创建两个实...

Timor_张先生
04/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

50 行 Python 代码,带你追到最心爱的人

程序员世纪难题 人们一提到程序员第一反应就是:我知道!他们工资很高啊!但大部分都是单身狗,不懂得幽默风趣,只是每天穿格子 polo 衫的宅男一个。甚至程序员自己也这样形容自己:钱多话少...

猫咪编程
5分钟前
0
0
JAVA知识点随心记

1.Switch case具体的支持类型? Q:支持byte、short、char、int基本类型,枚举类型和String类型(JDK7以上支持),四种基本类型的包装类型也支持,但是原因在于触发了自动拆箱,将包装类型拆成了基本...

勤奋的蚂蚁
16分钟前
0
0
NoSQL

一、NoSQL介绍 NoSQL属于非关系型数据,mysql属于关系型数据库。 对于关系型数据库来说,是需要把数据存储到库、表、行、字段里,查询的时候根据条件一行一行地去匹配,当数据量非常大的时候...

人在艹木中
21分钟前
0
0
第17章MySQL主从配置

mysql安装总结 mysql主从准备工作: 准备两台机器,每台机器安装msyql服务,并启动mysql服务 mysql详细安装 1.首先下载二进制免编译的包,下载到/usr/local/src/目录下 2.解压压缩包 3.解压完...

Linux学习笔记
24分钟前
0
0
Redis高可用及分片集群

一、主从复制 使用异步复制 一个服务器可以有多个从服务器 从服务器也可以有自己的从服务器 复制功能不会阻塞主服务器 可以通过服务功能来上主服务器免于持久化操作,由从服务器去执行持久化...

Java大蜗牛
28分钟前
0
0
前端面试题汇总

最近在复习,准备找工作了,特此总结一下前端的相关知识。 1.获取浏览器URL中查询字符的参数: function getQuery(name){    var reg = new RegExp("(^|&)"+name+"=([^&]*)"(&|$));...

凛冬来袭
今天
0
0
可持续发展的学习道路

与其要求别人,不如提升自己 内心渴望进步 经常做出改变现有模式,不断学习 寻找资源,整合资源,不断熟练这种模式 渠道很重要 先打开新世界的航路

狮子狗
今天
0
0
apollox-lua开源项目 示例codepen2

今天在示例上增加了几个功能, 首先添加js array的标准库。 所有js array的方法目前都支持了。 添加查看code模式。 点击查看code可以看到生成的lua代码。默认web模式需要把标准库连接进来, ...

钟元OSS
今天
0
0
javascript性能优化之避免重复工作

javascript最重要也最根本的性能优化标准之一是避免工作,避免工作又包括两点,第一,不做不必要的工作,第二,不做重复的已经完成的工作。第一部分可以通过代码重构完成,第二部分不做重复的...

老韭菜
今天
0
0
缓存穿透、并发和雪崩那些事

0 题记 缓存穿透、缓存并发和缓存雪崩是常见的由于并发量大而导致的缓存问题,本文讲解其产生原因和解决方案。 缓存穿透通常是由恶意攻击或者无意造成的;缓存并发是由设计不足造成的;缓存雪...

Java填坑之路
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部