iOS 設(shè)計(jì)模式(GoF)

小白程序員只能看懂源代碼瞬捕,而大神程序員能看懂文檔。

設(shè)計(jì)模式:為解決特定場景的問題而定制的解決方案。
設(shè)計(jì)原則:構(gòu)建可復(fù)制可維護(hù)代碼的經(jīng)驗(yàn)法則娃豹。

MVC是復(fù)合設(shè)計(jì)模式(不是基本設(shè)計(jì)模式,屬于架構(gòu)級的設(shè)計(jì)模式)购裙。

  • Model上的Notification和KVO是觀察者模式
  • Controller和View之間的target-action是命令模式鹃栽。
  • delegate是代理模式其實(shí)是適配器模式躏率。
  • View將接收到動作給Controller,Controller使Model做不同的操作民鼓,取決于控制器的內(nèi)置策略薇芝,是策略模式
  • 控制器構(gòu)成了Model和View之間傳遞數(shù)據(jù)的雙向通道丰嘉,是中介者模式夯到。
  • 適配器模式
  • 策略模式
  • 觀察者模式
  • 原型模式/外觀模式
  • 裝飾模式
  • 工廠模式
  • 橋接模式
  • 代理模式
  • 單例模式
  • 備忘錄模式
  • 生成器模式
  • 命令模式
  • 組合模式

編碼是門藝術(shù)

設(shè)計(jì)30層樓棟項(xiàng)目,設(shè)計(jì)一開始就有完善的設(shè)計(jì)稿饮亏,材料耍贾,論證抗震指數(shù)。
設(shè)計(jì)模式就像是設(shè)計(jì)高樓的設(shè)計(jì)稿路幸,是用以解決實(shí)際問題的荐开。
設(shè)計(jì)模式是抽象出來的理論,但用來解決的實(shí)際問題简肴,一點(diǎn)也不抽象晃听。
設(shè)計(jì)模式是為復(fù)雜的項(xiàng)目而設(shè)計(jì)的,大部分用于非常復(fù)雜的項(xiàng)目砰识,簡化項(xiàng)目設(shè)計(jì)能扒,讓設(shè)計(jì)與實(shí)現(xiàn)成為可能。

  • 為何會抽象出設(shè)計(jì)模式
    幾十人做的項(xiàng)目辫狼,就要按圖紙初斑,按固定、有效率的方式實(shí)現(xiàn)細(xì)節(jié)予借。
    設(shè)計(jì)模式是之前開發(fā)人員在開發(fā)大型項(xiàng)目遇到的問題越平,抽象出來的解決方案,是為解決特定問題而存在的灵迫。

  • 設(shè)計(jì)模式可以解決什么問題
    遇到復(fù)雜項(xiàng)目秦叛,用以解決特定存在的問題。
    適配器模式瀑粥,專門用來解決接口適配問題挣跋,model與view綁定的設(shè)計(jì)不好,model修改繼而修改view狞换,而適配器模式是model與view產(chǎn)生隔離避咆,分別只會與適配器接觸舟肉,達(dá)到解耦的效果。

  • 學(xué)習(xí)設(shè)計(jì)模式的必要性

    • 務(wù)必先理解透徹
      • 面向?qū)ο笳Z言的3種特性查库,封裝路媚、繼承、多態(tài)
      • 設(shè)計(jì)模式基本原則樊销,開閉原則整慎、里氏代換原則、依賴倒轉(zhuǎn)原則围苫、接口隔離原則裤园,合成/聚合復(fù)用
  • 推薦兩本書

    • 《Pro Design Patterns in Swift》
    • 《Pro Objective-C Design Patterns for iOS》

現(xiàn)實(shí)開發(fā)中遇到的特定問題,才用設(shè)計(jì)模式來優(yōu)化這種設(shè)計(jì)剂府。


設(shè)計(jì)模式基本原則

  • 開閉原則
    模塊開發(fā)拧揽,對擴(kuò)展開放,對修改關(guān)閉腺占。
  • 里氏代換原則
    子類父類相互替換淤袜,類似抽象父類調(diào)用子類方法
  • 依賴倒轉(zhuǎn)原則
    抽象不依賴細(xì)節(jié),細(xì)節(jié)依賴抽象湾笛,用于設(shè)計(jì)接口饮怯,不破壞封裝性,類似抽象方法不暴露實(shí)現(xiàn)細(xì)節(jié)嚎研,實(shí)現(xiàn)細(xì)節(jié)方法依賴抽象方法
  • 接口隔離原則
    接口做必要的事情蓖墅,不做沒有相關(guān)性的事,如果開發(fā)嚴(yán)格遵守接口隔離原則临扮,會讓源碼復(fù)用性很高论矾。
  • 合成/聚合復(fù)用

設(shè)計(jì)模式的類型

  • 設(shè)計(jì)模式的類型

    • GoF
    • 并發(fā)設(shè)計(jì)模式
    • 框架級別的設(shè)計(jì)模式
  • 設(shè)計(jì)模式的劃分


    設(shè)計(jì)模式的類型.png
  • GoF patterns(23種GoF設(shè)計(jì)模式)
    (Creational)
  • Abstract factory(抽象工廠模式)
  • Builder(生成器模式)
  • ** Factory method(工廠模式)**
  • Prototype(原型模式)
  • Singleton(單例模式)
    (Structural )
  • Adapter(適配器模式)
  • Bridge(橋接模式)
  • Composite(組合模式)
  • Decorator(裝飾模式)
  • Facade(外觀模式)
  • Flyweight(享元模式)
  • Proxy(代理模式)
    (Behavioral)
  • Chain of responsibility(責(zé)任鏈模式)
  • Interpreter(解析器模式)
  • Iterator(迭代器模式)
  • Mediator(中介者模式)
  • Memento(備忘錄模式)
  • Observer(觀察者模)
  • State(狀態(tài)模式)
  • Strategy(策略模式)
  • Template method(模板方法模式)
  • Visitor(訪問者模式)
  • Concurrency patterns(并發(fā)模型)
  • Active object(主動對象模式)
  • Balking(止步模式)
  • Double-checked locking(雙重檢查鎖定)
  • Event-based asynchronous(基于事件的異步鎖模式)
  • Guarded suspension(保護(hù)暫停模式)
  • Join(加盟模式)
  • Lock(加鎖模式)
  • Monitor(監(jiān)視器)
  • Proactor(Proactor模式)
  • Reactor(Reactor模式)
  • Read write lock(讀寫鎖)
  • Scheduler(調(diào)度)
  • Thread pool(線程池模式)
  • Thread-local storage(線程本地存儲TLS)
  • Architectural patterns
  • Front controller(前端控制器模式)
  • intercepter(攔截器模式)
  • MVC(模型-視圖-控制器模式,MVC模式)
  • n-tier(多層架構(gòu)模式)
  • Specification(規(guī)格模式)
  • Publish-subscribe(訂閱發(fā)布模式)
  • Naked objects(Naked objects模式)
  • Service locator(服務(wù)定位器模式)
  • Active record(活躍記錄模式)
  • Identity map(恒等映射模式)
  • Data access object(數(shù)據(jù)訪問對象模式杆勇,DAO模式)
  • Data transfer object(數(shù)據(jù)傳輸對象模式贪壳,DTO模式)
  • Other patterns
  • Dependency injection(依賴性注射模式)

  • lazy loading(懶加載模式)

  • Mock object(模擬對象)

  • Null object(空對象模式)

  • Object pool(對象池模式)

  • Servant(仆人模式)

  • Type tunnel(隧道模式)

  • 功能劃分

  • 對象創(chuàng)建

  • 接口適配,設(shè)計(jì)模式

  • 對象去耦蚜退,觀察者

  • 抽象集合闰靴,組合模式

  • 行為擴(kuò)展,訪問者

  • 算法封裝钻注,策略模式

  • 對象訪問蚂且,代理模式

  • 對象狀態(tài),備忘錄幅恋,用于回退操作杏死,并保存每一步修改狀態(tài)

  • 推薦3個鏈接

review以前的代碼,進(jìn)行適當(dāng)?shù)母倪M(jìn)。


適配器模式

  • 何為適配器模式

    • 國家電壓頻率不一致問題
    • 充電器如何解決電壓頻率轉(zhuǎn)換問題
    • 充電器于適配器之間的關(guān)聯(lián)
  • 數(shù)據(jù)直接適配帶來的困境

    • 直接賦值的靈活性問題
    • 如何降低數(shù)據(jù)層和視圖層的耦合度

  • 使用適配器模式
    創(chuàng)建適配協(xié)議淑翼,創(chuàng)建抽象適配器類腐巢,創(chuàng)建類適配器/對象適配器。

    • 創(chuàng)建抽象適配器對象
    • 適配器與視圖層建立輸出的聯(lián)系
    • 適配器與數(shù)據(jù)層建立輸入的聯(lián)系
    • 類適配器與對象適配器
  • 適配器模式的優(yōu)缺點(diǎn)

    • 優(yōu)點(diǎn)
      復(fù)用性更高玄括,可移植性更強(qiáng)冯丙。
      • 降低視圖層和數(shù)據(jù)層的耦合度
      • 通用性、好維護(hù)遭京,不需要修改核心代碼银还,只需要創(chuàng)建適配器類,或?qū)崿F(xiàn)類適配器
    • 缺點(diǎn)
      • 實(shí)現(xiàn)操作多洁墙,可讀性有局限性,必須深刻理解

review以前的代碼戒财,進(jìn)行適當(dāng)?shù)母倪M(jìn)热监。


策略模式

  • if -else的問題

    • 如果判斷邏輯都使用if-else
    • 將if-else判斷邏輯抽象為對象
    • 策略(整體)作為對象
  • 策略模式的原理

    • 策略模式的原理<靜態(tài)關(guān)系>
      • 策略類
      • 策略接口
      • 具體策略類
      • 場景類
    • 相同的輸入不同的輸出
  • 策略模式的使用

    • 如何抽象出策略
    • 制定協(xié)議來維護(hù)輸出信息
  • 策略模式的優(yōu)缺點(diǎn)

    • 策略模式的優(yōu)點(diǎn)
      • 簡化if-else操作
      • 可維護(hù)很高,策略基類饮寞,實(shí)例化一個子類孝扛,按固定協(xié)議的抽象出的方案來判斷
    • 策略模式的缺點(diǎn)
      • 驗(yàn)證號碼是在實(shí)例化前就確定的策略,無法動態(tài)化

review以前的代碼幽崩,進(jìn)行適當(dāng)?shù)母倪M(jìn)苦始。


觀察者模式

  • 如何訂閱一本雜志

    • 如何訂閱一本雜志
    • 訂閱雜志過程角色功能的定義
    • 對功能模型進(jìn)行抽象
  • 通知中心的抽象設(shè)計(jì)

    • 如何抽象接口
    • 對訂閱對象抽象
    • 面向接口編程
  • 實(shí)現(xiàn)通知中心

    • 對象持有的問題
    • 用NSHashTable實(shí)現(xiàn)weak引用
    • 參數(shù)嚴(yán)格驗(yàn)證
  • KVO與通知中心

    • KVO與通知中心的使用
    • KVO與通知中心需要注意的細(xì)節(jié)

review以前的代碼,進(jìn)行適當(dāng)?shù)母倪M(jìn)慌申。


原型模式/外觀模式

  • 模板的用處

    • 為何需要制作模板
      具有共通的特性陌选,只需要修改元素,就可獲取不同對象蹄溉。
    • 何時需要制作模板
      對象之間十分相似咨油,抽象部分完全相同,只有細(xì)節(jié)略有差異柒爵。
  • 原型模式的原理

    • 原型模式的基本原理
      對象支持拷貝自己
    • 何時使用原型模式
      復(fù)制自己役电,適用對象組合起來特別復(fù)雜,重新創(chuàng)建代價特別大時棉胀,用原型模式可以直接從模板拷貝出來通過修改幾個值達(dá)到需求時法瑟。
  • NSCopying協(xié)議的使用細(xì)節(jié)

    • NSCopying協(xié)議的使用
    • 深拷貝與淺拷貝
    • 不支持NSCopying協(xié)議的對象
  • 如何去一個指定的地方

    • 自駕 or 坐火車
    • 用不同的手段達(dá)到相同的目的
  • 外觀模式的原理

    • 外觀模式的基本原理

    • 解耦合

    • 簡化來操作

    • 何時使用外觀模式

      • 復(fù)雜的子系統(tǒng)
      • 不關(guān)心邏輯,只要結(jié)果
    • 需要注意的細(xì)節(jié)

  • 如何繪制復(fù)雜的圖形

    • 為何要簡化操作邏輯
    • 用外觀模式簡化流程
    • 可維護(hù)性探討

review以前的代碼唁奢,進(jìn)行適當(dāng)?shù)母倪M(jìn)霎挟。


裝飾模式

  • 照片與相框

    • 增加照片的美感
    • 相框的適用范圍
    • 照片的復(fù)用性
  • 裝飾模式的原理

    • 裝飾模式的基本原理(UML)
      • 不改變原始類,不知道原始類具體實(shí)現(xiàn)驮瞧,動態(tài)擴(kuò)展功能
      • 不改變使用繼承的情形氓扛,不想有更多子類不想通過繼承的方式添加功能
      • 動態(tài)擴(kuò)展對象的功能
      • 持有對象的引用,包含實(shí)例化的被裝飾類
  • 裝飾模式的優(yōu)點(diǎn)
    不改變、不繼承采郎、動態(tài)擴(kuò)展功能

  • 裝飾模式的使用場景

    • 靜態(tài)庫需要擴(kuò)展功能千所,卻無法修改實(shí)現(xiàn)
  • 實(shí)現(xiàn)裝飾模式

    • 如何增加新的按鈕
    • 裝飾模式的實(shí)現(xiàn)
  • category 的使用

    • category 與裝飾模式的細(xì)微區(qū)別
    • 給 category 添加屬性,重寫被裝飾對象方法
    • 使用 category 需要注意的一些地方

review以前的代碼蒜埋,進(jìn)行適當(dāng)?shù)母倪M(jìn)淫痰。


工廠模式

  • 制造手機(jī)與使用手機(jī)

    • 制造手機(jī)的過程
    • 使用手機(jī)的行為
    • 何為工廠方法
  • 簡單工廠

    • 簡單工廠原理
    • 為何叫簡單工廠
    • 簡單工廠使用場景
      • 簡化生產(chǎn)流程
      • 隔離生產(chǎn)產(chǎn)品的細(xì)節(jié)
      • 不同類型的產(chǎn)品之間有著一些共同的細(xì)節(jié)
      • 具體工廠
  • 抽象工廠

    • 抽象工廠原理
    • 抽象工廠抽象在哪里
    • 抽象工廠使用場景
  • Cocoa 框架中的 NSNumber

    • NSNumber 的抽象行為
    • NSNumber 與工廠方法的比較

review以前的代碼,進(jìn)行適當(dāng)?shù)母倪M(jìn)整份。


橋接模式

  • 遙控器與電視機(jī)

    • 遙控器遙控電視機(jī)的過程
    • 遙控器與電視機(jī)職能的分解
    • 建立抽象層次結(jié)構(gòu)
  • 橋接模式原理
    橋接模式的目的待错,就是把抽象層次結(jié)構(gòu)從具體的實(shí)現(xiàn)中分離出來,使其能夠獨(dú)立變更烈评。抽象層次定義了供客戶端使用的上層抽象接口火俄。實(shí)現(xiàn)結(jié)構(gòu)定義了供抽象層使用的底層接口。實(shí)現(xiàn)類的引用被封裝到抽象層的實(shí)例中讲冠,橋接就形成了瓜客。

    • 上層抽象接口的職能
    • 實(shí)現(xiàn)層抽象接口的職能
    • 層級間的通信協(xié)議
    • 橋接模式的原理
  • 設(shè)計(jì)游戲機(jī)模擬器

    • 游戲機(jī)模擬器的功能定義
    • 按鈕協(xié)議的制定
    • 游戲機(jī)模擬器的實(shí)現(xiàn)

review以前的代碼,進(jìn)行適當(dāng)?shù)母倪M(jìn)竿开。


代理模式

review以前的代碼谱仪,進(jìn)行適當(dāng)?shù)母倪M(jìn)。


單例模式

review以前的代碼否彩,進(jìn)行適當(dāng)?shù)母倪M(jìn)疯攒。


備忘錄模式

review以前的代碼,進(jìn)行適當(dāng)?shù)母倪M(jìn)列荔。


生成器模式

review以前的代碼敬尺,進(jìn)行適當(dāng)?shù)母倪M(jìn)。


命令模式

review以前的代碼贴浙,進(jìn)行適當(dāng)?shù)母倪M(jìn)筷转。


組合模式

review以前的代碼,進(jìn)行適當(dāng)?shù)母倪M(jìn)悬而。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末呜舒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子笨奠,更是在濱河造成了極大的恐慌袭蝗,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件般婆,死亡現(xiàn)場離奇詭異到腥,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蔚袍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門乡范,熙熙樓的掌柜王于貴愁眉苦臉地迎上來配名,“玉大人,你說我怎么就攤上這事晋辆∏觯” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵瓶佳,是天一觀的道長芋膘。 經(jīng)常有香客問我,道長霸饲,這世上最難降的妖魔是什么为朋? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮厚脉,結(jié)果婚禮上习寸,老公的妹妹穿的比我還像新娘。我一直安慰自己傻工,他們只是感情好融涣,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著精钮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪剃斧。 梳的紋絲不亂的頭發(fā)上轨香,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機(jī)與錄音幼东,去河邊找鬼臂容。 笑死,一個胖子當(dāng)著我的面吹牛根蟹,可吹牛的內(nèi)容都是我干的脓杉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼简逮,長吁一口氣:“原來是場噩夢啊……” “哼球散!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起散庶,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蕉堰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后悲龟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屋讶,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年须教,在試婚紗的時候發(fā)現(xiàn)自己被綠了皿渗。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖乐疆,靈堂內(nèi)的尸體忽然破棺而出划乖,到底是詐尸還是另有隱情,我是刑警寧澤诀拭,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布迁筛,位于F島的核電站,受9級特大地震影響耕挨,放射性物質(zhì)發(fā)生泄漏细卧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一筒占、第九天 我趴在偏房一處隱蔽的房頂上張望贪庙。 院中可真熱鬧,春花似錦翰苫、人聲如沸止邮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽校哎。三九已至,卻和暖如春狡孔,著一層夾襖步出監(jiān)牢的瞬間害捕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工墨叛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留止毕,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓漠趁,卻偏偏與公主長得像扁凛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子闯传,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

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