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,如有不当,欢迎讨论~