iOS設計模式之觀察者模式
阿新 • • 發佈:2018-12-20
由於最近在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