《Objective-C編程之道:iOS設計模式解析》學習筆記——第1章第1章:你好,設計模式一:模型、視圖、控制器(MVC)
模型:
模型對象維護應用程式的資料,並定義操作資料的特定邏輯。模型對象可以複用,因為它表示的知識適用於特定的問題領域。例如,模型對象可以表示複雜的資料結構,對應於使用者在螢幕上所畫的圖形,或者僅僅表示待辦事項應用程式中的一條待辦事項。
視圖:
視圖對象可以響應使用者操作,並懂得如何將自己展現在螢幕上。視圖對象通常從應用程式的模型對象擷取資料用以展示。它可以跟一個模型對象的部分、整體或者多個模型對象合作。通常,使用者可以通過它修改資料。
控制器:
控制器對象就像視圖對象和模型對象的中間人。作為中間人或協調人,它建立起溝通渠道,使視圖得以知曉模型的更變而給予響應。
二:作為複合設計模式的MVC
MVC本身並不是最基本的設計模式,它包含了若干更加基本的設計模式。
Cocoa(Touch)的MVC用到的模式有:
- 組合——視圖對象之間以協作的方式構成一個視圖層次體系,其中既可以有複合視圖(比如表格視圖),也可以有獨立視圖(比如文字框或按鈕)。每個層次的每個視圖節點都可以響應使用者的操作並把自己繪製到螢幕上。
- 命令——這是一種“目標-動作”機制,視圖對象可以延遲其他對象(比如控制器)的執行,讓其他對象等到發生了某些時間後再執行。這一機制構成了命令模式。
- 中介者——控制器對象起著中間人的作用,而這個中間人則採用了中介者模式,它構成了在模型和視圖對象之間傳遞資料的雙向通道。應用程式的控制器對象將模型的變更傳達給視圖對象。
- 策略——控制器可以使視圖對象的一個“策略”。視圖對象將自身隔離,以期維持其作為資料展示器的唯一職責,而將一切應用程式特有的介面行為的決定委派給它的“策略”對象(既控制器)。
- 觀察者——模型對象向它所關注的控制器等對象發出內部狀態變化的通知。
三:影響著設計模式的設計原則
設計模式是經時間證明為有效,對特定物件導向設計問題主要方面的一種抽象,體現了物件導向設計的重要思想。有些設計原則影響著設計模式。這些原則是構建可複用、可維護的物件導向應用程式的經驗法則:
- 針對介面編程而不是針對實現編程。
- 優先使用對象組合而不是類繼承。
四:設計原則的優缺點
針對介面編程的好處:
- 只要對象符合用戶端所要求的介面,用戶端就不必在意所使用的確切類型。
- 用戶端只知道定義介面的協議或者抽象類別,因此用戶端就不必在意所使用的確切類型。
類繼承的優缺點:(白箱複用)
優點:
- 類繼承簡單直接,因為關係在編譯時間靜態定義。
- 被複用的實現易於修改
缺點:
- 因為類繼承在編譯時間定義,所以無法在運行時變更從父類繼承來的實現。
- 子類的部分描述常常定義在父類中。
- 子類直接面對父類實現的細節,因此破壞了封裝。
- 父類實現的任何變更都會強制子類也進行變更,因為它們的實現聯絡在了一起。
- 因為在新的問題情境下繼承來的實現已淘汰或不適用,所以必須重寫父類或繼承來的實現。
對象組合的優缺點:(黑箱複用)
優點:
- 不會破壞封裝,因為只通過介面來訪問對象。
- 大大減少實現的依存關係,因為對象的實現是通過介面來定義的。
- 可以在運行時將任意對象替換為其他同類型的對象。
- 有助於保持類的封裝以專註於單一任務。
- 類及其階層能保持簡潔,不至於過度膨脹而無法管理。
缺點:
- 設計中涉及較多個物件。
- 系統的行為將依賴於不同對象之間的關係,而不是定義於單個類中。
- 理想情況下,不需要建立新的組件就能實現複用;十分罕見的情況是,通過對象組合的方式,僅僅對已有的組件進行組合就能得到所需的全部功能;實際上,現成的組件總是不太夠用。
- 儘管有以上缺點,對象組合仍然對系統設計有諸多好處。我們可以通過在某些部分使用類繼承來克服這些缺點,使得利用已有組件建立新的組件較為容易。
- 優先使用對象組合而不是類繼承,並不是說完全不使用類繼承。需要根據具體情況對如何複用類和對象作出清晰的判斷。