由于最近在iOS学习中对观察者模式有些自己的见解,故发博文进行总结。如有错误还请各位指出并海涵。
- 在这个设计模式下。有至少两组对象–观察者与被观察者。观察者负责观察数据的改变,当被观察者的数据发生改变的时候,观察者就会发现相应的改变,并作出相应的响应。这种模式能够确保界面与数据之间的独立性,降低其中的耦合度。
- 在通知中,接受通知的相当于一个观察者,发送通知的相当于一个被观察者。当接受通知的人接收到发送通知的人的通知的时候,相当于观察者发现被观察者的数据发生了改动。这个时候观察者开始对被观察者修改数据的行为作出相应。
- 观察者和被观察者之间不会主动的进行交流,防止两者之间紧耦合。需要用一个第三方对象来对其进行管理。因为根据面向对象的思想。每一个类应该只负责他这个类应该实现的功能,而不是雨露均沾。在这里,NSNotificationCenter 充当通知的管理者,所有的通知的发送到接收都由他来管理。发送者只负责通知的打包发送,接收者只负责通知的接收。
- 在通知这个设计模式中,必须保证先有人监听,后有人发送。因为发送只是对有监听需要的对象进行发送。不会对没有监听需求的对象发送信息。
例如:一个发送与接收的简单demo
main.m
#import <Foundation/Foundation.h>
#import "Listener.h"
#import "Sender.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Listener *listener = [[Listener alloc] init];
Sender *sender = [[Sender alloc] init];
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
NSString *notificationName = @"精选";
// 注意:在这里面,先要向 center 注册一个观察者,告诉 center 你对 notification 感兴趣,center 才会对你推送通知,否则不推送。
[center addObserver:listener selector:@selector(message) name:notificationName object:sender];
[center postNotificationName:notificationName object:sender userInfo:@{@"今日大事": @"某人发现一个新星球", @"新闻" : @"皇马欧冠三连冠"}];
}
return 0;
}
发送者类
Sender.h
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface Sender : NSObject
//sender的姓名
@property (nonatomic, copy) NSString *name;
@end
NS_ASSUME_NONNULL_END
sender.m
#import "Sender.h"
@implementation Sender
@end
接收者类
Listener.h
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface Listener : NSObject
// Listener的姓名
@property (nonatomic, copy) NSString *name;
- (void)message;
@end
NS_ASSUME_NONNULL_END
Listener.m
#import "Listener.h"
@implementation Listener
- (void)message {
NSLog(@"发送者发信息了");
}
// 注意:Listener 的 dealloc 方法不要忘了重写,因为当他不当监听者的时候,再调用这个对象方法的时候,会出现僵尸对象。addObserver方法一个包含了一个已删除的对象。
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
@end
实现结果
2018-11-10 19:16:54.715895+0800 观察者模式[2476:233294] 发送者发信息了
Program ended with exit code: 0