MVC 设计模式(Objective-C)【MVC Design Pattern】

本文将以 Objective-C 语言为媒介,结合其在 iOS 开发当中的应用要点,介绍 MVC 设计模式的概念、特点及优劣性。

Demo

MVC 是什么?

MVC(Model-View-Controller)于1978年借由 Smalltalk 被提出,是一个古老的、高级的、复合的设计模式。它的出现为 GUI 编程开辟了一片新的天地,在随后的几十年里,产生了诸如 MVA、MVP、MVVM 等 MVC 的变种设计模式。

MVC 并没有一个完全明确的定义,各大论坛、百科、书籍等都对其有大体一致,但多少又有点不一样的解释,他们给出的 MVC 架构图解也是各有千秋。而对于 iOS 开发而言,Paul Hegarty 在其斯坦福 iOS 开发相关课程中给出的这幅图,我认为既生动、又形象、还准确。

MVC

这张图是在说:

  • Controller 和 Model、View 是单向通信关系,而 Model 和 View 之间是隔离关系。
  • Controller 可以直接操作 Model,从 Model 中获取数据。
  • Controller 可以直接操作 View 的展示,是 View 的数据源(数据也许来源于 Model),也是 View 的代理(delegate 是 Controller 用来同步 View 状态的手段)。
  • Model 可以通过 Notification 和 KVO 来间接地和 Controller 通信。
  • View 可以把 action 的 target 设置为 Controller,用来向 Controller 传达事件信息。

下面就来看一下 MVC 中的各个部分是干什么的。

“M”

M = Model,即模型,负责定义系统所包含的数据,是系统各部分的组成零件。

Model 包含了数据和操作数据的相关业务逻辑。

“V”

V = View,即视图,负责将数据(图形、文字等)展示到屏幕上。

View 本身不包含任何业务,只负责页面展示和对 Controller 的反馈(delegate 和 action)。

“C”

C = Controller,即控制器,负责接收并响应用户的操作,根据情况来处理模型及更新视图。

MVC 的核心,负责协调 Model 与 View,包含了大量的业务逻辑处理、网络请求及部分数据库操作,纵观整个架构,Controller 可以看做是在写胶水代码。正因如此,Controller 在稍复杂一些的业务场景下,会变得略显臃肿,如果业务日趋复杂,稍不注意,Controller 就会变得难以维护(过度耦合的代码必将导致 Massive ViewController)。

总结

优点

  • Model 层完全独立,其可移植性和可维护性很高。
  • Controller 层可以完全控制 View 层,甚至可以利用 runtime 的机制动态替换或修改 View。
  • 整个 MVC 设计模式对外而言十分健壮。

缺点

  • Controller 的职责过于繁重,甚至可能会产生一个令人窒息的 Controller,其可维护性和可测试性都很差。
  • 在 iOS 开发中,MVC 对于小型模块来讲过于复杂,如果这部分内容严格遵循 MVC 模式来开发,会花费很多时间和精力,增加了整体结构的复杂度,而这些都是没有必要的。
  • View 和 Controller 的联系过于紧密,一旦分开,二者能做的东西实在太少,所以,“V”和“C”从模块的角度上来讲,是很难独立重用的。

改进方向

  • 给 Controller 减负。
  • 减弱 View 与 Controller 的联系。

结语

MVC 虽然有些常被诟病的缺点,但其仍然是一个相对良好的设计模式。迄今为止,仍然有许多优秀的项目使用或参考了 MVC 设计模式,这就说明,MVC 仍然具有非常可观的价值。对 GUI 编程而言,MVC 是一位导师,开发者能从它身上学到很多有价值的东西,并在开发之中,取其精华,弃其糟粕,让自己的程序更加稳定和优雅。