App架構(gòu)之組件化理解

概述

項(xiàng)目發(fā)展到一定階段使碾,隨著需求的增加以及需求的頻繁變更种远,項(xiàng)目會(huì)越來(lái)越大涩澡,耦合會(huì)越來(lái)越多,開(kāi)發(fā)效率也會(huì)降低坠敷,這個(gè)時(shí)候需要做的就是進(jìn)行模塊拆分妙同,官方的說(shuō)法就是組件化。

App基本框架模型

任意一個(gè)App抽象出來(lái)膝迎,可以得到上圖模型粥帚。這個(gè)模型包括兩大部分:基礎(chǔ)框架和業(yè)務(wù)。下面從模型介紹限次、生命周期茎辐、組件間通信三個(gè)方面來(lái)進(jìn)行闡述。

1. 模型介紹

(1)一個(gè)完整的App由基礎(chǔ)框架(App Framework)和業(yè)務(wù)組件(Business)組成掂恕。

(2)Business指的是具體業(yè)務(wù)線的業(yè)務(wù)拖陆。App Framework是基礎(chǔ)框架,不存在業(yè)務(wù)邏輯懊亡,業(yè)務(wù)線必須基于這個(gè)框架開(kāi)發(fā)依啰,可以理解為所謂的殼工程。這個(gè)App Framework由3部分組成:基礎(chǔ)功能組件店枣、基礎(chǔ)業(yè)務(wù)組件Framework速警√居基礎(chǔ)功能組件指的是網(wǎng)絡(luò)層、數(shù)據(jù)庫(kù)闷旧、日志等基礎(chǔ)服務(wù)长豁;基礎(chǔ)業(yè)務(wù)組件指的是上層業(yè)務(wù)需要用到的比較獨(dú)立的基礎(chǔ)業(yè)務(wù)服務(wù),如登錄組件忙灼、支付組件匠襟、評(píng)論組件等;Framework負(fù)責(zé)基礎(chǔ)功能組件和基礎(chǔ)業(yè)務(wù)組件的調(diào)度和生命周期管理该园,因?yàn)榍懊嬲f(shuō)的組件都是獨(dú)立無(wú)連接的酸舍,因此運(yùn)行不起來(lái),要想形成一個(gè)有機(jī)整體正常運(yùn)行起來(lái)里初,需要依托于Framework啃勉,實(shí)現(xiàn)組件生命周期管理和調(diào)度。

(3)遵循向下依賴關(guān)系双妨。即Business整體依賴于App Framework淮阐。而App Framework中Framework類(lèi)似于一個(gè)調(diào)度器,它是基于基礎(chǔ)功能組件和基礎(chǔ)業(yè)務(wù)組件的刁品∑兀基礎(chǔ)業(yè)務(wù)組件依賴于基礎(chǔ)功能組件。我認(rèn)為這種向下依賴關(guān)系可以顯式依賴哑诊,即可以直接調(diào)用来农。

(4)關(guān)于平級(jí)依賴剔桨。通常情況下App Framework應(yīng)該盡量避免平級(jí)依賴。而對(duì)于上層業(yè)務(wù)組件平級(jí)之間的依賴是很常見(jiàn)的。這涉及到組件間通信郭变,屬于基礎(chǔ)框架中的Framework的職責(zé)医瘫,通常做法是提供一個(gè)Router或者Mediator進(jìn)行中轉(zhuǎn)萨蚕。

2. 生命周期

曾經(jīng)看過(guò)一位前輩的文章担猛,加上自己的一點(diǎn)理解傅联,來(lái)闡述生命周期。

Android中的四大組件Activity仇奶、Service比驻、BroadcastReceiver、ContentProvider狈茉。這些組件可以構(gòu)成一個(gè)完整的Application。四大組件都是有自己的生命周期的蹭秋,以Activity為例感凤,Activity可以認(rèn)為是一個(gè)小型App粒督,提供了onCreate()禽翼、onStart()闰挡、onResume()长酗、onPause()、onStop()夺脾、onDestroy()這些生命周期方法咧叭,包括后來(lái)的Fragment也遵循這一原則提供生命周期方法的回調(diào)菲茬。

我們自己開(kāi)發(fā)過(guò)程中的組件也借鑒同樣的思想婉弹,即每一個(gè)組件必須有自己的生命周期方法,每一個(gè)業(yè)務(wù)組件能夠像一個(gè)App一樣獨(dú)立運(yùn)行起來(lái)氯哮。

3. 組件間通信

Android中組件間通信是通過(guò)Intent實(shí)現(xiàn)蛙粘。

組件間通信包括兩個(gè)場(chǎng)景:(1)打開(kāi)組件的某個(gè)頁(yè)面(2)調(diào)用組件某個(gè)類(lèi)的某個(gè)方法。組件A表示調(diào)用著出牧,組件B表示被調(diào)用者舔痕,下面一一闡述伯复。

(1) 打開(kāi)一個(gè)頁(yè)面

打開(kāi)一個(gè)頁(yè)面啸如,通常指的是組件A要調(diào)起組件B的某個(gè)ActivityFragment,這種情況往往采取的做法是URL Schema方式實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)想暗,格式為schema://host/action?param1=value1&param2=value2说莫。關(guān)于schema映射表維護(hù)以及schema解析和路由都是App Framework中的Framework來(lái)維護(hù)寞焙,需要上面提到的Router或Mediator這么一個(gè)角色捣郊。其中schema映射表可以做成后臺(tái)配置文件形式模她。也可以代碼維護(hù),不過(guò)組件需要預(yù)先注冊(cè)侈净。

以上說(shuō)的對(duì)于傳遞基本參數(shù)是沒(méi)啥問(wèn)題的畜侦。對(duì)于SerializableParcel對(duì)象傳遞也沒(méi)啥問(wèn)題,轉(zhuǎn)成JSON String就可以了澎语。而且通常也不會(huì)出現(xiàn)調(diào)起一個(gè)Activity的時(shí)候擅羞,需要傳遞一個(gè)非序列化對(duì)象减俏,如ImageView過(guò)去的情況,真要處理ImageView的話很多公司直接把圖片處理做成一個(gè)基礎(chǔ)功能組件奏夫,業(yè)務(wù)組件是可以顯式調(diào)用的酗昼。因此大部分公司組件間通信采用的是這種方式麻削。

然而事實(shí)上只考慮這種情況是不全面的碟婆,我們要從更高的層面來(lái)考慮問(wèn)題惕稻。

(2) 調(diào)用某個(gè)類(lèi)的某個(gè)方法

假設(shè)組件A調(diào)用組件B的某個(gè)類(lèi)的某個(gè)方法俺祠。由兩種方案可以達(dá)到目的蜘渣。

第一種蔫缸,在Mediator中定義組件B的interface接口拾碌,組件B依賴Mediator并實(shí)現(xiàn)對(duì)應(yīng)的interface接口方法校翔。然后當(dāng)組件A調(diào)用組件B的某個(gè)方法時(shí)灾前,組件A依賴Mediator去調(diào)用即可。貌似蘑菇街的protocol-class方案就是這么搞的饲嗽。

第二種奈嘿,Mediator中不定義任何組件的interface接口指么,直接通過(guò)反射機(jī)制(OC中的runtime)晚唇,將參數(shù)等穿進(jìn)去盗似,實(shí)現(xiàn)反射調(diào)用赫舒。這樣的話組件B是不需要依賴Mediator的。不過(guò)建議是Mediator對(duì)于不同組件的反射調(diào)用能提供一組映射關(guān)系心赶,而不是寫(xiě)到一起缨叫,這樣會(huì)導(dǎo)致Mediator太大太雜。這個(gè)思路就是casa大神說(shuō)的Category方案荔燎。

上面介紹的反射方式可以傳任何類(lèi)型的參數(shù)耻姥,嗯。

備注:Java中的interface相當(dāng)于OC中的protocol有咨。

(3) 小結(jié)

上面兩條其實(shí)是從兩種情況來(lái)考慮的琐簇,然而既然是架構(gòu),我們還是不希望出現(xiàn)座享,if else這種低級(jí)思考問(wèn)題的方式婉商。最好是能抽象出一個(gè)統(tǒng)一的方案。好征讲,根據(jù)上面我們是能發(fā)現(xiàn)(2)能解決(1)的問(wèn)題据某,而(1)不能解決(2)的問(wèn)題,即(1)是(2)的子集诗箍,因此從技術(shù)咖層面來(lái)講挽唉,最終得出的結(jié)論就是采用反射機(jī)制實(shí)現(xiàn)組件間通信這種方案比使用URL Schema這種方案更全面的埂材。

總結(jié)

1.理清依賴關(guān)系,要有抽象思維
2.才疏學(xué)淺裤唠,有理解不到位的地方航瞭,還請(qǐng)多多指教
3.疑問(wèn):casa大神的去core化以及去model化還是不太能夠理解长窄,需要繼續(xù)學(xué)習(xí)

參考文獻(xiàn)

  1. http://casatwy.com/iOS-Modulization.html
  2. http://blog.cnbang.net/tech/3080/
微信公眾號(hào):學(xué)姐的IT專欄
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末椅贱,一起剝皮案震驚了整個(gè)濱河市山橄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖混移,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡免姿,警方通過(guò)查閱死者的電腦和手機(jī)紊婉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)碌廓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)辽聊,“玉大人贾铝,你說(shuō)我怎么就攤上這事叁巨〗频” “怎么了枫绅?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)曼尊。 經(jīng)常有香客問(wèn)我,道長(zhǎng)脏嚷,這世上最難降的妖魔是什么父叙? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘魄懂。我一直安慰自己敷扫,他們只是感情好葵第,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布绘迁。 她就那樣靜靜地躺著,像睡著了一般卒密。 火紅的嫁衣襯著肌膚如雪缀台。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,146評(píng)論 1 297
  • 那天哮奇,我揣著相機(jī)與錄音膛腐,去河邊找鬼睛约。 笑死,一個(gè)胖子當(dāng)著我的面吹牛哲身,可吹牛的內(nèi)容都是我干的辩涝。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼勘天,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼怔揩!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起误辑,我...
    開(kāi)封第一講書(shū)人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤沧踏,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后巾钉,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體翘狱,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年砰苍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了潦匈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赚导,死狀恐怖茬缩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吼旧,我是刑警寧澤凰锡,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站圈暗,受9級(jí)特大地震影響掂为,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜员串,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一勇哗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧寸齐,春花似錦欲诺、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至毅厚,卻和暖如春迹恐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背卧斟。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工殴边, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人珍语。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓锤岸,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親板乙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子是偷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

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