談KVC/KVO(重點觀察者模式)

一.基本概念

1)KVC概念

KVC全稱Key-value coding.

一個非正式的Protocol,提供一種機制來間接訪問對象的屬性.

2)KVO概念

KVO全稱Key-Value Observing。

典型的觀察者模式承載者。

基于監控鍵值發生變化,通知觀察者。

KVO 就是基于 KVC 實現的關鍵技術之一。

二.KVC和KVO的作用

Laughing哥上場了,先看看怎么做臥底,首先,Laughing哥先得符合古惑仔行為準則混入黑幫;接著,除了放高利貸和Disco業務外最重的是擠兌從臺灣出獄的世孝,選擇站在亦天內心的一邊得到足夠多的信任;最后,憑借“一日警察,一世警察”赤誠初心,秉公執法端掉亦天和制毒窩點。

那么,你覺度Laughing Sir的作用是什么?

1. 接近需要得到信息隱秘或不隱秘的使用場所。

2. 直接監視信息的變化。

3. 當產生了有用的信息后,那馬上通知匯報。

如果亦天制作的毒品比作信息,普通警察只能通過get方式屬性,更重要是不知道他什么時候發生了變化。臥底Laughing Sir完美扮演的就是KVC和KVO機制,為什么說完美?KVC是可以直接通過路徑獲取對應的鍵的值,KVO的觀察通知部分就對應Laughing Sir的監視和匯報,如果Laughing Sir變節了或者沒有意志做下去了,那就只能是KVC能獲取到信息,但不能通知上級信息的變化,就沒有了一個經典的臥底角色Laughing了。

三.JAVA中的觀察著模式

Sun公司早早就把觀察者模式視為重要的模式,并在Java中提供方便的接口Observer和類Observable。這個地方注意一下,Observer是一個接口,Observable是一個類。因為很容易先入為主,XXXable第一反應是接口。如果看過《設計模式之禪》這本書的人,自然想起書中舉的例子是李斯監視同窗韓非子的一舉一動匯報給秦始皇。并且書中的Observer和Observable自定義定義剛好相反,注意下即可。為什么提Java,繼續看吧。

四.代碼實現

1. KVC屬性讀取和修改

1)Sense:

警官:梁笑棠,從今天開始?,你的生命屬于社會的,清楚嗎?

Laughing?Sir:清楚。

警官:出了這個學堂,你要叫Laughing?哥,記好了嗎?

Laughing?Sir:Yes?sir。

警官:你妹,大聲點。

Laughing?Sir:_____

程序中,Laughing Sir被派于臥底工作前,需要把Laughing Sir的名字屬性值更換成Laughing哥.我們就從這個地方開始練練手預熱做臥底的體驗吧。

2)Step:

①通過路徑方式獲取屬性值

NSString?*preName?=?[laughingSir?valueForKey:@"name"];

②修改屬性值

[laughingSir?setValue:@"laughing?哥"forKey:@"name"];

3)Show Code:

NSString*?exchangeName(LaughingSir?*laughingSir){

NSString?*preName?=?[laughingSir?valueForKey:@"name"];

NSLog(@"laughing的舊名字:%@",preName);

[laughingSir?setValue:@"laughing?哥"forKey:@"name"];

NSString?*newName?=?[laughingSir?valueForKey:@"name"];

NSLog(@"laughing的新名字:%@",newName);

return newName;

}

2.KVO觀察者模式演繹

1)Sense:

亦天可能進行制毒。。。

Laughing?Sir開始監控亦天

報告上級亦天制毒數:___

程序中,Laughing Sir開始觀察YiTian這個實體類中的narcotics屬性,一旦亦天制作出毒品,就馬上observeValueForKeyPath通知上級,看看如下的具體實現。

2)Step:

①對被觀察者添加觀察

[self.yiTian?addObserver:self?forKeyPath:@"narcotics"options:NSKeyValueObservingOptionNew?|NSKeyValueObservingOptionOld?context:nil];

②實現觀察結果處理方法

-(void)observeValueForKeyPath:(NSString?*)keyPath?ofObject:(id)object?change:(NSDictionary?*)change?context:(void?*)context{

//匯報上級

}

3)Show Code:

-(void)observeValueForKeyPath:(NSString?*)keyPath?ofObject:(id)object?change:(NSDictionary?*)change?context:(void?*)context{

if([keyPath?isEqualToString:@"narcotics"]){

NSNumber?*narcoticsN?=?[change?objectForKey:@"new"];//修改之后的最新值

NSInteger?narcotics?=?[narcoticsN?integerValue];

if(narcotics>0)?{

if(self.delegate!=nil&&[self.delegate?respondsToSelector:@selector(reportYitian:)])?{

[self.delegate?reportYitian:narcotics];

}

}

}

}

注意:留意下[change objectForKey:@"new"]其中這個new是指新賦予narcotics這個屬性的值,當然也有一個old而不是[change objectForKey:@"narcotics"];narcotics是毒品意思。

3.Java實現觀察者模式

這里我就直接顯示關鍵代碼了,不做過多說明,對比了解和學習。

*?亦天實體類

*?@author?minggo

*?@time?2016年4月1日?上午10:24:15

*/

public?class?YITian?extends?Observable?{

private?Observer?observer;

private?int?narcotics;

@Override

public?synchronized?void?addObserver(Observer?o)?{

super.addObserver(o);

this.observer?=?o;

}

public?void?MakeNarcotics(){

for(int?i?=?0;?i?<3;?i++)?{

narcotics++;

if(observer!=null)?{

observer.update(this,?narcotics);

}

}

}

}

留意Laughing Sir實體類的@override方法

*?Laughing?Sir實體類

*?@author?minggo

*?@time?2016年4月1日?上午9:58:36

*/

public?class?LaughingSir?implements?Observer{

@Override

public?void?update(Observable?o,?Object?arg)?{

if(oinstanceofYITian)?{

System.out.println("監視到亦天制毒"+arg+"kg");

}

}

public?void?watchOverYiTian(YITian?yiTian){

yiTian.addObserver(this);

}

}

最后是測試main方法


*?觀察者模式

*?@author?minggo

*?@time?2016年4月1日?上午10:36:37

*/

public?class?TestOberving?{

public?static?void?main(String[]?args)?{

YITian?yiTian?=newYITian();

LaughingSir?laughingSir?=newLaughingSir();

//Laughing?Sir臥底開始監視亦天的一舉一動

laughingSir.watchOverYiTian(yiTian);

System.out.println("Laughing?Sir臥底開始監視亦天的一舉一動");

System.out.println("-----------亦天開始制作毒品--------");

//亦天開始制毒

yiTian.MakeNarcotics();

System.out.println("-----------亦天結束制作毒品--------");

}

}

五.現狀下觀察者模式的重要性

就猶如Laughing哥這樣的角色,觀察者模式在實際應用中起到重要的作用。無論你之前發現了,還是現在察覺到它的不可忽視。移動開發的MVVM開發架構思想中的重要解耦頁面部分,就是觀察者模式實現數據綁定,即時刷新數據。這個在iOS中KVO和Android使用Java的Observer接口都異曲同工之意,RxJava的響應是編程的基本思想也是觀察者模式之藝術。

現狀下的熱門的移動開發的關鍵字,透漏出觀察者模式顯得越來越重要。其中就包括面試門檻,曾經面試過Android開發者還是iOS開發者,問到觀察者這個模式可有了解?有回答iOS觀察就是KVO,Java的就是在被觀察對象添加回調接口,也有說過《設計模式之禪》中的韓非子被李斯監視的例子。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,837評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,196評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,688評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,654評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,456評論 6 406
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,955評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,044評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,195評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,725評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,608評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,802評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,318評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,048評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,422評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,673評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,424評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,762評論 2 372

推薦閱讀更多精彩內容

  • 一不小心,小明在《跟著貝爾去冒險》這個真人秀節目中看到了“一日警察,一世警察”的Laughing哥,整個節目除了貝...
    minggo閱讀 9,378評論 23 89
  • 1.KVC 關于 KVC 和 KVO ,我之前的總結文章有寫過,但是趨于表面,沒有探究其內部真正的實現原理和進階用...
    Liberalism閱讀 1,102評論 0 5
  • iOS開發常用設計模式? 詳細blog鏈接 MVC模式 MVVM模式 代理模式 單例模式 工廠模式 裝飾者模式 觀...
    面試題大神閱讀 975評論 0 4
  • 1.什么是觀察者模式?2.為什么要用觀察者模式?它的優缺點是什么?![Uploading 屏幕快照 2016-12...
    羊妞麻麻閱讀 741評論 0 0
  • 這一年的寒冬時分,老張的電話響了起來,他接通電話,一聽到是兒子的聲音,他便急急忙忙的站了起來,走出屋門來到院...
    原之燎閱讀 288評論 0 1