iOS 架構(gòu)模式<demo解析>

架構(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)系


MVC.jpeg

MVP

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


MVP.jpeg

Demo解析

首先要聲明, MVP是有Controller的

  1. 首先我們來創(chuàng)建幾個(gè)類, Presenter類, MVPView類, MVPModel類
  2. 在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處理---稍后處理
  1. 在MVPModel中定義屬性
@property (nonatomic,copy)NSString *content;
  1. 在MVPView并不可以提取數(shù)據(jù), 因?yàn)樵贛VP模式中我們的V和M是沒有直接聯(lián)系的, 所以這里我們提供一個(gè)方法, 給我們的Presenter類
- (void)showView: (NSString *)content;
  1. 此時(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];
}
  1. 在MVPView類處理view的UI
- (instancetype)init
{
self = [super init];
if (self) {
//此處我們進(jìn)行初始化
}
return self;
}
- (void)showView: (NSString *)content{
//方法數(shù)據(jù)處理, 此處我寫的是偽代碼和思路
//self.label.text = content;

}
  1. 在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)系


MVVM.jpeg

Demo解析

這里我們也通過一個(gè)小Demo來簡(jiǎn)單理解一下, 不過多的去說繞來繞去的東西, 直接上代碼, 在開發(fā)中實(shí)際應(yīng)用

  1. 首先我們來創(chuàng)建幾個(gè)類, MVVMModel類, MVVMView類, MVVMViewModel類
  2. 在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)模式";
  1. 在MVVMModel中定義屬性
@property (nonatomic,copy)NSString *content;
  1. 在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]
}];
  1. 此時(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;
}

  1. 在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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容