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