解析iPhone MVC設(shè)計模式要點
接觸iphone的編程,就要從安裝、架構(gòu)、模式等一些知識來填充自己的編程習(xí)慣,那么本文就是講述的這些。
一、概念
MVC架構(gòu)是一個復(fù)雜的架構(gòu),其實現(xiàn)也顯得非常復(fù)雜。但是,我們已經(jīng)總結(jié)出了很多可靠的設(shè)計模式,多種設(shè)計模式結(jié)合在一起,使MVC架構(gòu)的實現(xiàn)變得相對簡單易行。Views可以看作一棵樹,顯然可以用Composite Pattern來實現(xiàn)。Views和Models之間的關(guān)系可以用Observer Pattern體現(xiàn)。Controller控制Views的顯示,可以用Strategy Pattern實現(xiàn)。Model通常是一個調(diào)停者,可采用Mediator Pattern來實現(xiàn)?,F(xiàn)在讓我們來了解一下MVC三個部分在J2EE架構(gòu)中處于什么位置,這樣有助于我們理解MVC架構(gòu)的實現(xiàn)。MVC與J2EE架構(gòu)的對應(yīng)關(guān)系是:View處于Web Tier或者說是Client Tier,通常是JSP/Servlet,即頁面顯示部分。Controller也處于Web Tier,通常用Servlet來實現(xiàn),即頁面顯示的邏輯部分實現(xiàn)。Model處于Middle
二、通信
1、Model和View永遠(yuǎn)不能相互通信,只能通過Controller傳遞。
2、Controller可以直接與Model對話(讀寫調(diào)用Model),Model通過Notification和KVO機制與Controller間接通信。
3、Controller可以直接與View對話(通過outlet,直接操作View,outlet直接對應(yīng)到View中的控件),View通過action向Controller報告事件的發(fā)生(如用戶Touch我了)。
Controller是View的直接數(shù)據(jù)源(數(shù)據(jù)很可能是Controller從Model中取得并經(jīng)過加工了)。Controller是View的代理(delegate),以同步View與Controller,delegate是一組協(xié)議,表示程序?qū)⒁蛘咭呀?jīng)處于某種狀態(tài)時,來調(diào)整View,以對用戶有個交代。例如系統(tǒng)內(nèi)存不足了,你是不是相應(yīng)的降低view的質(zhì)量以節(jié)省內(nèi)存。
注:突然冒出個delegate,讓人不好理解,其實他不對應(yīng)xcode為我們創(chuàng)建的XXAppDelegate文件,此文件不屬于MVC中的任何一部分,雖然與MVC有聯(lián)系。我發(fā)現(xiàn)蘋果文檔里說A是B的代理的時候,通常是指A中有B的引用,可以A直接操作B。
三、實作
建立一個BtnClick工程系統(tǒng),會為我們生成以下文件:
- BtnClickAppDelegate.h
- BtnClickAppDelegate.m
以上兩個文件定義了實現(xiàn)UIApplicationDelegate協(xié)議的類BtnClicAppDelegate,UIApplicationDelegate協(xié)議是系統(tǒng)預(yù)定義的協(xié)議,負(fù)責(zé)監(jiān)視應(yīng)用程序的高層行為,處理幾個關(guān)鍵系統(tǒng)消息,是應(yīng)用程序生命周期為我們預(yù)留的Hook,每個iphone應(yīng)用程序必不可少的。iphone應(yīng)用程序的生命周期:
- BtnClickViewController.h
- BtnClickViewController.m
實現(xiàn)了MVC中的Controller.可以定義一些IBOutlet元素和IBAction方法與View通信。
- @interface BtnClickViewController : UIViewController{
- IBOutlet UILabel* statusText;
- }
- @property (retain,nonatomic) UILabel *statusText;
- (IBAction)buttonPressed:(id)sender;
- @end
View對應(yīng)那個文件呢? 答案是Resource下的MainWindow.xib和BtnClickViewController.xib。MainWindow.xib文件在在應(yīng)用程序加載時是會被自動加載的,這其實是在plist文件中配置的。然后MainWindow.xib會加載子視圖BtnClickViewController.xib。
為什么會命名為ViewController,而不是分開命名?可能是因為View和Controller關(guān)系太緊密了,view就是Controller的跟班。實際編程時一定要分清MVC各部分的職責(zé)。自始至終沒見到Model的面,其實M是可選的,特別是對于簡單的應(yīng)用。任何與界面無關(guān)的,我們添加的自定義類來定義我們應(yīng)用程序的對象,都屬于Model的范疇。
【編輯推薦】