当一个对象状态发生改变,所有依赖于他订阅者都会发生改变(收到状态改变的通知)。
2、观察者模式-应用场景?
场景一:关联场景
场景二:事件多级触发
场景三:跨系统消息交互场景
3、观察者模式-角色划分?
四个角色?
角色一:被观察者(目标对象->抽象)
角色二:具体被观察者(目标对象)
角色三:观察者
角色四:具体观察者
代码示例:
抽象被观察者:
#import "Observable.h"
@interface Observable()
@property (nonatomic,strong)NSMutableArray *obsArray;
@end
@implementation Observable
- (instancetype)init
{
self = [superinit];
if (self) {
_obsArray =[[NSMutableArrayalloc]init];
}
return self;
}
//注册观察者
- (void)addObserver:(id<Observer>)o{
[_obsArray addObject:o];
}
//取消观察者
- (void)cancelObserver:(id<Observer>)o{
[_obsArrayremoveObject:o];
}
//取消所有观察者
- (void)cancelAllObservers{
[_obsArrayremoveAllObjects];
}
//获得所有观察者
- (NSInteger)countObservers{
return_obsArray.count;
}
//发送通知
-(void)notifyObservers{
[selfnotifyObservers:nil];
}
-(void)notifyObservers:(NSObject*)msg{
for (id<Observer>oin_obsArray) {
[o update:selfmsg:msg];
}
}
@end
抽象观察者协议:
#import <Foundation/Foundation.h>
@class Observable;
//观察者->抽象
@protocol Observer <NSObject>
-(void)update:(Observable*)o msg:(NSObject*)msg;
@end
具体观察者1:
.h
#import <Foundation/Foundation.h>
#import "Observer.h"
@interface specificObserver1 : NSObject<Observer>
@end
.m
#import "specificObserver1.h"
@implementation specificObserver1
- (void)update:(Observable *)o msg:(NSObject *)msg{
NSLog(@"具体观察者1收到--%@",msg);
}
@end
具体观察者2:.h
#import <Foundation/Foundation.h>
#import "Observer.h"
@interface specificObserver2 : NSObject<Observer>
@end
.m
#import "specificObserver2.h"
@implementation specificObserver2
- (void)update:(Observable *)o msg:(NSObject *)msg{
NSLog(@"具体观察者2收到--%@",msg);
}
@end
测试调用类:
- (void)demo1{//抽象的被观察者测试
Observable *obs = [[Observable alloc]init];
id<Observer>specific1 = [[specificObserver1 alloc]init];
id<Observer>specific2 = [[specificObserver2 alloc]init];
[obs addObserver:specific1];
[obs addObserver:specific2];
[obs notifyObservers:@"测试发送消息"];
}