wordpress寄出郵箱地址小學(xué)生班級(jí)優(yōu)化大師
文章目錄
- 前言
- MVC架構(gòu)模式
- 基本概念
- 通信方式
- 簡(jiǎn)單應(yīng)用
- 總結(jié)
前言
“MVC”,即Model(模型),View(視圖),Controller(控制器),MVC模式是架構(gòu)模式的一種。
關(guān)于“架構(gòu)模式”:
架構(gòu)模式(Architectural Pattern)是軟件架構(gòu)中常見(jiàn)的組織結(jié)構(gòu)解決方案,用于指導(dǎo)大型軟件系統(tǒng)的設(shè)計(jì)。它們描述了軟件系統(tǒng)常見(jiàn)的組織結(jié)構(gòu)和它們之間的相互關(guān)系,為構(gòu)建復(fù)雜軟件系統(tǒng)提供了經(jīng)驗(yàn)證的解決方案。架構(gòu)模式提供了一種通用的、可重用的解決方案來(lái)處理在軟件設(shè)計(jì)中遇到的常見(jiàn)問(wèn)題。
常見(jiàn)的架構(gòu)模式包括:
1.分層模式(Layered Pattern):
將系統(tǒng)分割成多個(gè)層次,每一層提供特定的服務(wù),并且只與相鄰層次通信。例如,一個(gè)典型的三層架構(gòu)包括表示層(用戶界面)、業(yè)務(wù)邏輯層和數(shù)據(jù)訪問(wèn)層。
2.客戶端-服務(wù)器模式(Client-Server Pattern):
系統(tǒng)分為兩部分:服務(wù)器提供服務(wù),客戶端請(qǐng)求服務(wù)。這種模式廣泛應(yīng)用于網(wǎng)絡(luò)應(yīng)用程序。
3.模型-視圖-控制器模式(Model-View-Controller Pattern, MVC):
用于實(shí)現(xiàn)用戶界面的分離關(guān)注點(diǎn),將應(yīng)用程序分為三個(gè)核心組件:模型(數(shù)據(jù)和業(yè)務(wù)邏輯)、視圖(用戶界面)和控制器(業(yè)務(wù)邏輯和用戶界面之間的通信)。
4.管道-過(guò)濾器模式(Pipeline-Filter Pattern):
在這種模式中,每個(gè)處理步驟(過(guò)濾器)作為數(shù)據(jù)流(管道)中的一個(gè)階段,數(shù)據(jù)流從一個(gè)過(guò)濾器流向下一個(gè)過(guò)濾器。
5.事件驅(qū)動(dòng)架構(gòu)模式(Event-Driven Pattern):
系統(tǒng)作為一系列異步事件和回調(diào)處理函數(shù)的集合。這種模式適用于需要高響應(yīng)性和可伸縮性的應(yīng)用。
6.微內(nèi)核模式(Microkernel Pattern):
系統(tǒng)的核心功能由一個(gè)小型的、可擴(kuò)展的內(nèi)核提供,其他功能則作為插件或模塊附加在內(nèi)核周圍。
7.代理模式(Proxy Pattern):
為其他對(duì)象提供一個(gè)代理或占位符,以控制對(duì)這個(gè)對(duì)象的訪問(wèn)。這在遠(yuǎn)程代理、虛擬代理和保護(hù)代理中很常見(jiàn)。
8.發(fā)布-訂閱模式(Publish-Subscribe Pattern):
一種事件驅(qū)動(dòng)的通信模式,發(fā)布者發(fā)送事件,而訂閱者對(duì)這些事件做出響應(yīng),但發(fā)布者和訂閱者之間沒(méi)有直接的聯(lián)系。
9.黑板模式(Blackboard Pattern):
多個(gè)模塊或組件通過(guò)一個(gè)共享的數(shù)據(jù)空間(黑板)進(jìn)行通信和協(xié)作,以解決復(fù)雜問(wèn)題。
10.MVC的變體模式:
包括表現(xiàn)層-業(yè)務(wù)邏輯層-數(shù)據(jù)訪問(wèn)層(Presentation-Logic-Data Access, PLDA)、模型-視圖-視圖模型(Model-View-ViewModel, MVVM)和模型-視圖-適配器(Model-View-Adapter, MVA)等。
MVC架構(gòu)模式
基本概念
‘M’——模型(Model):視圖類所需要的數(shù)據(jù),例如:表格需要顯示的文字。
‘V’——視圖(View):屏幕上顯示的UI,響應(yīng)用戶事件,接受用戶輸入。例如:按鈕,標(biāo)簽,進(jìn)度條等。
‘C’——控制器(Controller):連接視圖類和模型類,任務(wù)是使數(shù)據(jù)顯示在屏幕上,主要負(fù)責(zé)轉(zhuǎn)發(fā)請(qǐng)求,對(duì)請(qǐng)求進(jìn)行處理。例如:控制器將表格需要使用的數(shù)據(jù)“填入”表格視圖中,將表格視圖顯示出來(lái)。
關(guān)于這三者的關(guān)系,我參考了如下圖例來(lái)理解:
斯坦福大學(xué)的iOS公開(kāi)課第一課:
蘋果官方的圖解:
在這里可以看出來(lái)“V”和“M”是相互獨(dú)立的,在iOS開(kāi)發(fā)的MVC框架中,我們可以理解為view和model相互獨(dú)立,兩者屬于不知道對(duì)方的存在的陌生人關(guān)系。
??Model 和 View 是相互獨(dú)立的
這是很容易犯錯(cuò)的一點(diǎn),因?yàn)镸VC 架構(gòu)模式是在軟件設(shè)計(jì)中通用的,不只是iOS 開(kāi)發(fā)。iOS 開(kāi)發(fā)中的MVC模式是基于傳統(tǒng)的MVC 架構(gòu)的,只是在具體實(shí)現(xiàn)上有所不同。Apple 官方對(duì)于iOS開(kāi)發(fā)中的MVC 模式和傳統(tǒng)的MVC 架構(gòu)有所不同,如果查閱傳統(tǒng)的MVC 架構(gòu)會(huì)發(fā)現(xiàn),View 和Model 之間是有通信的。
(轉(zhuǎn)自 SungKaikai 文章鏈接)
通信方式
- 控制器C可以直接訪問(wèn)模型M:將模型直接作為控制器的屬性。
- 控制器C可以直接訪問(wèn)視圖V:將視圖直接作為控制器的屬性。
- 模型M與視圖V無(wú)法直接訪問(wèn)對(duì)方:二者完全解耦,不能引用對(duì)方,把對(duì)方設(shè)置為屬性。
- 視圖V到控制器C的通信:
目標(biāo)動(dòng)作機(jī)制(target - action):用戶與視圖交互觸發(fā)控制器的方法。例如:點(diǎn)擊按鈕后實(shí)現(xiàn)視界面跳轉(zhuǎn),網(wǎng)絡(luò)請(qǐng)求,刷新UI等。
委托機(jī)制(delegate):視圖向控制器詢問(wèn)某些自己無(wú)法決定的事情,或是讓控制器幫助自己做一些自己獨(dú)立無(wú)法完成的事情。 因?yàn)榭刂破鞑攀钦莆杖值慕巧?#xff0c;很多時(shí)候視圖是無(wú)法自己做決定的。例如:表格問(wèn)控制器:我可以滾動(dòng)么?然后控制器給予回答告知是否可以繼續(xù)滾動(dòng)。 如果表格的高度很小,那么就可以不讓它滾動(dòng)。但是如果表格的高度已經(jīng)超過(guò)了屏幕的高度,這時(shí)候如果讓它自作主張無(wú)法滾動(dòng)就不好了。
數(shù)據(jù)源機(jī)制(dataSource):視圖讓控制器給它將要顯示的數(shù)據(jù)。例如:音樂(lè)的數(shù)據(jù)存在于模型里,控制器訪問(wèn)模型,從模型里拿到數(shù)據(jù)后告訴視圖如何顯示出歌曲。 - 模型M到控制器C的通信
廣播機(jī)制(Notification):控制器注冊(cè)監(jiān)聽(tīng)某模型數(shù)據(jù)變化的廣播頻道,當(dāng)此模型數(shù)據(jù)變化后向該控制器發(fā)送廣播,告知模型變化情況。
KVO機(jī)制(Key-Value Observing):模型作為控制器的屬性,當(dāng)模型屬性被修改后,持有此模型屬性的控制器就會(huì)收到通知。
——斯坦福大學(xué)iOS開(kāi)發(fā)公開(kāi)課總結(jié)(一):iOS的MVC框架
簡(jiǎn)單應(yīng)用
先看看創(chuàng)建的文件:
1.創(chuàng)建 Model
模型通常是一個(gè)或多個(gè)類,它們包含數(shù)據(jù)和對(duì)數(shù)據(jù)進(jìn)行操作的方法。例如,一個(gè)簡(jiǎn)單的Person測(cè)試模型:
#import <Foundation/Foundation.h>NS_ASSUME_NONNULL_BEGIN@interface TestModel : NSObject@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSNumber *age;- (void)performAction;@endNS_ASSUME_NONNULL_END
#import "TestModel.h"@implementation TestModel- (void)performAction {// 這里可以放置一些業(yè)務(wù)邏輯,例如打印一條消息NSLog(@"Hello, my name is %@ and I am %@ years old.", self.name, self.age);
}@end
這里的代碼存在一些bug,后續(xù)筆者修改后會(huì)再呈現(xiàn)完整代碼。
總結(jié)
在模型類里是不能調(diào)用控制器的方法的,模型類只能被控制器調(diào)用并且當(dāng)所擁有的數(shù)據(jù)改變后通知使用自己的控制器數(shù)據(jù)的改變。更不能直接給視圖通知讓視圖自己更新UI。
參考文章:iOS 架構(gòu)設(shè)計(jì)代碼實(shí)例學(xué)習(xí)-MVC 模式
????? 你真的了解MVC嗎?