架构设计的目的是管理开发的复杂性,合理的拆分项目中的逻辑,更加方便工程的维护和管理,来节约开发时间、提高开发效率。
目前在实际开发过程中比较常见的集中架构主要包括,MVC、MVVM、VIPER(View Interactor Presenter Entity Router),这几种架构的设计思路基本上是一致的,后面几种都是基于MVC,将Controller中的逻辑拆分出来,只是程度和方式有所不同。
首先,简单介绍一下MVC,这是苹果官方所推荐的一种设计方式,主要包括Model、View、Controller:
Model:封装的数据模型,用来保存数据;
View:视图控件,用来展示视图;
Controller:主要是视图控制器,用来处理用户事件,更新视图和数据等逻辑;
其设计思想是减少View 和 Mode的耦合行,View只包含视图,Model只涉及数据,Contrller用于控制两者之间的逻辑关系,View和Model之间不需要有直接的联系。不过,这种设计模式随着项目的复杂度逐渐提升,暴露出来Controller代码臃肿,管理不便,维护成本升高等问题。
为了减轻Controller的负担,将整合View展示数据的逻辑抽分出来封装成为ViewModel,于是有了MVVM设计方式,它主要包括三个部分:
Model:此处的Model与MVC中的Model相同,是封装的数据模型;
View:此处的View是指的的View和ViewController,用于展示视图和接收用户事件等;
ViewModel:视图模型有直接用于展示的接口和数据输入接口,其主要作用是,将初始数据处理成为直接用于视图展示的Model;
MVVM中,采用了双向绑定(Data and user action binding)来同步View和ViewModel的状态,View的变动,自动反映在所绑定的 ViewModel,反之亦然。其设计思想是在MVP的基础上,从Controller中抽取出负责展示视图的数据处理逻辑,形成ViewModel。
MVVM三个元素的逻辑关系是:
1、Model数据提供给ViewModel,经过ViewModel处理转换成为View可以直接展示的数据,然后更新ViewMode的状态;
2、View层接收到用户事件或者状态改变事件,该View所绑定的ViewModel也可以同步更新,然后ViewModel会更新对应的本地Model数据。
MVVM的优点有:
1、低耦合性,降低视图逻辑处理与其他业务逻辑的耦合性;
2、可复用性,一个通用的视图逻辑封装到一个ViewModel中,可以有很多View重用这段视图逻辑;
3、方便视图单元测试,由于视图逻辑被拆分出来,在测试对应的视图或者样式的时候,只需要更改ViewModel中的视图逻辑即可,与其他业务逻辑无关;
随着项目系统复杂度提升,有更细致的需求需要抽象出来,单独处理以方便维护,又把Controller中的用户交互逻辑、路由器职责划分出来由协调器(Presenter)调度,于是就有了VIPER(View Interactor Presenter Entity Router)架构。
VIPER架构设计中主要分为五个部分:
1、View:指View与ViewController,包含UI层面的业务逻辑以及交互层面的接口调用和转发;
2、Interacter:交互器,包括用户交互动作和关于数据和网络请求的业务逻辑,例如创建一个实体(数据),或者从服务器中获取一些数据。
3、Presenter:统一调用各个部分之间的协议接口,例如将Interacter中请求来的数据传递给View层,将用户交互事件传递给路由层等;
4、Entity:实体模型,普通的数据对象;
5、Router:用于各个页面层次之间的联系绑定,页面视图跳转链接等;
其主要设计思路还是从MVC中的Controller抽取业务楼逻辑。
VIPER架构是从中抽象出了View、Interactor、Router等逻辑。使用时,首先将不同的逻辑抽象封装为对应的协议,然后在视图控制器中通过协议,将不同逻辑处理交给遵守所有协议并且绑定其对应关系的Presenter对象去统一处理。其中Router逻辑已经有不少开源库进行了封装,调用起来也比较方便,比如 JLRoutes、HHRouter、MGJRouter等.
以上几种设计模式,没有一种比另外一种更好的概念,只有符合自己项目实际情况的才是最优的。需要注意的是,上述的架构设计模式都是值得借鉴的设计思想,照搬某种设计模式,绝大多数情况下都不会解决我们项目中的问题。要使项目保持一个良好的维护状态,就需要平时开发过程中,及时总结抽象出对应的业务组件,对项目进行瘦身,以提高项目的复用性和延展性。在发现结构设计存在缺陷时,要及时规划调整步骤,避免出现「焦油坑」的情况。