觀察者設計模式

寫在前面

設計模式是一套被反覆使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是爲了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。當然設計模式和語言沒有關係,它是一種編程思想。本篇將介紹觀察者計模式(又稱發佈-訂閱模式)的實現,以OC語言爲例

詳細內容

  • 對觀察者模式的理解
    上面已經提到觀察者模式又叫發佈-訂閱模式,就像雜誌的訂閱一樣,當你訂閱一本雜誌時,雜誌社 會記錄你–訂閱者的信息,當有新的被雜誌更新時,你就會收到訂閱的雜誌。這就是觀察者模式的工作原理。
  • 和代理模式的區別
    對於單一代理(就是代理類只有一個指向實體類對象的指針)來說,它反映了對象之間一對一的關聯關係,和觀察者有很大不同;觀察者模式允許主題對象有多個觀察者,這就反映出對象之間一對多的關係。
  • UML類圖
    這裏寫圖片描述
  • 具體實現步驟
    這裏按照上圖的步驟大體實現一下:
    • 項目結構
      這裏寫圖片描述
      紅色部分:抽象通知者和抽象觀察者
      藍色部分:抽象觀察者類和具體觀察者類
      抽象的一方都是協議,具體的一方遵守了對應的協議。
    • 主要代碼分析
      • 抽象通知者(協議)
         
        // 抽象通知者,主要定義了,通知者的具體行爲,包含了添加、移除通知者和發送通知 (尖括號用了中括號代替)
        @protocol GYAbstractSubjectProtocol [NSObject]
        -(void)attach:(id[GYAbstractObserverProtocol]) observer;
        -(void)detach:(id[GYAbstractObserverProtocol]) observer;
        -(void)notify;
      • 具體通知者(類)
         
        /* 存放觀察者對象的數組/
        @property (nonatomic, strong) NSMutableArray *observers;
        // 協議中的方法實現
        -(void)attach:(id) observer
        {
        [self.observers addObject:observer];
        }
        -(void)detach:(id) observer
        {
        [self.observers removeObject:observer];
        }
        -(void)notify
        {
        // 遍歷觀察者數組,通知每一個觀察者
        [self.observers enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        if ([obj respondsToSelector:@selector(update:)])
        {
        [obj update:@{@"OK":@"成功了!"}];
        }
        }];
        }
      • 抽象觀察者(協議)
         
        // 抽象觀察者
        @protocol GYAbstractObserverProtocol
        -(void)update:(NSDictionary *)dict;
        @end
      • 具體觀察者(類)
         
        -(void)update:(NSDictionary *)dict
        {
        NSLog(@"%s -- %@", func, dict);
        }
    • 全部的代碼

總結

這裏主要簡單介紹了觀察者設計模式的實現,通過觀察者模式,可以降低對象之間的耦合度。希望對大家有所幫助。

若大家發現錯誤,歡迎指正。共同交流,共同進步!謝謝閱讀!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章