1. 程式人生 > >設計模式:物件去耦(中介者,觀察者)

設計模式:物件去耦(中介者,觀察者)

為了嚴格遵循MVC,MVVM等架構模式,經常需要物件去耦。

10、中介者模式:用一個物件來封裝一系列物件的互動方式。中介者使各物件不需要顯示地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的互動。


11、觀察者模式(釋出-訂閱模式):定義物件間的一種一對多的依賴關係,當一個物件的狀態發生改變時,所有依賴於它的物件都得到通知並被自動更新。
(1)通知:  
當然最後如果我們需要對監聽進行銷燬
- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}



(2)KVO:
KVO是Cocoa提供的一種稱為鍵值觀察的機制,物件可以通過它得到其他物件特定屬性的變更通知。而這個機制是基於NSKeyValueObserving非正式些,Cocoa通過這個協議為所有遵循協議的物件提供了一種自動化的屬性監聽的功能。


通知和KVO區別:


雖然通知和KVO都可以對觀察者進行實現,但是他們之間還是略有不同的,由上面的例子我們可以看出通知是由一箇中心物件為所有觀察者提供變更通知,主要是廣義上關注程式事件,而KVO則是被觀察的物件直接想觀察者傳送通知,主要是綁定於特定物件屬性的值。

首先我們有Hero這個模型
@property (nonatomic,copy) NSString * name;
@property (nonatomic,copy) NSString * title;
@property (nonatomic,assign) NSUInteger age;
在控制其中我們將其初始化並賦值
    self.hero = [[Hero alloc] init];
    self.hero.name = @"趙雲";
    self.hero.title = @"將軍";
    self.hero.age = 87;
現在我們的這個物件基本有值了,那麼我們將這個物件的name監聽下他的改變
[self.hero addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
觸發通知並將值改變
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    self.hero.name = @"張飛";
}
在制定的回撥函式中,處理收到的更改通知
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
    if([keyPath isEqualToString:@"name"])
    {
        NSLog(@"賦值後--%@",self.hero.name);
        NSLog(@"新的值--%@",change[@"new"]);
        NSLog(@"以前的值--%@",change[@"old"]);


    }
}



最後登出觀察者
- (void)dealloc{
    [self.hero removeObserver:self forKeyPath:@"name"];
}

相關推薦

設計模式物件中介觀察

為了嚴格遵循MVC,MVVM等架構模式,經常需要物件去耦。 10、中介者模式:用一個物件來封裝一系列物件的互動方式。中介者使各物件不需要顯示地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的

設計模式對象生成單例、工廠、抽象工廠

添加 對象實例 log return ray 靜態 學習 線程 tco 對象的創建有時會成為面向對象設計的一個薄弱環節。我們可以使用多種面向對象設計方案來增加對象的創建的靈活性。 單例模式:生成一個且只生成一個對象實例的特殊類 工廠方法模式:構建創建者類的繼承層級

《javascript設計模式》讀書筆記二封裝和隱藏信息

mil del ims 是你 信息 私有屬性 bsp delet urn 1.為什麽要封裝和信息隱藏 做過編程的朋友們知道“耦合”這個詞。事實上封裝的效果就是為了解耦,讓類和類之間沒有太多的聯系,防止某一天改動某一類的時候,產生“多米骨諾牌效應”。 我們能夠把信息隱

單例設計模式的幾種寫法java版本、超詳細

簡介 單例模式是一種常用的軟體設計模式,其定義是單例物件的類只能允許一個例項存在。這篇部落格很精彩哦,請一定要耐心看完哦 在Java設計模式中,單例模式相對來說算是比較簡單的一種構建模式。適用的場景在於:對於定義的一個類,在整個應用程式執行期間只有唯一的一個例項物件。如Android中常見的

演算法設計例題最大團回溯、分枝限界

Description 給定無向圖G=(V,E)。如果UV,且對任意u, v ∈ U 有 (u,v) ∈ E,則稱U是G的完全子圖。G的完全子圖U是G的團,當且僅當U不包含在G的更大的完全子圖中。G的最大團是指G中所含頂點數最多的團。 Input

Java設計模式之從[星際爭霸的兵種升級]分析觀察(Observer)模式

  觀察者模式定義物件的一種一對多的依賴關係,當一個物件的狀態發生改變時,所有依賴於它的物件都會得到通知並被自動更新。   一個簡單的例子是,在星際爭霸的蟲族中有一個初級單位叫做跳狗(Zergling),玩家可以在研究中心為它升級“腎上腺素”,升級之後,跳狗的攻擊速度會翻倍

洛谷3794簽到題IV套路題常識題

題面 題意:給出一個序列,問有多少個區間滿足(該區間的gcd)xor(區間或)=k。 n,k≤5e5。 像我這種沒有常識,資料結構想不出就想分治+資料結構的蒟蒻自然是想不出的。 顯然,當右端點r確定了後,不同區間或與gcd都只有logN種,且相同的一段的

最簡單的視音訊播放示例6OpenGL播放YUV420P通過Texture使用Shader

=====================================================最簡單的視音訊播放示例系列文章列表:=====================================================本文記錄OpenGL播放視訊

設計模式深入淺出物件——中介

物件去耦 我們的程式中,一般不會只有一個類,而通常是有多個類互相合作。 既然提到互相合作,那麼類物件間的耦合性是不可避免的。但是我們需要控制耦合的程度,將類的實現及關係控制在可以靈活改變的程度。 當我們發現我們的程式碼,牽一髮而動全身的時候,有兩個可能:

設計模式中介模式設計模式中的解神器!!附上demo

偶然間看到了一個之前完全沒有關注過的設計模式——中介者模式,在看過該設計模式的應用場景後,便有了相見恨晚的感覺啊!!! 這麼屌的設計模式應該應用很廣泛呀!!可怎麼之前都沒怎麼聽過?難道是我之前以為『中介者模式』==『代理模式』嗎????不過話說回來,只看名字的

設計模式觀察模式有利於代碼解

attribute 處理 script refresh 含義 復制 重新 ecif nec 什麽是ApplicationContext? 它是Spring的核心,Context我們通常解釋為上下文環境,但是理解成容器會更好些。 ApplicationContext則是應用的

JavaScript設計模式一、面向對象編程第二節

得到 調用 帶來 方式 get 特權 style 方法封裝 面向對象 一、封裝 面向對象編程思想其中的一個特點就是封裝,通俗的講法就是把需要的功能方向在一個對象裏。遺憾的是,對於JS這種解釋性的弱類型語言沒有經典強類型語言中那樣通過class等關鍵字實現類的封裝方法,j

JavaScript設計模式一、面向對象編程第三節

設置 style 擁有 ray 進行 如果 eat gree 而在 一、繼承 js並沒有繼承這一個現有的機制,所以我們所說的繼承是通過JS本身的機制去實現的。 1、類式繼承 1 // 類式繼承 2 3 // 父類 4 function SuperClas

C#設計模式原型模式Prototype Pattern

設計 公司 ext spa type img 存在 變化 new 一,原型模式:通過將一個原型對象傳給那個要發動創建的對象,這個要發動創建的對象通過請求原型對象拷貝它們自己來實施創建。 using System; using System.Collections.Gene

C#設計模式外觀模式Facade Pattern

避免 linq 訪問 客戶端 這一 存在 www 針對 public 一,什麽是外觀模式? 外觀模式:為子系統中的一組接口提供一個一致的界面,定義一個高層接口,這個接口使得這一子系統更加容易使用。 二,我們看看代碼的實現 using System; using Syste

設計模式裝飾器Decorator模式

讓我 分享圖片 底部 .com 一件事 輸出 PE 新的 int 設計模式:裝飾器(Decorator)模式 一、前言 裝飾器模式也是一種非常重要的模式,在Java以及程序設計中占據著重要的地位。比如Java的數據流處理,我們可能看到數據流經過不同的類的包裝和包裹,最

設計模式訪問者Visitor模式

tlist 情況下 面向 font ati pap 書籍 技術 原理 設計模式:訪問者(Visitor)模式 一、前言 什麽叫做訪問,如果大家學過數據結構,對於這點就很清晰了,遍歷就是訪問的一般形式,單獨讀取一個元素進行相應的處理也叫作訪問,讀取到想要查看的內容+對其

設計模式外觀Facade模式

text 一起 其它 QQ 如何 互調 IT 抽象 整合 設計模式:外觀(Facade)模式 一、前言 外觀模式是一種非常簡單的模式,簡單到我們經常都會使用,比如對於類A和B,如果兩者需要交互,經過一定的處理過程才能實現某一個具體的功能,那麽我們可以將這個處理的過程定義

設計模式觀察Observer模式

image 強制轉換 trace vat PE sta obs observer -a 設計模式:觀察者(Observer)模式 一、前言 觀察者模式其實最好的名稱應該是“發布訂閱”模式,和我們現在大數據之中的發布訂閱方式比較類似,但是也有區別的地方,在上一個設計模式,

設計模式享元FlyWeight模式

例子 清理 什麽 public == lean http 變量 -- 設計模式:享元(FlyWeight)模式 一、前言 享元(FlyWeight)模式顧名思義,既是輕量級的,原因就是享元,共享元素,這裏的元素指的是對象。如何共享對象,那就是在檢測對象產生的時候,如