架構(gòu)模式
原文鏈接 : 鏈接
一個(gè)整體的分層? 邏輯清晰? 還是清晰的分工? 對(duì)于架構(gòu)模式來說并沒有一個(gè)非常明確的定義, 比較抽象, 在于設(shè)計(jì)在于架構(gòu), 不管是小到類與類之間的交互, 還是不同的小模塊, 小版塊之間, 甚至于在不同的業(yè)務(wù)之間, 我們都可以去從架構(gòu)的方面去理解, 去分析
基本的架構(gòu)基礎(chǔ)
那么我們平時(shí)開發(fā)用到的代理, block當(dāng)然也是起到解耦合, 使代碼的耦合度降低, 通知可以解決兩者之間的相互引用并且實(shí)現(xiàn)解耦合
那么在iOS中常見的架構(gòu)來說, 常見有哪些呢? MVC架構(gòu), MVP架構(gòu), MVVM架構(gòu)
當(dāng)然這些架構(gòu)都有一個(gè)共同特點(diǎn): 解耦合
MVC
本身來說View和Model, 但是在實(shí)際開發(fā)使用的時(shí)候, 還是有聯(lián)系的, 這個(gè)平時(shí)開發(fā)的比較多, 下圖是我簡(jiǎn)單畫的一個(gè)關(guān)系圖, 說明了三者之間的關(guān)系

MVP
下圖畫的一個(gè)簡(jiǎn)單的關(guān)系圖, 那么我們根據(jù)這個(gè)簡(jiǎn)單的關(guān)系圖用一個(gè)簡(jiǎn)單的demo來演示MVP是怎么進(jìn)行兩者中的關(guān)系處理的
面向接口編程

Demo解析
首先要聲明, MVP是有Controller的
- 首先我們來創(chuàng)建幾個(gè)類, Presenter類, MVPView類, MVPModel類
- 在Controller導(dǎo)入類, 初始化
_presenter = [[Presenter alloc]init];
_mvpView = [[MVPView alloc]init];
_mvpView.frame = self.view.bounds;
[self.view addSubview:_mvpView];
_mvpModel = [[MVPModel alloc]init];
//model處理---稍后處理
- 在MVPModel中定義屬性
@property (nonatomic,copy)NSString *content;
- 在MVPView并不可以提取數(shù)據(jù), 因?yàn)樵贛VP模式中我們的V和M是沒有直接聯(lián)系的, 所以這里我們提供一個(gè)方法, 給我們的Presenter類
- (void)showView: (NSString *)content;
- 此時(shí)我們來處理Presenter, 在Presenter類中聲明model和view屬性, 并且來增加一個(gè)方法
聲明
@property (nonatomic,strong)MVPModel *model;
@property (nonatomic,strong)MVPView *view;
- (void)usageLogic;
實(shí)現(xiàn), 那么我們?cè)谶@里進(jìn)行一個(gè)數(shù)據(jù)的中間處理
- (void)usageLogic{
NSString *content = self.model.content;
//通過Presenter將model賦值
[self.view showView:content];
}
- 在MVPView類處理view的UI
- (instancetype)init
{
self = [super init];
if (self) {
//此處我們進(jìn)行初始化
}
return self;
}
- (void)showView: (NSString *)content{
//方法數(shù)據(jù)處理, 此處我寫的是偽代碼和思路
//self.label.text = content;
}
- 在Controller中處理未處理的model賦值處理
_mvpModel.content = @"MVP模式";
// model還沒賦值---->此處在view中的是偽代碼,只需要在view根據(jù)偽代碼直接處理
_presenter.model = _mvpModel;
_presenter.view = _mvpView;
[_presenter usageLogic];
MVP總結(jié)
假如說我們需要處理點(diǎn)擊事件, 那么可以在View中使用代理, 或者block, 之前使用MVC使用C來遵守協(xié)議, 那么MVP的話是怎樣處理, 在P中來實(shí)現(xiàn)的, 邏輯處理是在P中來處理的, 此處MVP中的遵守協(xié)議一般情況下寫在P中
好了, 給大家這個(gè)簡(jiǎn)單demo, 當(dāng)然在代碼中也寫了注釋, 可以去我的git下載, 歡迎star
下載鏈接 : demo地址
MVVM
下圖是我簡(jiǎn)單畫的一個(gè)關(guān)系圖, 說明了三者之間的關(guān)系

Demo解析
這里我們也通過一個(gè)小Demo來簡(jiǎn)單理解一下, 不過多的去說繞來繞去的東西, 直接上代碼, 在開發(fā)中實(shí)際應(yīng)用
- 首先我們來創(chuàng)建幾個(gè)類, MVVMModel類, MVVMView類, MVVMViewModel類
- 在Controller導(dǎo)入類, 初始化
self.mvvmview = [[MVVMView alloc]init];
self.viewModel = [[MVVMViewModel alloc]init];
self.mvvmview.frame = self.view.bounds;
[self.view addSubview:self.mvvmview];
//model處理--稍后處理
self.model = [[MVVMModel alloc]init];
self.model.content = @"MVVM架構(gòu)模式";
- 在MVVMModel中定義屬性
@property (nonatomic,copy)NSString *content;
- 在MVVMView并中定義viewModel屬性
聲明
@property (nonatomic, strong) MVVMViewModel *vm;
- (void)showView:(MVVMViewModel *)viewModel;
實(shí)現(xiàn), 傳入
//實(shí)現(xiàn)
[self.KVOController observe:viewModel keyPath:@"contentStr" options:NSKeyValueObservingOptionInitial||NSKeyValueObservingOptionNew block:^(id _Nullable observer, id _Nonnull object, NSDictionary<NSKeyValueChangeKey,id> * _Nonnull change) {
//此處使用的是偽代碼
//實(shí)現(xiàn)雙向綁定
//_label.text = change[NSKeyValueChangeNewKey]
}];
- 此時(shí)我們來處理MVVMViewModel, 在MVVMViewModel類中中介字符, 并且來增加一個(gè)方法
聲明
@property (nonatomic,copy)NSString *contentStr;
@property (nonatomic,strong)MVVMModel *model;
- (void)setWithModel:(MVVMModel *)model;
實(shí)現(xiàn), 那么我們?cè)谶@里進(jìn)行一個(gè)數(shù)據(jù)的中間處理
- (void)setWithModel:(MVVMModel *)model{
self.model = model;
self.contentStr = self.model.content;
}
- 在Controller中處理未處理的model賦值處理
//model處理--稍后處理
self.model = [[MVVMModel alloc]init];
self.model.content = @"MVVM架構(gòu)模式";
[_viewModel setModel:_model];
[_mvvmview showView:_viewModel];
MVVM總結(jié)
響應(yīng)式編程
也是由MVC來演變過來的, 和MVC相比的話, 我們的V取代了C中的業(yè)務(wù)邏輯處理, ViewModel并不是單純的業(yè)務(wù)邏輯類, 和我們的View和Model是相互關(guān)聯(lián)的, 并且進(jìn)行了雙向的綁定
假如說我們要添加點(diǎn)擊事件,我們可以在ViewModel中來處理點(diǎn)擊方法邏輯, 然后在我們View中導(dǎo)入ViewModel, 在View中點(diǎn)擊調(diào)用點(diǎn)擊方法的具體邏輯就可以了
好了, 給大家這個(gè)簡(jiǎn)單demo, 當(dāng)然在代碼中也寫了注釋, 可以去我的git下載, 歡迎star
下載鏈接 : demo地址
技術(shù)交流q群150731459