iOS設(shè)計模式四部曲(二):結(jié)構(gòu)型模式 內(nèi)附Demo

本篇是四部曲的第二篇湾笛,第一篇請點這里iOS設(shè)計模式四部曲(一):創(chuàng)建型模式 內(nèi)附Demo妖爷,關(guān)于設(shè)計模式強烈推薦圖書《Head First設(shè)計模式》以及《研磨設(shè)計模式》竟秫。由于個人能力有限晃虫,文中難免有一些遺漏或者錯誤迄汛,請各位看官不吝賜教!謝謝槽畔!本文所有Demo可以在我的Git上獲取栈妆,請點擊這里

第二篇來了

設(shè)計模式.png

廢話不多說,上圖是整個設(shè)計模式的目錄厢钧,這篇文章是其中的第二部分:結(jié)構(gòu)型模式鳞尔。結(jié)構(gòu)型模式包括:適配器模式(Adapter)橋接模式(Bridge)早直,裝飾器模式(Decorator)寥假,組合模式(Composite)外觀模式(Facade)霞扬,享元模式(Flyweight)糕韧,代理模式(Proxy)。下面我們就開始吧~


適配器模式(Adapter):

1.定義: 適配器模式將一個類的接口變成調(diào)用者所期待的另一種接口喻圃,從而使原本因接口不匹配而無法在一起工作的兩個類能夠在一起工作萤彩。(舉一個現(xiàn)實中的實例:比如轉(zhuǎn)接頭)。
2. 使用場景: 擴展應(yīng)用或者組件時斧拍,而被集成進來的又不符合現(xiàn)在的接口雀扶,這個時候可以考慮使用適配器模式。
3. 具體實現(xiàn): 這里用舉一個實際的例子肆汹,同聲傳譯愚墓。舉了一個虛擬的國際大會場景窍侧,主持人只會說英語,然后馬云先生又聽不懂英語(當然只是假設(shè)转绷,事實是說的比中文都6),在喬布斯演講之后硼啤,就到馬云演講议经,這個時候就需要一個翻譯,去告訴馬云可以開始你的表演啦??谴返,具體Demo點擊這里查看
4.優(yōu)點: 通過使用適配器讓不兼容的接口變成了兼容煞肾,讓調(diào)用者從實現(xiàn)類的接口解耦。在不修改原有代碼的基礎(chǔ)上增加新的適配器類嗓袱,所以靈活性和擴展性比較好籍救,哪天不想用了,就一起卸載掉渠抹。
5.缺點: 只有集成具有類似功能的組件時蝙昙,適配器模式才具有使用價值。具有相似功能具體指:API不一樣梧却,但是功能是相似的奇颠。
6.注意事項: 適配器模式一般不是為了解決還處在于開發(fā)階段的問題,一般都是解決正在服役項目的擴展問題放航。


橋接模式(Bridge):

1.定義: 橋接模式就是將抽象部分和實現(xiàn)部分解耦烈拒,從而使得兩者可以獨立的變化。
2. 使用場景: 重用性要求較高的不希望或不適用使用繼承的場景广鳍。也就是說當繼承N層荆几,達到層級有點爆炸的時候可以考慮使用此模式。
3. 具體實現(xiàn): 這里舉了一個App不同模塊可以切換不同主題的例子赊时,橋接模式主打的是組合優(yōu)于繼承吨铸,具體Demo點擊查看,如果沒有用橋接模式的話蛋叼,可能就會出現(xiàn)MyRedModule焊傅,MyBlueModule這樣的類
4.優(yōu)點: 此模式分離了應(yīng)用的抽象部分與實現(xiàn)部分,有利于擴充狈涮。
5.缺點: 橋接模式要求正確識別出系統(tǒng)中兩個獨立變化的維度狐胎,因此其使用范圍具有一定的局限性。
6.注意事項: 并不是一涉及繼承就要考慮使用橋接模式歌馍,不然還要繼承做什么握巢?橋接模式的目的就是要對變化進行封裝,盡可能的把變化的因素封裝到最細最小的單元中松却,避免風險擴散暴浦。所以當發(fā)現(xiàn)類的繼承有N層的時候溅话,才需要去考慮使用該模式。


裝飾器模式(Decorator):

1.定義: 裝飾模式能動態(tài)的給一個對象添加一些額外的職責歌焦。就增加功能來說飞几,裝飾模式會比通過繼承生成子類更為靈活。
2. 使用場景: 需要動態(tài)地給一個對象增加功能独撇,這些功能也可以動態(tài)地被撤銷屑墨。
3. 具體實現(xiàn): Objective-C中的Category 就是裝飾器模式的一種應(yīng)用。這里舉了一個雞肉堡的例子纷铣,具體Demo點擊查看
4.優(yōu)點: 裝飾器模式中定義的行為卵史,能夠在不創(chuàng)建大量子類的情況下,組合起來實現(xiàn)復(fù)雜的效果搜立,比繼承更加靈活以躯。
5.缺點: 裝飾器模式會導(dǎo)致設(shè)計中出現(xiàn)許多的小對象,會讓系統(tǒng)變得更加復(fù)雜啄踊,比如說出錯調(diào)試時尋找錯誤可能需要逐級排查忧设。


組合模式(Composite):

1.定義: 組合模式將對象組合成樹形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu),使得用戶對單個對象和組合對象的使用具有一致性社痛。
2. 使用場景: 維護和展示部分-整體關(guān)系的場景见转,在具有整體和部分的層次結(jié)構(gòu)中,希望通過一種方式忽略整體與部分的差異蒜哀,可以一致地對待它們的時候斩箫。
3. 具體實現(xiàn): 這里舉一個文件系統(tǒng)的例子


這里有這個目錄下有文件夾Compositemain實現(xiàn)文件文件夾Composite下有實現(xiàn)文件頭文件撵儿。Demo點擊這里查看

4.優(yōu)點: 1.高層模塊調(diào)用簡單乘客。2.節(jié)點自由增加,而不必更改原來代碼淀歇。3.葉子對象可以被組合成更復(fù)雜的容器對象易核,而這個容器對象又可以被組合,這樣不斷遞歸下去浪默,可以形成復(fù)雜的樹形結(jié)構(gòu)牡直。
5.缺點: 使設(shè)計變得更加抽象,對象的業(yè)務(wù)規(guī)則如果很復(fù)雜纳决,則實現(xiàn)組合模式具有很大挑戰(zhàn)性碰逸,而且不是所有的方法都與葉子對象子類都有關(guān)聯(lián)。
6.注意事項: 當使用這個屬性結(jié)構(gòu)的調(diào)用組件能夠通過同一個類或者協(xié)議來使用書中包含的所有的對象時阔加,才能證明正確的實現(xiàn)了此模式饵史。


外觀模式(Facade):

1.定義: 外觀模式要求一個子系統(tǒng)的外部與內(nèi)部的通信必須通過一個統(tǒng)一的對象進行。外觀模式提供一個高層次的接口,用來訪問子系統(tǒng)中的一群接口胳喷。
2. 使用場景: 當一個復(fù)雜子系統(tǒng)需要提供一個簡單的調(diào)用接口時可以使用外觀模式湃番。
3. 具體實現(xiàn): 外觀模式比較容易理解,這里舉一個家電管家的例子吭露,命令起床吠撮,命令睡覺。家電管家?guī)湍阕鲫P(guān)燈讲竿,拉窗簾等等一系列操作纬向。具體Demo請點擊這里查看
4.優(yōu)點: 使用此模式可以將復(fù)雜的API代碼隱藏到一個簡單的接口中,減少調(diào)用者直接對復(fù)雜API的依賴和耦合戴卜。修改時也只需要修改簡單的接口即可。
5.缺點: 不太遵守開閉原則琢岩,一旦發(fā)現(xiàn)有一些操作的時候投剥,或者在增加新的子系統(tǒng)的時候,可能需要修改外觀類代碼担孔,可能會造成一些風險江锨。


享元模式(Flyweight):

1.定義: 享元模式就是運行共享技術(shù)有效地支持大量細粒度對象的復(fù)用
2. 使用場景: 系統(tǒng)中存在大量的相似對象,由于這類對象的大量使用可能會造成系統(tǒng)內(nèi)存資源浪費糕篇,而且這些對象的狀態(tài)大部分可以外部化啄育,這個時候可以考慮享元模式。在iOS中拌消,我們用到的UITableView 重用機制就是享元模式的典型應(yīng)用挑豌。
3. 具體實現(xiàn): 這里通過了一個畫圓的Demo來演示一下享元模式,具體Demo請點擊這里查看
4.優(yōu)點: 通過共享極大的減少了對象實例的個數(shù)墩崩,節(jié)省了內(nèi)存開銷氓英。
5.缺點: 1.提高了系統(tǒng)的復(fù)雜度,需要分離出外部狀態(tài)和內(nèi)部狀態(tài)鹦筹。 2.這些類必須有一個工廠對象加以控制铝阐。


代理模式(Proxy):

1.定義: 代理模式為其他對象提供一種代理以控制對這個對象的訪問。
2. 使用場景: 想在訪問一個類時做一些控制铐拐。
3. 具體實現(xiàn): 這里舉一個實際的例子徘键,就是火車票代售點,具體實現(xiàn)Demo請點擊這里查看
4.優(yōu)點: 1遍蟋、職責清晰吹害。 2、高擴展性匿值。
5.缺點: 增加了系統(tǒng)的復(fù)雜度
6.注意事項: 1赠制、和適配器模式的區(qū)別:適配器模式主要改變所考慮對象的接口,而代理模式不能改變所代理類的接口。 2钟些、和裝飾器模式的區(qū)別:裝飾器模式為了增強功能烟号,而代理模式是為了加以控制。


EOF:這篇文章通過Demo梳理了設(shè)計模式中的結(jié)構(gòu)型模式政恍,由于個人能力有限汪拥,難免有一些遺漏或者錯誤,還請各位看官不吝賜教篙耗! 最近工作有點忙迫筑,剩下的部分會盡量抽時間早點完成。本文已同步到個人博客宗弯,歡迎關(guān)注脯燃,歡迎點贊,歡迎star蒙保,歡迎一起交流辕棚,一起進步!??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末邓厕,一起剝皮案震驚了整個濱河市逝嚎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌详恼,老刑警劉巖补君,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異昧互,居然都是意外死亡挽铁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門敞掘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來屿储,“玉大人,你說我怎么就攤上這事渐逃」宦樱” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵茄菊,是天一觀的道長疯潭。 經(jīng)常有香客問我,道長面殖,這世上最難降的妖魔是什么竖哩? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮脊僚,結(jié)果婚禮上相叁,老公的妹妹穿的比我還像新娘遵绰。我一直安慰自己,他們只是感情好增淹,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布椿访。 她就那樣靜靜地躺著,像睡著了一般虑润。 火紅的嫁衣襯著肌膚如雪成玫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天拳喻,我揣著相機與錄音哭当,去河邊找鬼。 笑死冗澈,一個胖子當著我的面吹牛钦勘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播亚亲,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼个盆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了朵栖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤柴梆,失蹤者是張志新(化名)和其女友劉穎陨溅,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绍在,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡门扇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了偿渡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片臼寄。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖溜宽,靈堂內(nèi)的尸體忽然破棺而出吉拳,到底是詐尸還是另有隱情,我是刑警寧澤适揉,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布留攒,位于F島的核電站,受9級特大地震影響嫉嘀,放射性物質(zhì)發(fā)生泄漏炼邀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一剪侮、第九天 我趴在偏房一處隱蔽的房頂上張望拭宁。 院中可真熱鬧,春花似錦、人聲如沸杰标。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽在旱。三九已至摇零,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間桶蝎,已是汗流浹背驻仅。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留登渣,地道東北人噪服。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像胜茧,于是被迫代替她去往敵國和親粘优。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

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