观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听摸一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够更新自己。
代码:
#import <Foundation/Foundation.h>
@protocol Observer <NSObject>
@optional
- (void)update;
@end
@interface MDbeObserverd : NSObject
- (void)attech:(id<Observer>)obj;
- (void)detech:(id<Observer>)obj;
- (NSArray *)getObserverList;
- (void)notify;
@property (nonatomic, strong)NSMutableArray *list;
@end
@implementation MDbeObserverd
- (NSMutableArray *)list
{
if (!_list) {
_list = [NSMutableArray array];
}
return _list;
}
- (void)attech:(id <Observer> )obj
{
if (!obj) {
return;
}
[self.list addObject:obj];
}
- (void)detech:(id <Observer> )obj
{
if (!obj) {
return;
}
for (id observered in self.list) {
if (observered == obj) {
[self.list removeObject:obj];
}
}
}
- (NSArray *)getObserverList
{
return [NSArray arrayWithArray:self.list];
}
- (void)notify
{
// 状态发生改变时
NSLog(@"门开了");
// 对绑定的观察者对象发送通知。
for (id<Observer> obj in self.list) {
[obj update];
}
}
@end
@interface MDObserver1 : NSObject<Observer>
@end
@implementation MDObserver1
- (void)update
{
NSLog(@"擦,老板回来了,赶紧关了nba的网页");
}
@end
@interface MDObserver2 : NSObject<Observer>
@end
@implementation MDObserver2
- (void)update
{
NSLog(@"擦,老妈回来了,关了电脑,写作业去");
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
MDbeObserverd *beObervered = [[MDbeObserverd alloc]init];
MDObserver1 *obj1 = [MDObserver1 new];
MDObserver2 *obj2 = [MDObserver2 new];
MDObserver2 *obj22 = [MDObserver2 new];
// 若是不绑定就不会发送通知了。
[beObervered attech:obj1];
[beObervered attech:obj2];
[beObervered attech:obj22];
[beObervered detech:obj22];
[beObervered notify];
}
return 0;
}
观察者模式的效果有以下的优点:
第一、观察者模式在被观察者和观察者之间建立一个抽象的耦合。被观察者角色所知道的只是一个具体观察者列表,每一个具体观察者都符合一个抽象观察者的接口。被观察者并不认识任何一个具体观察者,它只知道它们都有一个共同的接口。
由于被观察者和观察者没有紧密地耦合在一起,因此它们可以属于不同的抽象化层次。如果被观察者和观察者都被扔到一起,那么这个对象必然跨越抽象化和具体化层次。
第二、观察者模式支持广播通讯。被观察者会向所有的登记过的观察者发出通知,
观察者模式有下面的缺点:
第一、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
第二、如果在被观察者之间有循环依赖的话,被观察者会触发它们之间进行循环调用,导致系统崩溃。在使用观察者模式是要特别注意这一点。
第三、如果对观察者的通知是通过另外的线程进行异步投递的话,系统必须保证投递是以自恰的方式进行的。
第四、虽然观察者模式可以随时使观察者知道所观察的对象发生了变化,但是观察者模式没有相应的机制使观察者知道所观察的对象是怎么发生变化的。