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

一.基本概念

1)KVC概念

KVC全稱Key-value coding.

一個(gè)非正式的Protocol,提供一種機(jī)制來(lái)間接訪問(wèn)對(duì)象的屬性.

2)KVO概念

KVO全稱Key-Value Observing。

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

基于監(jiān)控鍵值發(fā)生變化,通知觀察者。

KVO 就是基于 KVC 實(shí)現(xiàn)的關(guān)鍵技術(shù)之一。

二.KVC和KVO的作用

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

那么,你覺(jué)度Laughing Sir的作用是什么?

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

2. 直接監(jiān)視信息的變化。

3. 當(dāng)產(chǎn)生了有用的信息后,那馬上通知匯報(bào)。

如果亦天制作的毒品比作信息,普通警察只能通過(guò)get方式屬性,更重要是不知道他什么時(shí)候發(fā)生了變化。臥底Laughing Sir完美扮演的就是KVC和KVO機(jī)制,為什么說(shuō)完美?KVC是可以直接通過(guò)路徑獲取對(duì)應(yīng)的鍵的值,KVO的觀察通知部分就對(duì)應(yīng)Laughing Sir的監(jiān)視和匯報(bào),如果Laughing Sir變節(jié)了或者沒(méi)有意志做下去了,那就只能是KVC能獲取到信息,但不能通知上級(jí)信息的變化,就沒(méi)有了一個(gè)經(jīng)典的臥底角色Laughing了。

三.JAVA中的觀察著模式

Sun公司早早就把觀察者模式視為重要的模式,并在Java中提供方便的接口Observer和類Observable。這個(gè)地方注意一下,Observer是一個(gè)接口,Observable是一個(gè)類。因?yàn)楹苋菀紫热霝橹鳎琗XXable第一反應(yīng)是接口。如果看過(guò)《設(shè)計(jì)模式之禪》這本書的人,自然想起書中舉的例子是李斯監(jiān)視同窗韓非子的一舉一動(dòng)匯報(bào)給秦始皇。并且書中的Observer和Observable自定義定義剛好相反,注意下即可。為什么提Java,繼續(xù)看吧。

四.代碼實(shí)現(xiàn)

1. KVC屬性讀取和修改

1)Sense:

警官:梁笑棠,從今天開(kāi)始?,你的生命屬于社會(huì)的,清楚嗎?

Laughing?Sir:清楚。

警官:出了這個(gè)學(xué)堂,你要叫Laughing?哥,記好了嗎?

Laughing?Sir:Yes?sir。

警官:你妹,大聲點(diǎn)。

Laughing?Sir:_____

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

2)Step:

①通過(guò)路徑方式獲取屬性值

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:

亦天可能進(jìn)行制毒。。。

Laughing?Sir開(kāi)始監(jiān)控亦天

報(bào)告上級(jí)亦天制毒數(shù):___

程序中,Laughing Sir開(kāi)始觀察YiTian這個(gè)實(shí)體類中的narcotics屬性,一旦亦天制作出毒品,就馬上observeValueForKeyPath通知上級(jí),看看如下的具體實(shí)現(xiàn)。

2)Step:

①對(duì)被觀察者添加觀察

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

②實(shí)現(xiàn)觀察結(jié)果處理方法

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

//匯報(bào)上級(jí)

}

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"]其中這個(gè)new是指新賦予narcotics這個(gè)屬性的值,當(dāng)然也有一個(gè)old而不是[change objectForKey:@"narcotics"];narcotics是毒品意思。

3.Java實(shí)現(xiàn)觀察者模式

這里我就直接顯示關(guān)鍵代碼了,不做過(guò)多說(shuō)明,對(duì)比了解和學(xué)習(xí)。

*?亦天實(shí)體類

*?@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實(shí)體類的@override方法

*?Laughing?Sir實(shí)體類

*?@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("監(jiān)視到亦天制毒"+arg+"kg");

}

}

public?void?watchOverYiTian(YITian?yiTian){

yiTian.addObserver(this);

}

}

最后是測(cè)試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臥底開(kāi)始監(jiān)視亦天的一舉一動(dòng)

laughingSir.watchOverYiTian(yiTian);

System.out.println("Laughing?Sir臥底開(kāi)始監(jiān)視亦天的一舉一動(dòng)");

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

//亦天開(kāi)始制毒

yiTian.MakeNarcotics();

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

}

}

五.現(xiàn)狀下觀察者模式的重要性

就猶如Laughing哥這樣的角色,觀察者模式在實(shí)際應(yīng)用中起到重要的作用。無(wú)論你之前發(fā)現(xiàn)了,還是現(xiàn)在察覺(jué)到它的不可忽視。移動(dòng)開(kāi)發(fā)的MVVM開(kāi)發(fā)架構(gòu)思想中的重要解耦頁(yè)面部分,就是觀察者模式實(shí)現(xiàn)數(shù)據(jù)綁定,即時(shí)刷新數(shù)據(jù)。這個(gè)在iOS中KVO和Android使用Java的Observer接口都異曲同工之意,RxJava的響應(yīng)是編程的基本思想也是觀察者模式之藝術(shù)。

現(xiàn)狀下的熱門的移動(dòng)開(kāi)發(fā)的關(guān)鍵字,透漏出觀察者模式顯得越來(lái)越重要。其中就包括面試門檻,曾經(jīng)面試過(guò)Android開(kāi)發(fā)者還是iOS開(kāi)發(fā)者,問(wèn)到觀察者這個(gè)模式可有了解?有回答iOS觀察就是KVO,Java的就是在被觀察對(duì)象添加回調(diào)接口,也有說(shuō)過(guò)《設(shè)計(jì)模式之禪》中的韓非子被李斯監(jiān)視的例子。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 一不小心,小明在《跟著貝爾去冒險(xiǎn)》這個(gè)真人秀節(jié)目中看到了“一日警察,一世警察”的Laughing哥,整個(gè)節(jié)目除了貝...
    minggo閱讀 9,410評(píng)論 23 89
  • 1.KVC 關(guān)于 KVC 和 KVO ,我之前的總結(jié)文章有寫過(guò),但是趨于表面,沒(méi)有探究其內(nèi)部真正的實(shí)現(xiàn)原理和進(jìn)階用...
    Liberalism閱讀 1,112評(píng)論 0 5
  • iOS開(kāi)發(fā)常用設(shè)計(jì)模式? 詳細(xì)blog鏈接 MVC模式 MVVM模式 代理模式 單例模式 工廠模式 裝飾者模式 觀...
    面試題大神閱讀 979評(píng)論 0 4
  • 1.什么是觀察者模式?2.為什么要用觀察者模式?它的優(yōu)缺點(diǎn)是什么?![Uploading 屏幕快照 2016-12...
    羊妞麻麻閱讀 754評(píng)論 0 0
  • 這一年的寒冬時(shí)分,老張的電話響了起來(lái),他接通電話,一聽(tīng)到是兒子的聲音,他便急急忙忙的站了起來(lái),走出屋門來(lái)到院...
    原之燎閱讀 296評(píng)論 0 1