iOS 設計模式(GoF)

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

設計模式:為解決特定場景的問題而定制的解決方案。
設計原則:構(gòu)建可復制可維護代碼的經(jīng)驗法則。

MVC是復合設計模式(不是基本設計模式,屬于架構(gòu)級的設計模式)。

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

編碼是門藝術

設計30層樓棟項目,設計一開始就有完善的設計稿,材料,論證抗震指數(shù)。
設計模式就像是設計高樓的設計稿,是用以解決實際問題的。
設計模式是抽象出來的理論,但用來解決的實際問題,一點也不抽象。
設計模式是為復雜的項目而設計的,大部分用于非常復雜的項目,簡化項目設計,讓設計與實現(xiàn)成為可能。

  • 為何會抽象出設計模式
    幾十人做的項目,就要按圖紙,按固定、有效率的方式實現(xiàn)細節(jié)。
    設計模式是之前開發(fā)人員在開發(fā)大型項目遇到的問題,抽象出來的解決方案,是為解決特定問題而存在的。

  • 設計模式可以解決什么問題
    遇到復雜項目,用以解決特定存在的問題。
    適配器模式,專門用來解決接口適配問題,model與view綁定的設計不好,model修改繼而修改view,而適配器模式是model與view產(chǎn)生隔離,分別只會與適配器接觸,達到解耦的效果。

  • 學習設計模式的必要性

    • 務必先理解透徹
      • 面向?qū)ο笳Z言的3種特性,封裝、繼承、多態(tài)
      • 設計模式基本原則,開閉原則、里氏代換原則、依賴倒轉(zhuǎn)原則、接口隔離原則,合成/聚合復用
  • 推薦兩本書

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

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


設計模式基本原則

  • 開閉原則
    模塊開發(fā),對擴展開放,對修改關閉。
  • 里氏代換原則
    子類父類相互替換,類似抽象父類調(diào)用子類方法
  • 依賴倒轉(zhuǎn)原則
    抽象不依賴細節(jié),細節(jié)依賴抽象,用于設計接口,不破壞封裝性,類似抽象方法不暴露實現(xiàn)細節(jié),實現(xiàn)細節(jié)方法依賴抽象方法
  • 接口隔離原則
    接口做必要的事情,不做沒有相關性的事,如果開發(fā)嚴格遵守接口隔離原則,會讓源碼復用性很高。
  • 合成/聚合復用

設計模式的類型

  • 設計模式的類型

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


    設計模式的類型.png
  • GoF patterns(23種GoF設計模式)
    (Creational)
  • Abstract factory(抽象工廠模式)
  • Builder(生成器模式)
  • ** Factory method(工廠模式)**
  • Prototype(原型模式)
  • Singleton(單例模式)
    (Structural )
  • Adapter(適配器模式)
  • Bridge(橋接模式)
  • Composite(組合模式)
  • Decorator(裝飾模式)
  • Facade(外觀模式)
  • Flyweight(享元模式)
  • Proxy(代理模式)
    (Behavioral)
  • Chain of responsibility(責任鏈模式)
  • 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(保護暫停模式)
  • 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(服務定位器模式)
  • 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)建

  • 接口適配,設計模式

  • 對象去耦,觀察者

  • 抽象集合,組合模式

  • 行為擴展,訪問者

  • 算法封裝,策略模式

  • 對象訪問,代理模式

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

  • 推薦3個鏈接

review以前的代碼,進行適當?shù)母倪M。


適配器模式

  • 何為適配器模式

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

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

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

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

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

review以前的代碼,進行適當?shù)母倪M。


策略模式

  • if -else的問題

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

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

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

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

review以前的代碼,進行適當?shù)母倪M。


觀察者模式

  • 如何訂閱一本雜志

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

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

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

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

review以前的代碼,進行適當?shù)母倪M。


原型模式/外觀模式

  • 模板的用處

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

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

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

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

    • 外觀模式的基本原理

    • 解耦合

    • 簡化來操作

    • 何時使用外觀模式

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

  • 如何繪制復雜的圖形

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

review以前的代碼,進行適當?shù)母倪M。


裝飾模式

  • 照片與相框

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

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

  • 裝飾模式的使用場景

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

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

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

review以前的代碼,進行適當?shù)母倪M。


工廠模式

  • 制造手機與使用手機

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

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

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

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

review以前的代碼,進行適當?shù)母倪M。


橋接模式

  • 遙控器與電視機

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

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

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

review以前的代碼,進行適當?shù)母倪M。


代理模式

review以前的代碼,進行適當?shù)母倪M。


單例模式

review以前的代碼,進行適當?shù)母倪M。


備忘錄模式

review以前的代碼,進行適當?shù)母倪M。


生成器模式

review以前的代碼,進行適當?shù)母倪M。


命令模式

review以前的代碼,進行適當?shù)母倪M。


組合模式

review以前的代碼,進行適當?shù)母倪M。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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