免费开源的iOS开发学习平台

iOS下的MVVM设计模式

MVVM是微软首先提出来的一种设计模式。在开发过程中随着代码量越来越多,维护的时候,暴露出来的问题也越来越多。这些问题中就包括UI和业务逻辑的高耦合,这会导致UI和业务逻辑很难进行单独修改,很难进行复用,很难进行单元测试。所以今天的主角MVVM设计模式就被创建出来了。

MVVM设计模式主要目标

  • 将代码按职责进行分组。高耦合、难修改、脆弱的代码在维护期间会引起很多问题。最终会影响产品的交付质量。把UI和业务逻辑分开,使得代码容易测试,维护,和升级。同时能使的UI和业务逻辑更容易被复用。

  • 让开发人员和设计人员并行工作。设计人员聚焦在产品的UI显示和布局上面。开发人员专注于业务,和数据逻辑处理上面。从而提高开发效率。

  • 易于进行单元测试。将UI逻辑隔离起来,使得单元测试更容易进行。可以在测UI逻辑的时候不必运行程序。

MVVM设计模式

每一位iOS开发者,用的最多、最熟悉的设计模式估计就是MVC设计模式了。因为苹果为我们提供的框架就是使用MVC设计模式的。MVVM设计模式其实有很多概念和MVC很相似。

MVVM设计模式有三部分组成:View,View Model,Model。每一部分有自已的职责。下图是描述的它们之间的关系。

这三部分之间相互解耦,因此:

  • 每个部分能被单独替换
  • 修改内部的实现,不会影响别的部分
  • 每个部分能独立工作
  • 可以对每一部分进行单元测试

另外,为了更好的理解这三部分的职责,需要理解它们之间是如何进行交互的。从高层次上看,View“知道”View Model,而View Model并不“知道”View;View Model “知道” Model,而Model并不“知道”View Model。

View Model将View和Model隔离开来,使得Model,和View能单独进行修改。

View

View负责定义页面结构,布局用户在屏幕上看到的界面。在iOS开发中,View一般是程序中的一个页面。一个View也可以是父View的一部分。
每个View都有自己的View Model,或者它从父View中继承了View Model。View通常是通过通过View Model的绑定,或者调用View Model中的方法来获取数据。在运行的时候,UI控件要响应View Model抛出通知事件,来更新UI。
为了响应UI上的交互,需要在View Model中实现相应的代码。比如一个按钮被点击。需要将这个按钮点击事件绑定到View Model中去。然后在View Model中写代码处理用户的交互。
在iOS开发中View和ViewController都是属于View这部分。

Model

与业务和验证逻辑有关的域模型,都可以认为是MVVM中的Model。比如:业务对象,数据传输对象(DTOs),实体,代理对象等等都可以认为是Model。这里的Model与MVC中的Model一样。

View Model

View Model扮演着View和Model的中介角色,它负责处理视图逻辑和数据转化。一般来说View Model通过调用Model的方法来和Model进行交互。View Model随后将从Model中获取的数据以一种view容易使用的格式提供给View。View Model负责UI交互的响应代码实现。例如:当用户点击了一个按钮在UI中,这个动作会使得View Model中相应代码被执行。View Model也负责控制视图的显示逻辑,比如修改UI指示操作正在进行。

MVVM好处

  • 在开发过程中,开发人员和设计人员能并行的工作。设计师能专注于界面,而开发人员能专注于业务逻辑和数据逻辑。有效提高开发效率。
  • 开发人员能View Model和Modle创建单元测试。对View Model进行单元测试的效果就像对View进行单元测试一样。但是测试的时候并不需要运行程序。
  • 修改UI代码而不必去碰其他代码。
  • 对于包含了业务逻辑的Model,修改的话风险较大,此时可以将View Model当作适配器来使用,从而避免对Model代码做大的修改。

转载自:iOS下的MVVM设计模式