MVP MVVM都源自MVC.

传统的MVC,业务逻辑放在Model层,UI在View层,Controller只是Model和View的粘合剂。

实际情况,Model层只存放从json解析的数据模型,Controller层(ViewController)有很多UI逻辑,导致Controller里面既包含业务逻辑(请求数据、处理数据)又包含控制UI逻辑,因此Controller巨大无比。

 

所以衍生出MVP和MVVM。

MVP:把Controller中的业务逻辑抽出来放到Presenter层,ViewController和View统一作为View层,同时View被动更新,提供一组View更新的协议方法,presenter层负责调用,Presenter层和View层互相引用。

同时presenter层还提供将Model数据转成View需要的数据类型的方法,不过很多时候都是View中直接引用特定的Model对象,方便实现业务,所以这步通常没有,但是如果为了复用View,中间最好还是加一层数据转换逻辑。

 

MVVM跟MVP类似,区别是ViewModel层不会去引用View,一般用响应式编程的框架实现View的更新(如ReactiveCocoa等,不过现实情况也会通过ViewController的逻辑去更新View),共同点是一个presenter或者一个ViewModel可以适配不同的View,presenter或者ViewModel可以单独测试。