讀書筆記-經常使用設計模式之MVC

一、MVC(Model-View-Controller,模型-視圖-控制器)模式是至關古老的設計模式之一,它最先出如今SmallTalk語言中。MVC模式是一種複合設計模式,由「觀察者」(Observer)模式、「策略」(Strategy)模式和「合成」(Composite)模式等組成。MVC模式由3個部分組成,如圖設計模式

模型:保存應用數據的狀態,迴應視圖對狀態的查詢,處理應用業務邏輯,完成應用的功能,將狀態的變化通知視圖。框架

視圖:爲用戶展現信息並提供接口。用戶經過視圖向控制器發出動做請求,而後再向模型發出查詢狀態的申請,而模型狀態的變化會通知給視圖。atom

控制器:接收用戶請求,根據請求更新模型。另外,控制器還會更新所選擇的視圖做爲對用戶請求的迴應。控制器是視圖和模型的媒介,能夠下降視圖和模型的耦合度,使視圖和模型的權責更加清晰,從而提升開發效率。spa

對應哲學中的「內容」與「形式」,在MVC模型中,模式是「內容」,它存儲了視圖所須要的數據。視圖是「型式」,是外部表現方式,而控制器是它們的媒介。設計

二、上面咱們討論的是通用的MVC模式,而Cocoa和Cocoa Touch框架中的MVC模式與傳統的MVC模式略有不一樣,前者的模型與視圖不能進行任何通訊,全部的通訊都是經過控制器完成的,以下圖。3d

 

接下來咱們經過一個案例來分析Cocoa Touch中MVC模式的運做過程,案例界面如上圖(中)。code

打開MVCSample工程,其中包括的文件有AppDelegate.h、AppDelegate.m、ViewController.h、ViewController.m和MainStoryboard.storyboard。server

AppDelegate是應用程序委託對象,ViewController是視圖控制器,但沒有看到視圖和模型。打開故事板文件,能夠看到ViewController Scene(上圖右),就能看到View,其中直接使用了UIKit框架中的UIView,所以在MVCSample組中沒有視圖,屬於視圖的還有Button和Text Field,他們是View的子視圖。那麼模型對象在哪呢?模型對象很特殊,起本質是視圖的「數據」。Text Field輸入的內容,Button上的便籤,均可以說是模型,可是模型與視圖同樣,有時候咱們未必須要本身建立一個模型類。所以咱們作開發工做時,主要是編寫視圖控制器。下面咱們看看視圖控制器ViewController.h文件的代碼:對象

1 @interface ViewController : UIViewController<UITextFieldDelegate>
2 
3 @property (weak, nonatomic) IBOutlet UIButton *myButton;
4 @property (weak, nonatomic) IBOutlet UITextField *myTextField;
5 - (IBAction)myAction:(id)sender;
6 
7 @end

能夠看到,ViewController.h爲兩個空間myButton和myTextField定義了兩個IBOutlet(輸出口)類型的屬性。由於要經過視圖控制器更新這些視圖(控件也屬於視圖),因此咱們須要把這些視圖定義成輸出口類型的屬性。blog

此外,ViewController.h還定義了 - (IBAction)myAction:(id)sender; 方法以相應myButton按鈕的觸摸事件。該方法的返回類型是IBAction(動做事件),這說明該方法能夠相應控制事件的。

另外,ViewController還實現了UITextFieldDelegate協議,這樣ViewController就變成了UITextField空間的委託對象,它們之間的運做關係如圖:

①當用戶觸摸myButton的時候會觸發ViewController中的  - (IBAction)myAction:(id)sender 方法。

②視圖控制器會實現一些空間委託和數據源協議,這要看具體的控件。在此案例中,ViewController實現了UITextFiledDelegate協議,其中定義了一些相應UITextField事件的方法。

③視圖控制器經過屬性myButton和myTextField來改變控件的狀態。

④模型對象能夠經過通知和KVO機制來通知數據的變化。

⑤視圖控制器能夠保存一個模型成員變量或屬性,並經過它們改變模型的狀態。

 

資料:《iOS開發指南》

相關文章
相關標籤/搜索