1. 程式人生 > >iOS設計模式之觀察者模式

iOS設計模式之觀察者模式

由於最近在iOS學習中對觀察者模式有些自己的見解,故發博文進行總結。如有錯誤還請各位指出並海涵。

  1. 在這個設計模式下。有至少兩組物件–觀察者與被觀察者。觀察者負責觀察資料的改變,當被觀察者的資料發生改變的時候,觀察者就會發現相應的改變,並作出相應的響應。這種模式能夠確保介面與資料之間的獨立性,降低其中的耦合度。
  2. 在通知中,接受通知的相當於一個觀察者,傳送通知的相當於一個被觀察者。當接受通知的人接收到傳送通知的人的通知的時候,相當於觀察者發現被觀察者的資料發生了改動。這個時候觀察者開始對被觀察者修改資料的行為作出相應。
  3. 觀察者和被觀察者之間不會主動的進行交流,防止兩者之間緊耦合。需要用一個第三方物件來對其進行管理。因為根據面向物件的思想。每一個類應該只負責他這個類應該實現的功能,而不是雨露均沾。在這裡,NSNotificationCenter 充當通知的管理者,所有的通知的傳送到接收都由他來管理。傳送者只負責通知的打包傳送,接收者只負責通知的接收。
  4. 在通知這個設計模式中,必須保證先有人監聽,後有人傳送。因為傳送只是對有監聽需要的物件進行傳送。不會對沒有監聽需求的物件傳送資訊。

例如:一個傳送與接收的簡單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