iOS 架构模式Demo解析

来源:互联网 发布:三砖淘宝店铺 编辑:程序博客网 时间:2024/06/06 10:05

架构模式

一个整体的分层? 逻辑清晰? 还是清晰的分工? 对于架构模式来说并没有一个非常明确的定义, 比较抽象, 在于设计在于架构, 不管是小到类与类之间的交互, 还是不同的小模块, 小版块之间, 甚至于在不同的业务之间, 我们都可以去从架构的方面去理解, 去分析

基本的架构基础

那么我们平时开发用到的代理, block当然也是起到解耦合, 使代码的耦合度降低, 通知可以解决两者之间的相互引用并且实现解耦合
那么在iOS中常见的架构来说, 常见有哪些呢? MVC架构, MVP架构, MVVM架构
当然这些架构都有一个共同特点: 解耦合

MVC

本身来说View和Model, 但是在实际开发使用的时候, 还是有联系的, 这个平时开发的比较多, 下图是我简单画的一个关系图, 说明了三者之间的关系


MVC.jpeg

MVP

下图画的一个简单的关系图, 那么我们根据这个简单的关系图用一个简单的demo来演示MVP是怎么进行两者中的关系处理的
面向接口编程


MVP.jpeg

Demo解析

首先要声明, MVP是有Controller的

  1. 首先我们来创建几个类, Presenter类, MVPView类, MVPModel类

  2. 在Controller导入类, 初始化

_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并不可以提取数据, 因为在MVP模式中我们的V和M是没有直接联系的, 所以这里我们提供一个方法, 给我们的Presenter类

- (void)showView: (NSString *)content;
  1. 此时我们来处理Presenter, 在Presenter类中声明model和view属性, 并且来增加一个方法
    声明

@property (nonatomic,strong)MVPModel *model;@property (nonatomic,strong)MVPView *view;- (void)usageLogic;

实现, 那么我们在这里进行一个数据的中间处理

- (void)usageLogic{NSString *content = self.model.content;//通过Presenter将model赋值[self.view showView:content];}
  1. 在MVPView类处理view的UI

- (instancetype)init{self = [super init];if (self) {//此处我们进行初始化}return self;}- (void)showView: (NSString *)content{//方法数据处理, 此处我写的是伪代码和思路//self.label.text = content;}
  1. 在Controller中处理未处理的model赋值处理

_mvpModel.content = @"MVP模式";// model还没赋值---->此处在view中的是伪代码,只需要在view根据伪代码直接处理_presenter.model = _mvpModel;_presenter.view = _mvpView;[_presenter usageLogic];

MVP总结

假如说我们需要处理点击事件, 那么可以在View中使用代理, 或者block, 之前使用MVC使用C来遵守协议, 那么MVP的话是怎样处理, 在P中来实现的, 逻辑处理是在P中来处理的, 此处MVP中的遵守协议一般情况下写在P中
好了, 给大家这个简单demo, 当然在代码中也写了注释, 可以去我的git下载, 欢迎star

MVVM

下图是我简单画的一个关系图, 说明了三者之间的关系

MVVM.jpeg

Demo解析

这里我们也通过一个小Demo来简单理解一下, 不过多的去说绕来绕去的东西, 直接上代码, 在开发中实际应用

  1. 首先我们来创建几个类, MVVMModel类, MVVMView类, MVVMViewModel类

  2. 在Controller导入类, 初始化

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架构模式";
  1. 在MVVMModel中定义属性

@property (nonatomic,copy)NSString *content;
  1. 在MVVMView并中定义viewModel属性
    声明

@property (nonatomic, strong) MVVMViewModel *vm;- (void)showView:(MVVMViewModel *)viewModel;

实现, 传入

//实现[self.KVOController observe:viewModel keyPath:@"contentStr" options:NSKeyValueObservingOptionInitial||NSKeyValueObservingOptionNew block:^(id  _Nullable observer, id  _Nonnull object, NSDictionary * _Nonnull change) {//此处使用的是伪代码//实现双向绑定//_label.text = change[NSKeyValueChangeNewKey]}];
  1. 此时我们来处理MVVMViewModel, 在MVVMViewModel类中中介字符, 并且来增加一个方法
    声明

@property (nonatomic,copy)NSString *contentStr;@property (nonatomic,strong)MVVMModel *model;- (void)setWithModel:(MVVMModel *)model;

实现, 那么我们在这里进行一个数据的中间处理

- (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架构模式";[_viewModel setModel:_model];[_mvvmview showView:_viewModel];

MVVM总结

响应式编程
也是由MVC来演变过来的, 和MVC相比的话, 我们的V取代了C中的业务逻辑处理, ViewModel并不是单纯的业务逻辑类, 和我们的View和Model是相互关联的, 并且进行了双向的绑定
假如说我们要添加点击事件,我们可以在ViewModel中来处理点击方法逻辑, 然后在我们View中导入ViewModel, 在View中点击调用点击方法的具体逻辑就可以了