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,如有不当,欢迎讨论~
作者:FlyElephant
出处:http://www.cnblogs.com/xiaofeixiang
说明:博客经个人辛苦努力所得,如有转载会特别申明,博客不求技惊四座,但求与有缘人分享个人学习知识,生活学习提高之用,博客所有权归本人和博客园所有,如有转载请在显著位置给出博文链接和作者姓名,否则本人将付诸法律。
出处:http://www.cnblogs.com/xiaofeixiang
说明:博客经个人辛苦努力所得,如有转载会特别申明,博客不求技惊四座,但求与有缘人分享个人学习知识,生活学习提高之用,博客所有权归本人和博客园所有,如有转载请在显著位置给出博文链接和作者姓名,否则本人将付诸法律。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述