观察者模式也被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。观察者模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。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,如需转载请自行联系原作者