iOS开发-观察者模式
观察者模式也被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。观察者模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。iOS开发中最明显的观察者模式就是KVO键值对观察,如果对于KVC和KVO不是很熟悉,可以参考本人之前博客iOS开发-KVC和KVO的理解。
关于设计模式网上的介绍多如牛毛,参考资料随手可查,简单的使用OC实现一下观察者模式,我们举一个实际工作的例子,猎头和程序员的故事,简单的就是一个猎头手里面有多个候选人的信息,一旦公司有新的工作机会,会通知所有的候选人,基于以上信息,我们通过观察者模式很容易实现。
主题对象基类:
@interface Subject : NSObject -(void)registerObserver:(id)observer; -(void)deleteObserver:(id)observer; -(void)notifyObservers; @end
@interface Subject()
@property (strong,nonatomic) NSMutableArray *observers;
@end
@implementation Subject
-(void)registerObserver:(id)observer{
[self.observers addObject:observer];
}
-(void)deleteObserver:(id)observer{
[self.observers removeObject:observer];
}
-(void)notifyObservers{
for (NSInteger i=0; i<[self.observers count]; i++) {
Observer *observer=(Observer *)[self.observers objectAtIndex:i];
[observer updateState:self observer:observer];
}
}
//getter and setter
-(NSMutableArray *)observers{
if(!_observers){
_observers=[[NSMutableArray alloc]init];
}
return _observers;
}
@end
猎头(Hunter)实现基类:
@implementation Hunter
-(void)updateInfo:(NSString *)personName{
self.personName=personName;
[self notifyObservers];
}
@end
观察者(Observer)基类:
@interface Observer : NSObject -(void)updateState:(id)subject observer:(id)observer; @end
程序员(Programmer)定义:
@interface Programmer :Observer @property (strong,nonatomic) NSString *programmerName; -(instancetype)initWithName:(NSString *)name; @end
@implementation Programmer
-(instancetype)initWithName:(NSString *)name{
self=[super init];
if (self) {
self.programmerName=name;
}
return self;
}
//原文地址:http://www.cnblogs.com/xiaofeixiang/
-(void)updateState:(id)subject observer:(id)observer{
NSLog(@"伙计们,XX要招聘了,有意的赶紧联系我");
Hunter *hunter=(Hunter *)subject;
Programmer *programmer=(Programmer *)observer;
NSLog(@"%@---%@",hunter,programmer);
}
@end
测试观察者效果:
Hunter *hunter=[[Hunter alloc]init];
Programmer *programmer=[[Programmer alloc]initWithName:@"iOS开发工程师"];
NSLog(@"博客园-FlyElephant");
[hunter registerObserver:programmer];
[hunter updateInfo:@"原文地址:http://www.cnblogs.com/xiaofeixiang/"];
[hunter deleteObserver:programmer];
[hunter updateInfo:@"iOS技术交流:228407086"];
测试一切OK,如有不当,欢迎讨论~
iOS开发-观察者模式的更多相关文章
- iOS开发系列--通知与消息机制
概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情.iOS中通知机制又叫消息机制,其包括两类:一类是本地 ...
- iOS开发路线简述
1 iOS开发环境1.1 开发环境标准的配置是MacOSX+Xcode.MacOSX的话首选用苹果电脑,Macmini最便宜只要4000多就好了然后自己配一个显示器,MacBookPro 也可以,不推 ...
- IOS开发常用设计模式
IOS开发常用设计模式 说起设计模式,感觉自己把握不了笔头,所以单拿出iOS开发中的几种常用设计模式谈一下. 单例模式(Singleton) 概念:整个应用或系统只能有该类的一个实例 在iOS开发我们 ...
- IOS开发中的几种设计模式介绍
ios开发学习中,经常弄不清楚ios的开发模式,今天我们就来进行简单的总结和探讨~ (一)代理模式 应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现. 优势:解耦合 敏捷 ...
- iOS开发的设计模式
ios开发学习中,经常弄不清楚ios的开发模式,今天我们就来进行简单的总结和探讨~ (一)代理模式 应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现. 优势:解耦合 敏捷 ...
- IOS开发中的几种设计模式
ios开发学习中,经常弄不清楚ios的开发模式,今天我们就来进行简单的总结和探讨~ (一)代理模式 应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现.优势:解耦合敏捷原则 ...
- 《iOS开发指南》正式出版-源码-样章-目录,欢迎大家提出宝贵意见
智捷iOS课堂-关东升老师最新作品:<iOS开发指南-从0基础到AppStore上线>正式出版了 iOS架构设计.iOS性能优化.iOS测试驱动.iOS调试.iOS团队协作版本控制.... ...
- iOS开发——实用篇&KVO与KVC详解
KVO与KVC详解 由于ObjC主要基于Smalltalk进行设计,因此它有很多类似于Ruby.Python的动态特性,例如动态类型.动态加载.动态绑定等.今天我们着重介绍ObjC中的键值编码(KVC ...
- iOS 开发中常见的设计模式
最近有小伙伴问到在iOS开发中的几种设计模式,这里摘录一下别人的总结(因为已经感觉总结得差不多了,适用的可以阅读一下) 首先是开发中的23中设计模式分为三大类:1.创建型 2.结构型 3.行为型 (i ...
随机推荐
- MySQL表的定期分析检查优化
Analyze Table 分析表 MySQL 的Optimizer(优化元件)在优化SQL语句时,首先需要收集一些相关信息,其中就包括表的cardinality(可以翻译为“散列程度”),它表示 ...
- laravel migrate 指定执行部分 migration
由于我不习惯于使用 laravel migration 来管理数据表变更,所以很多项目都是无法直接执行 php artisan migrate 否则会报错 SQLSTATE[42S01]: Base ...
- python 全栈开发,Day11(函数名应用,闭包,装饰器初识,带参数以及带返回值的装饰器)
一.函数名应用 函数名是什么?函数名是函数的名字,本质:变量,特殊的变量. 函数名(),执行此函数. python 规范写法 1. #后面加一个空格,再写内容,就没有波浪线了. 2.一行代码写完,下面 ...
- Date对象和Time对象
方法 描述 getDate() : setDate() 返回/设置月份中的日期(1-31) getDay() 返回星期几(0-6) getFullYear():setFullYear() ...
- LINQ学习之旅(五)
Union All/Union/Intersect操作和Top/Bottom操作和Paging操作和SqlMethods操作 Union All/Union/Intersect操作 适用场景:对两个集 ...
- F 多重背包 判断能否刚好装满
Description 有n种不同大小的数字,每种各个.判断是否可以从这些数字之中选出若干使它们的和恰好为K. Input 首先是一个正整数T(1<=T<=100)接下来是T组数据每组数据 ...
- 大数据统计分析平台之二、ElasticSearch 6.2.1的安装与使用
# 下载文件cd /usr/local/software wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch ...
- [转]一个研究生毕业以后的人生规划[ZZ]
只有选择去国内的大公司或外企才是出路 文章转载如下: 我今年39岁了, 25岁研究生毕业,工作14年,回头看看,应该说走了不少的弯路,有一些经验和教训.现在开一个小公司,赚的钱刚够养家糊口的.看看这些 ...
- BZOJ1295 [SCOI2009]最长距离 最短路 SPFA
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1295 题意概括 有一块矩形土地,被分为 N*M 块 1*1 的小格子. 有的格子含有障碍物. 如果 ...
- [OpenCV-Python] OpenCV 中图像特征提取与描述 部分 V (一)
部分 V图像特征提取与描述 OpenCV-Python 中文教程(搬运)目录 29 理解图像特征 目标本节我会试着帮你理解什么是图像特征,为什么图像特征很重要,为什么角点很重要等.29.1 解释 我相 ...