iOS之代理模式的理解

標簽:ios? 代理? 模式? 協(xié)議? delegate??


閱讀前的知識儲備請確保在閱讀本文時洛口,曾經(jīng)不止一次親自動手敲過有關代理模式的代碼。如果沒有,請在積累一定的經(jīng)驗后閱讀冀墨,相信會更有收獲。也希望大神不吝指教涛贯。

什么時候要用協(xié)議和代理诽嘉?下面舉一個例子,談談個人對代理弟翘、協(xié)議的理解虫腋,希望能夠起到拋磚引玉的效果。假設現(xiàn)在有這么一個任務需求:頁面A需要跳轉到頁面B(有可能會傳入一些參數(shù))衅胀,頁面B填寫或者處理一些信息在跳轉回頁面A的同時還需要把數(shù)據(jù)返回A岔乔。不要為了用代理模式而用代理模式代理模式只是一種設計模式,它的價值在于通過一個統(tǒng)一的模式滚躯,解決一個原本并不方便雏门、甚至是幾乎不可能解決的問題嘿歌。也就是說當原來的、簡單的編程方式無法處理一個問題的時候茁影,才會想到運用一些設計模式(比如本文所談的代理模式)宙帝。舉個例子,如果說頁面A跳轉到頁面B需要傳遞參數(shù)募闲。顯然代理模式是可以用來傳參的步脓。但是這時候有沒有必要使用代理模式呢?我的回答是——“Never”浩螺。由于是從頁面A跳轉到頁面B靴患,那么代碼應該如下所示://AViewController.m@property (strong, nonatomic) BViewController *BVC;— (void)buttonDidClicked:(id)sender{? ? self.BVC = [[BViewController alloc]init];? ? [self.navigationController pushViewController:self.BVC animated:YES];}顯然B的viewController是作為A的viewController的一個屬性的。既然A有一個指向B的指針要出,那么直接通過指針去操作B即可鸳君。可以對B的屬性賦值患蹂,可以調用B的方法等等或颊。那么什么時候需要用到代理模式呢?我的回答是:“頁面B向頁面A傳值的時候”传于。答案也非常顯然囱挑,在頁面B中,我們甚至都不知道有頁面A的存在沼溜,向頁面A傳值就更是無從談起了平挑。那么此時一個可行的方案是,在頁面B中定義一個協(xié)議盛末,聲明一個代理對象弹惦。在頁面A中,將自己設置為頁面B的代理并且完成代理方法悄但。由此棠隐,不難得出一個結論:當一個對象無法直接獲取到另一個對象的指針,又希望對那個變量進行一些操作時檐嚣,可以使用代理模式助泽。代理模式到底做了什么?我眼中的代理模式只有兩個關注點:協(xié)議和代理者協(xié)議定義了一組方法嚎京,由某一個類負責實現(xiàn)嗡贺。 代理者作為某個類的一個屬性,通常是另一個類的實例對象鞍帝,可以負責完成原來這個類不方便或者無法完成的任務诫睬。首先談一談代理者,在腦中重新回想一下代理模式的實現(xiàn)過程帕涌。在頁面B中定義一個代理對象的時候摄凡,好像和定義一個普通的property非常類似(除了 weak和id《delegate》>)续徽。這也正是我對代理的概括:代理本來就是一個屬性而已,并沒有非常神秘亲澡。當然钦扭,代理者并不只是一個類普通的屬性,否則我只需要重寫一下B的初始化方法即可達到同樣的效果:self.BVC = [[BViewController alloc]initWithDelegate:self];然后在BViewController.m中定義一個AViewController *AVC并在初始化方法中賦值即可床绪。 注意到代理者在定義的時候客情,格式往往是這樣的:id<somedelegate>delegate;

所以我對代理的優(yōu)勢的理解是:

代理的核心優(yōu)勢在于解耦

與直接聲明一個屬于某個固定的類的代理者相比,聲明為id的代理者具備兩個明星的優(yōu)勢癞己。

允許多個不同的類成為本類的代理膀斋。試想一下在本文例子中,如果頁面B可以跳轉回N個頁面末秃,如果還是通過聲明一個普通對象的方式概页,那怎么辦籽御?

允許代理者的類還不固定练慕。試想一下,UITableView也有delegate技掏,它根本不知道那個類會成為它的代理者铃将。

再看一看協(xié)議。協(xié)議更加簡單了哑梳。協(xié)議只是定義了一組方法劲阎。在代理模式中,完全可以不用在頁面B中定義一個協(xié)議鸠真,然后A再去遵循這個協(xié)議悯仙。直接調用A的方法即可。

個人認為協(xié)議的優(yōu)點在于以下幾點:

可以利用Xcode的檢查機制吠卷。對于定義為@required的方法锡垄,如果實現(xiàn)了協(xié)議而沒有實現(xiàn)這個方法,編譯器將會有警告祭隔。這樣可以防止因為疏忽货岭,忘記實現(xiàn)某個代碼的情況,而由于OC的運行時特性疾渴,這樣的錯誤往往在運行階段才會導致程序崩潰千贯。

有利于代碼的封裝。如果一個類搞坝,實現(xiàn)了某個協(xié)議搔谴,那么這個協(xié)議中的方法不必在.h中被聲明,就可以被定義協(xié)議的類調用桩撮。這樣可以減少一個類暴露給外部的方法敦第。

有利于程序的結構化與層次化慌核。一個協(xié)議往往是解決問題的某個方法,對于一個其他的不過卻類似的問題申尼,我們只用再次實現(xiàn)協(xié)議即可垮卓,避免了自己再次構思一組方法。協(xié)議的繼承機制使得這一有點更加強大师幕。

說了怎么多粟按,總結起來只有一句:代理模式并不神秘,只是一個經(jīng)過了優(yōu)化的小技巧(讓某個類持有另一個類的指針)霹粥。代理和協(xié)議也只是讓程序耦合度更低灭将,結構感更強而已。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末后控,一起剝皮案震驚了整個濱河市庙曙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌浩淘,老刑警劉巖捌朴,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異张抄,居然都是意外死亡砂蔽,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門署惯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來左驾,“玉大人,你說我怎么就攤上這事极谊」钣遥” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵轻猖,是天一觀的道長帆吻。 經(jīng)常有香客問我,道長蜕依,這世上最難降的妖魔是什么桅锄? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮样眠,結果婚禮上友瘤,老公的妹妹穿的比我還像新娘。我一直安慰自己檐束,他們只是感情好辫秧,可當我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著被丧,像睡著了一般盟戏。 火紅的嫁衣襯著肌膚如雪绪妹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天柿究,我揣著相機與錄音邮旷,去河邊找鬼。 笑死蝇摸,一個胖子當著我的面吹牛婶肩,可吹牛的內容都是我干的。 我是一名探鬼主播貌夕,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼律歼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了啡专?” 一聲冷哼從身側響起险毁,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎们童,沒想到半個月后畔况,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡病附,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年问窃,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片完沪。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖嵌戈,靈堂內的尸體忽然破棺而出覆积,到底是詐尸還是另有隱情,我是刑警寧澤熟呛,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布宽档,位于F島的核電站,受9級特大地震影響庵朝,放射性物質發(fā)生泄漏吗冤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一九府、第九天 我趴在偏房一處隱蔽的房頂上張望椎瘟。 院中可真熱鬧,春花似錦侄旬、人聲如沸肺蔚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宣羊。三九已至璧诵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間仇冯,已是汗流浹背之宿。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留苛坚,地道東北人澈缺。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像炕婶,于是被迫代替她去往敵國和親姐赡。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內容

  • 設計模式在各個領域都得到廣泛應用柠掂,是在特定場景下對特定問題的解決方案项滑,這些解決方案都是經(jīng)過反復的論證測試而總結出來...
    8e750c8f0fae閱讀 645評論 0 0
  • 一、定義: 代理模式是一種傳遞消息的模式涯贞,整個模式包括:協(xié)議枪狂、委托、代理三個模塊宋渔。 協(xié)議:定義的規(guī)則州疾,規(guī)則...
    inyourface閱讀 1,555評論 0 0
  • 1.情景理解代理模式: 之前老王借給李賴皮2000塊錢,可是一直沒有拿回這個錢皇拣,老王想通過法律途徑把這筆錢要回來严蓖,...
    Dust52100閱讀 409評論 0 0
  • 1.代理模式的主旨 要想實現(xiàn)代理模式,就要有三個組成部分氧急,一個是協(xié)議颗胡,一個是代理者,一個是委托者吩坝。 我們需要定義一...
    8fe8946fa366閱讀 524評論 0 0
  • 該文章屬于劉小壯原創(chuàng)毒姨,轉載請注明:劉小壯[http://www.reibang.com/u/2de707c93d...
    劉小壯閱讀 26,236評論 72 172