本文共 2541 字,大约阅读时间需要 8 分钟。
观察者模式也被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。观察者模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。iOS开发中最明显的观察者模式就是KVO键值对观察,如果对于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,如需转载请自行联系原作者