🐻iOS設計模式

設計模式,一個一個學,等到理解後,揉碎,分散,而後修改現有項目,思考哪些能夠用到哪一個設計模式。html

設計模式之路

  • 熟悉階段,好像每一種設計模式都符合當前的狀況,不一樣的設計模式有歧義,有類似,有違背設計原則,彷佛都能解決。別怕,挑一個本身以爲最合適的。
  • 使用階段,會把各類設計模式混合使用,整的明明白白,但設計的會有些僵硬,缺乏靈活性
  • 融匯貫通,設計模式爛與心中,寫代碼時,天然而然久用到了本身模式,根據設計模式的七大原則,寫出優秀的代碼
  • 出神入化,設計原則已經出如今你的潛意識裏,而且已經開始嘗試新的原則設計。

就像張無忌跟張三丰學太極時,所有學會,纔是入門;所有忘掉,纔算是漸入佳境,距離成神還早着呢。ios

設計模式原則一覽表

  • 開閉原則是總綱,它告訴咱們要對擴展開放,對修改關閉;
  • 里氏替換原則告訴咱們不要破壞繼承體系;
  • 依賴倒置原則告訴咱們要面向接口編程;
  • 單一職責原則告訴咱們實現類要職責單一;
  • 接口隔離原則告訴咱們在設計接口的時候要精簡單一;
  • 迪米特法則告訴咱們要下降耦合度;
  • 合成複用原則告訴咱們要優先使用組合或者聚合關係複用,少用繼承關係複用。

一覽表

名稱 分類 思想 角色 示例
簡單工廠模式 建立型 用個工廠來建立一個要求的相同種類東西 具體工廠類、抽象對象類、具體對象類 Factory生產 圓、方形、橢圓、菱形 的按鈕
工廠方法模式 建立型 用個工廠來建立多個要求的相同種類東西 具體工廠類、抽象對象類、具體對象類 Factory生產 圓、方形、橢圓、菱形 的按鈕,同時區分暗黑主題、仍是正常模式
抽象工廠模式 建立型 用個工廠來建立多個要求的不相同種類東西 抽象工廠、工廠、抽象產品多種、具體產品多種 Factory生產 圓、方形、橢圓、菱形 的控件,同時區分暗黑主題、仍是正常模式;控件包含按鈕,UILabel、UIView、UIImageView
建造者模式 建立型 建立一個複雜的東西 指揮者、抽象建造者、具體建造者、被建造的對象 經過KFC點餐來學習建造者模式
單例模式 建立型 單1、重複使用、頻繁使用 x XXManager,XXServer,UserDefault
= = = = =
適配器模式 結構型 把需適配者Adaptee,經過適配器Adapter,適配成能夠供目標TargetA、B、C、D使用 ,注意ABCD用的都是Adaptee中的一樣的功能,不是組合 Adaptee、Adapter、Target 經過擼一個滾動圖來學習適配器模式
橋接模式 結構型 A想用B可是沒辦法經過繼承組合等形式達成時 橋接文件,這裏邊應該是極其複雜的黑盒子 apple 提供了使用橋接的思想,一個是原生OC、Swift調用JS、另外一個是Swift調用OC;我能想到的一個示例:咱們用Swift本身去解析Lottie的json文件,而後修改裏邊的值,讓其作動畫、改變寬高、顏色
裝飾器模式 結構型 動態的給對象增長方法 x swift中面向協議編程以及extension都是這種思想
外觀模式 結構型 減小不一樣類之間的交互,提供統一接口 使用者、 外觀、子功能 在獲取資源類中,須要分別調用本地緩存和網絡數據,最後把這個組合結果返回;實現隔離減小不一樣類之間的交互
代理模式 結構型 先佔坑,異步操做 x 耗時操做,圖片異步加載
享元模式 結構型 緩存系統,緩存在內存中、大量重複使用適合顆粒度較小的東西 x x
= = = = =
命令模式 (×) 行爲型 把命令抽象成對象,具體的命令對象,給外界提供接口,同時負責命令的執行 抽象命令類、具體命令類、調用者、接收者 設計模式系列 6-- 命令模式
中介者模式 行爲型 用一箇中介對象來封裝一系列的對象交互,中介者使各對象不須要顯式地相互引用,從而使其耦合鬆散,並且能夠獨立地改變它們之間的交互 Mediator: 抽象中介者、ConcreteMediator: 具體中介者、Colleague: 抽象同事類、ConcreteColleague: 具體同事類 設計模式系列3--中介者模式
觀察者模式 行爲型 主動觀察到狀態改變,從而發生變化,一對多的場景 抽象目標 、目標、抽象觀察者、觀察者 KVO、Notification
狀態模式 行爲型 對象的行爲取決於狀態,環境類實際上就是擁有狀態的對象,環境類有時候能夠充當狀態管理器(State Manager)的角色,能夠在環境類中對狀態進行切換操做 環境類、抽象狀態類、具體狀態類 設計模式系列9--狀態模式
策略模式 行爲型 定義一系列算法,把它們一個個的封裝起來,而且使他們能夠相互替換。策略模式使得算法可獨立於使用它的客戶端而變化 環境類、抽象策略類、具體策略類 X模塊中有個分段函數,A、B、C須要X模塊支持,可是對X模塊中的分段函數有不一樣要求,這時,你能夠在X模塊中寫if、else語句、或者switch語句,但這樣違反開閉原則,因此,更好的方式是把函數算法封裝起來,做爲參數傳進去。

建立型模式

  • 建立型模式在建立什麼(What),由誰建立(Who),什麼時候建立(When)等方面都爲軟件設計者提供了儘量大的靈活性。算法

  • 建立型模式隱藏了類的實例的建立細節,經過隱藏對象如何被建立和組合在一塊兒達到使整個系統獨立的目的。編程

  • 說明:建立對象時,使用到的模式json

  • 關鍵字:build、構建、構造、建立、工廠模式swift

1、簡單工廠模式

2、工廠設計模式

  • 場景:生產單一類型產品(大量,分給不一樣工廠製造)
  • 角色:抽象工廠、工廠、抽象產品、具體產品
  • 參見工廠模式三兄弟

3、抽象工廠模式

  • 場景:生產多種類型產品(大量,分給不一樣工廠製造)
  • 角色:抽象工廠、工廠、抽象產品多種、具體產品多種
  • 參見工廠模式三兄弟

4、建設者模式

5、單例模式

  • 場景:單1、重複使用、頻繁使用
  • 注意:有些資源再也不須要時,或者收到內存警告時,主動釋放
  • 示例:XXManager,XXServer,UserDefault

結構型模式

  • 說明:某一個功能比較複雜時,如何可複用\組合造成複雜的、功能更爲強大的結構
  • 關鍵字:框架、解耦、隔離、組合、結構
  • 結構型模式能夠分爲類結構型模式和對象結構型模式
    • 類結構型模式關心類的組合,由多個類能夠組合成一個更大的
    • 對象結構型模式關心類與對象的組合,經過關聯關係使得在一 個類中定義另外一個類的實例對象,而後經過該對象調用其方法。 根據「合成複用原則」,在系統中儘可能使用關聯關係來替代繼 承關係,所以大部分結構型模式都是對象結構型模式。

1、適配器模式

2、橋接模式

  • A想用B可是沒辦法經過繼承組合等形式達成時
  • 橋接文件,這裏邊應該是極其複雜的黑盒子
  • apple 提供了使用橋接的思想,一個是原生OC、Swift調用JS、另外一個是Swift調用OC;
  • 我能想到的一個示例:咱們用Swift本身去解析Lottie的json文件,而後修改裏邊的值,讓其作動畫、改變寬高、顏色

3、裝飾器模式

  • 說明:動態的擴展方法、功能
  • 示例:swift中面向協議編程以及extension都是這種思想

4、外觀模式

  • 說明:減小不一樣類之間的交互,提供統一接口設計模式

  • 示例:好比獲取資源類中,須要調用本地緩存、網絡數據,實現隔離減小不一樣類之間的交互緩存

  • 代碼: https://www.raywenderlich.com/477-design-patterns-on-ios-using-swift-part-1-2#toc-anchor-007markdown

5、代理模式

  • 說明:先佔坑,後操做
  • 示例:耗時操做,圖片異步加載

6、享元模式

  • 說明:緩存系統,緩存在內存中、大量重複使用適合顆粒度較小的東西
  • 示例:未知

行爲型模式

  • 說明:經過相互通訊與協做完成某些複雜功能,一個對象在運行時也將影響到其餘對象的運行網絡

  • 關鍵字:觀察、通知、MVC、反饋、監控

  • 行爲型模式分爲類行爲型模式和對象行爲型模式兩種:

    • 類行爲型模式:類的行爲型模式使用繼承關係在幾個類之間分配行爲,類行爲型模式主要經過多態等方式來分配父類與子類的職責。
    • 對象行爲型模式:對象的行爲型模式則使用對象的聚合關聯關係來分配行爲,對象行爲型模式主要是經過對象關聯等方式來分配兩個或多個類的職責。根據「合成複用原則」,系統中要儘可能使用關聯關係來取代繼承關係,所以大部分行爲型設計模式都屬於對象行爲型設計模式。

1、命令模式

2、中介者模式

  • 說明:A、B之間不交流,經過C來完成溝通,
  • 示例:好比MVC中的 Model、View不直接交流,而是經過Controller交流;現實生活中的中介公司,乾的就是這個活,Controller處理的事情太多,會變的愈來愈複雜,臃腫,這種模式的弊端也是如此。
  • 設計模式系列3--中介者模式

3、觀察者模式

  • 說明:主動觀察到狀態改變,從而發生變化
  • 示例:KVO、Notification

4、狀態模式

  • 說明:容許一個對象在其內部狀態改變時改變它的行爲。對象看起來彷佛修改了它的類。
  • 示例:設計模式系列9--狀態模式
  • 我的理解:假如在不一樣狀態下,可能有一樣的操做,這時把狀態封裝成類,把操做定義成協議,每一個狀態類遵照這個協議,並實現。

5、策略模式

  • 說明:定義一系列算法,把它們一個個的封裝起來,而且使他們能夠相互替換。策略模式使得算法可獨立於使用它的客戶端而變化。
  • 示例1:設計模式系列8--策略模式
  • 示例2:X模塊中有個分段函數,A、B、C須要X模塊支持,可是對X模塊中的分段函數有不一樣要求,這時,你能夠在X模塊中寫if、else語句、或者switch語句,但這樣違反開閉原則,因此,更好的方式是把函數算法封裝起來,做爲參數傳進去。

參考連接:

  • https://juejin.cn/post/6844903934230806535
  • https://design-patterns.readthedocs.io/zh_CN/latest/index.html
  • https://juejin.cn/user/3526889030556574

本文使用 mdnice 排版

相關文章
相關標籤/搜索