iOS开发-观察者模式
观察者模式也被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。观察者模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。iOS开发中最明显的观察者模式就是KVO键值对观察,如果对于KVC和KVO不是很熟悉,可以参考本人之前博客iOS开发-KVC和KVO的理解。
关于设计模式网上的介绍多如牛毛,参考资料随手可查,简单的使用OC实现一下观察者模式,我们举一个实际工作的例子,猎头和程序员的故事,简单的就是一个猎头手里面有多个候选人的信息,一旦公司有新的工作机会,会通知所有的候选人,基于以上信息,我们通过观察者模式很容易实现。
主题对象基类:
1 2 3 4 5 6 7 8 9 | @ interface Subject : NSObject -( void )registerObserver:(id)observer; -( void )deleteObserver:(id)observer; -( void )notifyObservers; @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | @ 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)实现基类:
1 2 3 4 5 6 7 8 | @implementation Hunter -( void )updateInfo:(NSString *)personName{ self.personName=personName; [self notifyObservers]; } @end |
观察者(Observer)基类:
1 2 3 4 5 | @ interface Observer : NSObject -( void )updateState:(id)subject observer:(id)observer; @end |
程序员(Programmer)定义:
1 2 3 4 5 6 7 | @ interface Programmer :Observer @property (strong,nonatomic) NSString *programmerName; -(instancetype)initWithName:(NSString *)name; @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | @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 |
测试观察者效果:
1 2 3 4 5 6 7 | 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,如有不当,欢迎讨论~
本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/5084224.html,如需转载请自行联系原作者
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
iOS开发-UIImageView高效设置Radius
圆角的设置在iOS中随处可见,开发的时候也很方便,但是有的时候如果一个页面有大量的需要设置圆角的图片,容易产生性能问题,UIImageView ios9.0之前设置圆角是会产生离屏渲染的,9.0之后不会产生离屏渲染 因此需要日常设置圆角的方法上加一些改动: 1.最简单的图片圆角设置: 1 2 3 4 5 self.imageView=[[UIImageView alloc]initWithFrame:CGRectMake(100,200, 100, 100)]; [self.imageView setImage:[UIImage imageNamed: @"FlyElephant.jpg" ]]; self.imageView.layer.cornerRadius=50; self.imageView.layer.masksToBounds=YES; [self.view addSubview:self.imageView]; 2.设置Rasterize栅格化处理,会将图片放在缓存区,不会不断的进行图片渲染: 1 2 3 4 5 6 7 self.imageView=[[UIImage...
- 下一篇
iOS:搜索栏控件UISearchBar and SearchDisplayController的使用
UISearchBar and SearchDisplayController控件: 这是一个带搜索栏和搜索显示控制器的控件,前面的SearchBar是一个搜索栏,它提供一个输入搜索条件的类似于文本框的东西,后面的SearchDisplayController是一个显示搜索结果的控制器,它自带着一个searchResultsTableView搜索结果表格视图,用来显示搜索的结果的。当然,这个表格视图要想实现功能,必须要实现<UISearchBarDelegate>和<UISearchDisplayDelegate>协议。输入搜索条件时,要用到一个新知识,即谓词NSPredicate对象的使用,它类似于数据库的搜索,也用到类似于正则表达式的功能。 用途举例:搜索当前表格中某一类型的数据。这就涉及到了两个表格视图,一个TableView和另一个searchResultsTableView,因此,需要一个区分标识,以用来决定需要显示那一个表格视图的内容。 提示:该控件在iOS8中已经过时,被UISearchController取代。 尽管如此,我还是用UISea...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Red5直播服务器,属于Java语言的直播服务器
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2配置默认Tomcat设置,开启更多高级功能