一直想寫一系列關於設計模式的文章,一直以爲本身理解不夠,遲遲不能動筆。固然,如今動筆也不表明着理解透徹了,只是但願記錄下一些看書的重點和本身的理解,以便重複翻閱,也但願能和其餘開發者探討交流。 本系列文章是根據《Objective-C 編程之道》總結的,想仔細研讀的能夠去看該文章。這本書寫得不錯,就是年代比較久遠,用的仍是MRC,一些寫法仍是比較舊的,不過關於設計模式這塊,仍是講得淺顯易懂的。html
設計模式是爲特定場景下的問題而定製的解決方案。設計模式是對特定面向對象設計問題主要方面的一種抽象,體現了面向對象設計的重要思想。在程序設計中使用了設計模式,未來就更易於複用與擴展,更易於變動。算法
有人常把架構模式和設計模式混在一塊兒,好比MVC就屬於架構模式。在MVC中,對象在應用程序中被分紅三組,分別扮演模型、視圖和控制器,它決定了對象或類的職責(應該屬於MVC這三組中的哪一組),它包含了若干基礎的設計模式,好比cocoa的MVC用到的模式有:組合(視圖層次體系)、命令(target-action機制)、中介者(控制器)、策略(控制器)、觀察者(通知)。編程
影響設計模式有六大原則,這些原則是構建可複用、可維護的面向對象應用程序的經驗法則。這邊我不打算細說,不少原則(或者說思想)咱們一直在默默遵照,好比職責單一原則、開閉原則,想具體瞭解能夠看下這篇文章設計模式六大原則。設計模式
這邊我主要討論兩個問題(或者說原則):架構
在OC中針對接口編程有兩種方式:
1)抽象基類。 抽象基類能夠生成其餘子類能夠共享的默認行爲,抽象基類與一般的類類似,只是預留了一些能夠或應該由子類重載的行爲。
2)協議。 協議只是定義抽象行爲的「接口」,實現協議的類定義這些方法的實現。性能
實現協議或者從抽象類繼承,使得對象共享相同的接口。子類型的全部對象均可以針對協議或抽象類的接口的請求作出應答。
這樣作有如下兩點好處:
1)只要對象符合客戶端所要求的接口,客戶端就沒必要在乎所使用對象的確切類型。
2)客戶端只知道定義接口的協議或者抽象類,所以客戶端對對象的類一無所知。ui
經過給程序的變更部分定義接口而對其封裝和隔離,這些部分的變更就獨立於程序的其餘部分,由於它們不依賴於任何細節。之後就能夠變動或拓展這些可變的部分而不影響程序的其餘部分。程序將所以可以更靈活而可靠地進行變動,由於咱們消除了部分與部分之間的依賴關係並減小了耦合。 因此說,在考慮設計模式的時候,必定要將設計模式的變化點搞清楚,而不只僅是考慮設計模式的場景、實現方式以及類和對象之間的耦合關係,這樣纔不會致使設計模式的濫用,以致於該變化的沒變化,不應變化的常常變化。設計
固然,具體選擇協議或者抽象基類應該根據實際場景去衡量。在多繼承的方案中(OC不支持多繼承),咱們能夠爲不須要子類化其餘類的類定義一個抽象基類,而後能夠定義一個同名協議,讓包括這個抽象基類在內的其餘類去實現。(例:NSObject基類又遵照NSObject協議)。code
在拓展功能的時候,咱們有兩種方案:對象組合和類繼承。
類繼承(子類化)讓咱們可使用其餘類來定義類的實現。子類化常被稱爲白箱複用,由於父類的內部描述與細節一般對子類可見。
對象組合能夠替代類繼承。對象組合要求被組合的對象具備定義良好的接口,而且經過從其餘對象獲得的引用在運行時動態定義。因此能夠將對象組合到其餘對象上,以構建更加複雜的功能。因爲對象的內部細節對其餘對象不可見,這種類型的複用被稱爲黑箱複用。cdn
使用類繼承和對象組合的複用各有優缺點:
類繼承
優勢:
類繼承簡單直接,由於關係在編譯時靜態定義,被複用的實現也易於修改。
缺點:
和子類的耦合度過高,父類實現的任何變動都會強制子類進行變動。子類直接面對父類實現的細節,所以破壞了封裝性。
對象組合
優勢:
不會破壞封裝性,由於只經過接口來訪問對象。大大減小實現的依存關係,由於對象的實現是經過接口來定義的。有助於保持類的封裝以專一單一任務,類及其層次結構可以保持整潔,不至於過分膨脹。
缺點:
設計涉及對象較多,系統的行爲與不一樣對象的關係,而不是定義在單個類中。
因此說,類繼承不能被濫用,針對類繼承的討論能夠看下casa的這系列文章 跳出面向對象思想(一) 繼承。
優先使用對象組合而不是類繼承並非說不能使用類繼承,須要根據具體狀況對如何複用類和對象做出清晰的判斷。若是系統設計得合理,類繼承與對象組合能夠相互配合。設計類時,優先考慮對象組合,而後尋找出冗餘行爲,進行設計細化(若是找到冗餘行爲意味着此處應該使用類繼承)。
在《Objective-C 編程之道》中,將設計模式分紅了八種類型。咱們須要根據特定的場景和需求來選擇設計模式。好比,當須要建立對象時,不是隨意New一個,而是考慮下耦合性,可擴展性,使用場景等等,來選擇合適的設計模式。
####待更新
iOS設計模式 ─── 對象去耦
iOS設計模式 ─── 接口適配
iOS設計模式 ─── 抽象集合
iOS設計模式 ─── 行爲拓展
iOS設計模式 ─── 算法封裝
iOS設計模式 ─── 性能與對象訪問
iOS設計模式 ─── 對象狀態