1、架构

1.1、架构简介

架构(Architecture)是软件开发中的设计方案,比如类与类之间的关系、模块与模块之间的关系、客户端与服务端的关系。
iOS中经常听到的架构名词有MVC、MVP、MVVM、VIPER、CDD,以及三层架构、四层架构等。

1.2、MVC - Apple版

image.png
Controller持有并管理View,View的事件反馈给Controller进行处理。
Controller持有并管理Model,Model发生变化需要Controller更新View显示。
代码举例:

  1. // 读取model
  2. NewsModel *model = self.newsData[indexPath.row];
  3. // 配置cell
  4. cell.textLabel.text = model.title;
  5. cell.detailTextLabel.text = model.content;

优点:View、Model可以重复利用,可以独立使用
缺点:Controller的代码过于臃肿

1.3、MVC - 变种

image.png

Controller持有并管理View,View的事件反馈给Controller进行处理。
Controller持有并管理Model,View绑定Model。

*可以利用代理或者Block把View的事件反馈给Controller

代码举例:

  1. // 配置cell
  2. - (void)setModel:(NewsModel *)model {
  3. _model = model;
  4. self.textLabel.text = model.title;
  5. self.detailTextLabel.text = model.content;
  6. }

优点:对Controller进行瘦身,将View内部的细节封装起来了,外界不知道View内部的具体实现
缺点:View依赖于Model

1.3、MVP

image.png
Presenter相当于取代了MVC架构中的Controller的角色,当一个Controller中有多个功能模块时,每个Presenter负责一个模块,减少Controller代码量。

  1. @interface NewsPresenter : NSObject
  2. // Presenter弱引用controller
  3. @property (nonatomic, weak) UIViewController *controller;
  4. @end

在Controller中添加Presenter:

  1. self.newsPresenter = [[NewsPresenter alloc] init];
  2. self.newsPresenter.controller = self;

1.4、MVVM

image.png
结构和MVP相似,唯一不同的地方是ViewModel和View有一个绑定关系,当数据改变时View显示会自动更新。
可以使用 RAC 进行绑定,也可以使用 KVOController ,这里以KVOController为例:

  1. - (void)setViewModel:(NewsViewModel *)viewModel {
  2. _viewModel = viewModel;
  3. // 添加绑定
  4. __weak typeof(self)weakSelf = self;
  5. [self.KVOController observe:viewModel keyPath:@"name" options:NSKeyValueObservingOptionNew block:^(id _Nullable observer, id _Nonnull object, NSDictionary<NSKeyValueChangeKey,id> * _Nonnull change) {
  6. weakSelf.text = change[NSKeyValueChangeNewKey];
  7. }];
  8. }

当监听到viewModel的name属性变化时,会自动更新view的显示。

1.5、分层架构

image.png
在实际开发中,代码可以进行分层处理:
UI层:负责界面展示(MVC、MVP、MVVM)
业务层:负责逻辑功能
数据层:负责管理网络数据、本地数据

2、设计模式

2.1、设计模式简介

设计模式(Design Pattern),是一套被反复使用,代码设计经验的总结,概念上比架构小一点,研究的是类和类之间的关系。
使用设计模式的好处是:可重用代码、让代码更容易让他人理解、保证代码可靠性。一般与编程语言无关,是一套比较成熟的编程思想。

2.2、设计模式分类

1、创建模式:对象实例化的模式,用于解耦对象的实例化过程
例如单例模式、工厂方法模式等。

2、结构型模式:把类或对象结合在一起形成一个更大的结构
例如代理模式、适配器模式、组合模式、装饰模式等。

3、行为型模式:类或对象之间如何交互,及划分责任和算法
例如观察者模式、命令模式、责任链模式等。