iOS 設(shè)計(jì)模式-外觀模式

1.外觀模式簡(jiǎn)介

外觀模式(Facade)在開發(fā)過程中的運(yùn)用頻率非常高,尤其是在現(xiàn)階段各種第三方SDK充斥在我們的周邊奏寨,而這些SDK很大概率會(huì)使用外觀模式榛搔。通過一個(gè)外觀類使得整個(gè)系統(tǒng)的接口只有一個(gè)統(tǒng)一的高層接口抖部,這樣能夠降低用戶的使用成本疲眷,也對(duì)用戶屏蔽了很多實(shí)現(xiàn)細(xì)節(jié)。當(dāng)然您朽,在我們的開發(fā)過程中狂丝,外觀模式也是我們封裝API的常用手段换淆,例如網(wǎng)絡(luò)模塊、ImageLoader模塊等几颜。

2.外觀模式定義

外觀模式又叫門面模式倍试。外觀模式為子系統(tǒng)中一組不同的接口提供統(tǒng)一的接口。外觀模式定義了上層接口蛋哭,通過降低復(fù)雜度和隱藏子系統(tǒng)間的通信及依存關(guān)系县习,讓子系統(tǒng)更易于使用。

3.外觀模式的使用場(chǎng)景

3.1 ?為一個(gè)復(fù)雜子系統(tǒng)提供一個(gè)簡(jiǎn)單接口谆趾。子系統(tǒng)往往因?yàn)椴粩嘌莼兊迷絹碓綇?fù)雜躁愿,甚至可能被替換。大多數(shù)模式使用時(shí)都會(huì)產(chǎn)生更多沪蓬、更小的類彤钟,在這使子系統(tǒng)更具可重用性的同時(shí)也更容易對(duì)子系統(tǒng)進(jìn)行定制、修改跷叉,這種易變性使得隱藏子系統(tǒng)的具體實(shí)現(xiàn)變得尤為重要逸雹。Facade可以提供一個(gè)簡(jiǎn)單統(tǒng)一的接口,對(duì)外隱藏子系統(tǒng)的具體實(shí)現(xiàn)云挟、隔離變化梆砸。

3.2 當(dāng)你需要構(gòu)建一個(gè)層次結(jié)構(gòu)的子系統(tǒng)時(shí),使用Facade模式定義了子系統(tǒng)中每層的入口點(diǎn)园欣。如果子系統(tǒng)之間是相互依賴的帖世,你可以讓它們僅通過Facade接口進(jìn)行通信,從而簡(jiǎn)化了它們之間的依賴關(guān)系沸枯。

4.外觀模式的UML 圖

網(wǎng)絡(luò)圖片

5.角色劃分

外觀角色(Facade):是模式的核心狮暑,他被客戶client角色調(diào)用,知道各個(gè)子系統(tǒng)的功能辉饱。同時(shí)根據(jù)客戶角色已有的需求預(yù)訂了幾種功能組合

子系統(tǒng)角色(Subsystem classes):實(shí)現(xiàn)子系統(tǒng)的功能,并處理由Facade對(duì)象指派的任務(wù)拣展。對(duì)子系統(tǒng)而言彭沼,facade和client角色是未知的,沒有Facade的任何相關(guān)信息备埃;即沒有指向Facade的實(shí)例姓惑。

6.Demo 實(shí)踐

? 業(yè)務(wù)場(chǎng)景如下:

? ? ? ? ? 有一位乘客需要乘坐出租車,出租車司機(jī)為駕駛出租車的一組復(fù)雜接口提供了一個(gè)簡(jiǎn)化了的接口按脚。如圖:

參考書中的圖

?通過此圖可以看出整個(gè)出租車服務(wù)作為一個(gè)封閉系統(tǒng)于毙,包括一名出租車司機(jī)(外觀角色)、一輛車(子系統(tǒng)角色)辅搬、一個(gè)計(jì)價(jià)器(子系統(tǒng)角色)唯沮。同系統(tǒng)交互的唯一途徑是通過CabDriver中定義的接口driveToLocation:x脖旱。一旦乘客(客戶client角色)向出租車司機(jī)發(fā)出driveToLocation:x消息。CabDriver就會(huì)收到消息介蛉。司機(jī)需要操作兩個(gè)子系統(tǒng)---Taximeter(計(jì)價(jià)器)和Car萌庆。CabDriver先啟動(dòng)(start)Taximeter,讓他開始計(jì)價(jià),然后司機(jī)對(duì)汽車會(huì)松剎車(releaseBrakes)币旧、換擋(changeGears)践险、踩油門(pressAccelerator),把車開走。直到到達(dá)了地點(diǎn)x,CabDriver會(huì)松油門(releaseAccelerator)吹菱、踩剎車(pressBrakes)巍虫、停止(stop)Taximeter,結(jié)束行程鳍刷。

? ? ? 一切都發(fā)生于發(fā)給CabDriver的一個(gè)簡(jiǎn)單的driveToLocation:x命令之中占遥。無論兩個(gè)子系統(tǒng)有多么復(fù)雜,它們隱藏于乘客的實(shí)現(xiàn)之外倾剿。因?yàn)镃abDriver是在為出租車子系統(tǒng)中的其他復(fù)雜接口提供了一個(gè)簡(jiǎn)化的接口筷频。CabDriver像“外觀”一樣,處于乘客與出租車子系統(tǒng)之間前痘。

參考代碼地址:https://github.com/zhiyoukaifa/Pattern

總結(jié):

? ? ? ? ? ? ?外觀模式是一個(gè)高頻率使用的設(shè)計(jì)模式凛捏,它的精髓就在于封裝二字。通過一個(gè)高層次結(jié)構(gòu)為用戶提供統(tǒng)一的API入口芹缔,使得用戶通過一個(gè)類型就基本能夠操作整個(gè)系統(tǒng)坯癣,這樣減少了用戶的使用成本,也能夠提升系統(tǒng)的靈活性最欠。

? 優(yōu)點(diǎn):

? ? ?1.對(duì)客戶屏蔽子系統(tǒng)組件示罗,減少了客戶處理的對(duì)象數(shù)目并使得子系統(tǒng)使用起來更加容易。通過引入外觀模式芝硬,客戶代碼將變得很簡(jiǎn)單蚜点,與之關(guān)聯(lián)的對(duì)象也很少。

? ? ? ?2.實(shí)現(xiàn)了子系統(tǒng)與客戶之間的松耦合關(guān)系拌阴,這使得子系統(tǒng)的組件變化不會(huì)影響到調(diào)用它的客戶類绍绘,只需要調(diào)整外觀類即可。

? ? ? 3.降低了大型軟件系統(tǒng)中的編譯依賴性迟赃,并簡(jiǎn)化了系統(tǒng)在不同平臺(tái)之間的移植過程陪拘,因?yàn)榫幾g一個(gè)子系統(tǒng)一般不需要編譯所有其他的子系統(tǒng)。一個(gè)子系統(tǒng)的修改對(duì)其他子系統(tǒng)沒有任何影響纤壁,而且子系統(tǒng)內(nèi)部變化也不會(huì)影響到外觀對(duì)象左刽。

? ? ? ?4.只是提供了一個(gè)訪問子系統(tǒng)的統(tǒng)一入口,并不影響用戶直接使用子系統(tǒng)類酌媒。


? 缺點(diǎn):

? ? ? ? ?1.外觀類接口膨脹欠痴。由于子系統(tǒng)的接口都有外觀類統(tǒng)一對(duì)外暴露迄靠,使得外觀類的API接口較多,在一定程度上增加了用戶使用成本斋否。

? ? ? ? ?2.不能很好地限制客戶使用子系統(tǒng)類梨水,如果對(duì)客戶訪問子系統(tǒng)類做太多的限制則減少了可變性和靈活性。

? ? ? ? ?3.在不引入抽象外觀類的情況下茵臭,增加新的子系統(tǒng)可能需要修改外觀類或客戶端的源代碼疫诽,違背了“開閉原則”。


參考書籍:

? ? ? ? ?《Objective-C編程之道 iOS設(shè)計(jì)模式解析》

? ? ? ? ?《Android源碼設(shè)計(jì)模式解析與實(shí)戰(zhàn)》

參考鏈接:

? ? ? ? ? ?https://www.cnblogs.com/wuchanming/p/4483140.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末旦委,一起剝皮案震驚了整個(gè)濱河市奇徒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌缨硝,老刑警劉巖摩钙,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異查辩,居然都是意外死亡胖笛,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門宜岛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來长踊,“玉大人,你說我怎么就攤上這事萍倡∩肀祝” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵列敲,是天一觀的道長(zhǎng)阱佛。 經(jīng)常有香客問我,道長(zhǎng)戴而,這世上最難降的妖魔是什么凑术? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮所意,結(jié)果婚禮上淮逊,老公的妹妹穿的比我還像新娘。我一直安慰自己扁眯,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布翅帜。 她就那樣靜靜地躺著姻檀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪涝滴。 梳的紋絲不亂的頭發(fā)上绣版,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天胶台,我揣著相機(jī)與錄音,去河邊找鬼杂抽。 笑死诈唬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的缩麸。 我是一名探鬼主播铸磅,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼杭朱!你這毒婦竟也來了阅仔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤弧械,失蹤者是張志新(化名)和其女友劉穎八酒,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體刃唐,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡羞迷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了画饥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衔瓮。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖荒澡,靈堂內(nèi)的尸體忽然破棺而出报辱,到底是詐尸還是另有隱情,我是刑警寧澤单山,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布碍现,位于F島的核電站,受9級(jí)特大地震影響米奸,放射性物質(zhì)發(fā)生泄漏昼接。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一悴晰、第九天 我趴在偏房一處隱蔽的房頂上張望慢睡。 院中可真熱鬧,春花似錦铡溪、人聲如沸漂辐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)髓涯。三九已至,卻和暖如春哈扮,著一層夾襖步出監(jiān)牢的瞬間纬纪,已是汗流浹背蚓再。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留包各,地道東北人摘仅。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像问畅,于是被迫代替她去往敵國(guó)和親娃属。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

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

  • 設(shè)計(jì)模式概述 在學(xué)習(xí)面向?qū)ο笃叽笤O(shè)計(jì)原則時(shí)需要注意以下幾點(diǎn):a) 高內(nèi)聚按声、低耦合和單一職能的“沖突”實(shí)際上膳犹,這兩者...
    彥幀閱讀 3,734評(píng)論 0 14
  • 外觀模式在復(fù)雜的業(yè)務(wù)系統(tǒng)上提供了簡(jiǎn)單的接口。如果直接把業(yè)務(wù)的所有接口直接暴露給使用者签则,使用者需要單獨(dú)面對(duì)這一大堆復(fù)...
    S大偉閱讀 651評(píng)論 0 1
  • 1 場(chǎng)景問題# 1.1 生活中的示例## 外觀模式在現(xiàn)實(shí)生活中的示例很多须床,比如:組裝電腦,通常會(huì)有兩種方案渐裂。 一個(gè)...
    七寸知架構(gòu)閱讀 6,194評(píng)論 7 57
  • 設(shè)計(jì)模式匯總 一豺旬、基礎(chǔ)知識(shí) 1. 設(shè)計(jì)模式概述 定義:設(shè)計(jì)模式(Design Pattern)是一套被反復(fù)使用、多...
    MinoyJet閱讀 3,903評(píng)論 1 15
  • 童年記憶不多柒凉,但是我每次要出差的時(shí)候族阅,都會(huì)想起我小時(shí)候哭著求我媽媽不要出差,媽媽把我放回椅子上膝捞,說了什么我忘了坦刀,只...
    半身月光閱讀 471評(píng)論 0 0