1 前言
有些人可能會問,我也能實現某某功能,為什麼要花時間來學習設計模式。今天我們就來了解一下設計模式的優勢:
程序(包括對象和類),如果在設計中使用了設計模式,將來將更易於復用與擴展,更易於變更。而且基於設計模式的程序會更加簡潔而高效,因為達到同樣目的的所需代碼行數會更少。
接下來就讓我們一起走入神奇的設計模式的世界來體會其給我們帶來便利。
2 詳述
記得之前文章我們介紹了Cocoa Touch的MVC模式,而他並非最基本的設計模式,它包含了若干更加基本的設計模式:組合(Composite),命令(Command),中介者(Mediator),策略(Strategy)和觀察者(Observe)。
2.1 幾種常見設計模式介紹
2.1.1 組合:
視圖對象之間以協作的方式構成一個視圖層次體系,其中既可以有復合視圖(比如表格視圖),也可以有獨立視圖(比如文本框或按鈕)。每個層次的每個視圖節點都可以影響用戶的操作並把自己繪制到屏幕上。
2.1.2 命令:
這是一種“目標-動作”機制,視圖對象可以推遲其他對象(比如控制器)的執行,讓其他對象等到發生了某些事件後再執行。
2.1.3 中介者:
控制器對象起著中間人的作用,它構成了在模型和視圖對象之間傳遞數據的雙向通道。應用程序的控制器對象將模型的變更傳達給視圖對象。
2.1.4 策略:
控制器是視圖對象的一個“策略”,視圖對象將自身隔離,以期維持其作為數據展示器的唯一職責,而將一切應用程序特有的界面行為的決定委派給它的“策略”對象(即控制器)。
2.1.5 觀察者:
模型對象向它所關注的控制器等對象發出內部狀態變化的通知。
2.2 協議與抽象類
2.2.1 針對接口編程
針對接口編程,而不是針對實現編程。
接口繼承與類繼承:
接口繼承(子類型化):讓我們可以用一個對象代替另一個對象。
類繼承:通過復用父類的功能或者只是簡單的共享代碼和表述,來定義對象的實現和類型的一種機制。
定義具有相同接口的類群很重要,因為多態是基於接口的。Objective-C種有一種,確定了客戶端同所用的具體類之間的一種“合約”的東西,叫做協議(protocol)。協議也是對象之間的一種合約,但是本身不能實例化偉對象。實現協議或者從抽象類繼承,使得對象共享相同的接口。
通常的做法是:在客戶端的代碼中不聲明特定具體類的變量,而只是使用協議或者抽象類定義的接口。
2.2.2 @protocol與抽象基類
協議的語法為@protocol,並不定義任何實現,而只是聲明方法(method),以確定符合協議的類的行為。只定義了抽象行為的“接口”。實現協議的類定義這些方法的實現,以執行真正的操作。
另一種定義高度抽象類型的方法是定義抽象基類(Abstract Base Class,ABC)。通過抽象基類,我們可以生成一些其他自雷可以共享的默認行為。
協議中可以用@optional指令(directive)將協議部分方法變更為“可選的”。
如果客戶端要使用由協議所定義類型的對象,比如有個協議叫Mark,則需要使用:
id<Mark>thisMark;
如果Mark被聲明為抽象基類,那麼語法應該分其他類一樣:
Mark* thisMark;
Objective-C不支持多重繼承,所以要用協議來進行擴展。
優先使用協議而不是類繼承。
3 結語
作為開篇文章,我不想做太多的贅述,就先介紹這麼多剩下的我們慢慢來研究,希望對大家有所幫助。