設(shè)計模式的學(xué)習(xí)筆記

起因是這樣的,還記得夏天的時候.再一次上班的路上,和前公司前端大牛閑聊說道Facebook開源的一個庫,里面都是用url作為驅(qū)動,進(jìn)行VC之間的跳轉(zhuǎn).當(dāng)時一知半解,就覺得這樣設(shè)計所有的頁面或者view更像一個組件,可以通過url被拉起來.視圖之間的輪轉(zhuǎn)會變得跟加直接.當(dāng)時想著Facebook的工程師們太高產(chǎn)了.

這事就一直放著了,然后最近無意在微博上看到一個iOS開發(fā)者寫的博客<iOS應(yīng)用架構(gòu)談 組件化方案>突然想起之前那次閑聊時候的話題,引發(fā)了興趣,隨即把大神的幾篇文章都讀了一遍,感觸頗深.起先寫項目的時候從沒考慮過架構(gòu)的問題,就是那么寫也沒想著以后版本遷移,后續(xù)增加模塊,覺得項目理所應(yīng)當(dāng)這么寫.看過博主的文章之后,決定好好學(xué)習(xí)一下設(shè)計模式.

以大神的一篇關(guān)于跳出面向?qū)ο蟮乃枷?-繼承這篇文章結(jié)合最近看的設(shè)計模式的書,簡單梳理一下我的學(xué)習(xí)思路:
首先是繼承,用過的人多知道它有多好用,在基類里面做統(tǒng)一設(shè)置,所有的派生類再也不用謝重復(fù)的代碼.光想想就是爽.可是,東西好用就有它的缺陷,它的缺點也暴露的很明顯:高耦合.

大神在他的博客中舉了個簡單的場景:產(chǎn)品經(jīng)理提出一個需求,需要在首頁,及其的他子頁面寫個搜索框.接到需求的程序員決定從之前寫好的搜索框派生出一個新的:HOME_SEARCH_BAR派生出PAGE_SEARCH_BAR,目前就這么看,完全沒有任何問題,

需求增加,經(jīng)理要求子頁面的搜索需要多一個本地搜索的功能,于是你會在PAGE_SEARCH_BAR增加一個locasearch功能.之后變態(tài)的要求來了.經(jīng)理提出來,把首頁的搜索換一個樣式,但是子頁面的還保持原來的樣子.這個需求看似簡單,但是用繼承的你確知道,有多蛋疼.首頁你需要在基類的初始化里面寫case,隨著項目的進(jìn)展,越來越多的子類,swich case大法慢慢寫吧.

然后別的地方需要用你寫的localsearch功能,卻發(fā)現(xiàn)需要把你所寫的基類全部拿出來,如果你基類里面又引用了別的東西,只能呵呵.

大神在他的博客給出的解決方案是:用組合替代繼承填渠。將Textfield和search模塊拆開金度,然后通過定義好的接口進(jìn)行交互典唇,一般來說可以選擇Delegate模式來交互侯勉。

,搜索框和搜索邏輯分別形成了兩個不同的組件夜畴,分別在HOME_SEARCH_BAR,PAGE_SEARCH_BAR,LOCAL_SEARCH_BAR中以不同的形態(tài)組合而成拖刃。textField和SEARCH_LOGIC之間通過delegate的模式進(jìn)行數(shù)據(jù)交互。 這樣就解決了上面提到的兩種類型的問題贪绘。

剛好我在iOS設(shè)計模式里面也看到類似的做法,它取名叫橋接模式.

舉個列子:要模擬實現(xiàn)兩個游戲機的操作,游戲機分別用AB代替.

首先游戲機A和B都有左手邊都有上下左右四個鍵位,右手邊OX兩個按鍵,中間是開始鍵位,其中A在右邊還有一個選擇鍵,B沒有.除了鍵位有少許差別,面板操作幾乎完全一樣.如果你開始打算為每個具體游戲機設(shè)計專用的控制器,那么勢必會有很多冗余.而且可能以后會導(dǎo)致子類游戲機的激增.以后的業(yè)務(wù)也許派生出來的子類可能不需要方向鍵,而是從加速到讀取方向的變化,從而模擬上下左右.

所以最好的做法是把虛擬的控制器和游戲機分離.這樣他們就能獨立的變化.從而不影響對方的代碼.話句話來說,它們是有各自的類層次.兩個層次會有不同的接口,通過對象組合的方法連接起來.它們之間的靜態(tài)結(jié)構(gòu)圖是這樣的:

consoleVC(setCommand)----------->consoleEmulator(接受command)

| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? ? ? ? ? ? ??

| ? ? ? ? ? A游戲機(接受command, 執(zhí)行方法) ? ? ? ? ?B游戲機(接受command,執(zhí)行方法)

| ? ? ? ? ? ? ? ? ? ? ? ? ?

touchVC( [super setCommand] ? 上下左右選擇開始OX)


consoleVC和consoleEmulator分別是虛擬控制器和游戲機的抽象類,這兩個類有不同的接口,在consoleVC中封裝一個隊Emulator的引用.consoleVC的實例可以在抽象層上是用Emulator的實例.這就完成了兩個類的橋接.

Emulator為其子類定制個性化接口,用于處理游戲機的底層指令.

consoleVC有個相對底層的方法,向橋接端再發(fā)送基本命令,它的set方法接受預(yù)先設(shè)定好的command,并通過"接受command"把消息轉(zhuǎn)發(fā)給內(nèi)嵌的Emulator.


指令集



模擬器基類


游戲機A,游戲機B和a類似,就不寫了.


控制器.h


控制器.m




我們想讓所有的方法使用父類中的同一個setCommand實現(xiàn),通過super 而不是self發(fā)送消息.通過橋接模式,可以看到組合對象的力量.我們?yōu)閏onsoleEmulator實現(xiàn)的橋接不可能通過直接的繼承來實現(xiàn).

這也是大神所提倡的優(yōu)先使用對象組合的形式而不是繼承.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末兑牡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子税灌,更是在濱河造成了極大的恐慌均函,老刑警劉巖亿虽,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異苞也,居然都是意外死亡洛勉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門如迟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來收毫,“玉大人,你說我怎么就攤上這事殷勘〈嗽伲” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵玲销,是天一觀的道長引润。 經(jīng)常有香客問我,道長痒玩,這世上最難降的妖魔是什么淳附? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮蠢古,結(jié)果婚禮上奴曙,老公的妹妹穿的比我還像新娘。我一直安慰自己草讶,他們只是感情好洽糟,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著堕战,像睡著了一般坤溃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嘱丢,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天薪介,我揣著相機與錄音,去河邊找鬼越驻。 笑死汁政,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的缀旁。 我是一名探鬼主播记劈,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼并巍!你這毒婦竟也來了目木?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤懊渡,失蹤者是張志新(化名)和其女友劉穎刽射,沒想到半個月后怀跛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡柄冲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了忠蝗。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片现横。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖阁最,靈堂內(nèi)的尸體忽然破棺而出戒祠,到底是詐尸還是另有隱情,我是刑警寧澤速种,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布姜盈,位于F島的核電站,受9級特大地震影響配阵,放射性物質(zhì)發(fā)生泄漏馏颂。R本人自食惡果不足惜棋傍,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一救拉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瘫拣,春花似錦亿絮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至淮椰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間实苞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工聪轿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留猾浦,地道東北人灯抛。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓音瓷,卻偏偏與公主長得像对嚼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子绳慎,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

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

  • 設(shè)計模式基本原則 開放-封閉原則(OCP)纵竖,是說軟件實體(類、模塊杏愤、函數(shù)等等)應(yīng)該可以拓展靡砌,但是不可修改。開-閉原...
    西山薄涼閱讀 3,792評論 3 14
  • 震驚画舌!小豬的設(shè)計模式初涉總結(jié)!純干貨~ 標(biāo)簽: 知識點總結(jié) 描述性文字 今年一月初有了離職的念頭后已慢,就盤算著把設(shè)計...
    coder_pig閱讀 1,096評論 0 24
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫骗炉、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,093評論 4 62
  • 那顆糖好甜 十幾年的光陰也不散 許你高樓廣廈 可是 可是 你說話不算數(shù) 只留我一人信守承諾 看到路邊散步的老太太 ...
    小白army閱讀 247評論 0 3
  • 原文鏈接:http://blog.csdn.net/qq_22329521/article/details/601...
    越長越圓閱讀 3,142評論 0 0