思考:
架构
架构(Architecture),软件开发中的设计方案。类与类之间的关系、模块与模块之间的关系、客户端与服务端的关系。
经常听到的架构名词:MVC、MVP、MVVM、VIPER、CDD、三层架构、四层架构……
MVC - Apple版
Model-View-Controller
优点:View、Model可以重复利用,可以独立使用;
缺点:Controller的代码过于臃肿;
Controller 拥有 Model 和 View,并负责处理 Model 和 View 的逻辑。Model 和 View 不需要知道对方的存在。
示例代码:
拥有关系:在使用 MVC 设计模式里,TableView 是最经典的了。从示例代码可以看到,Controller 同时拥有 News 和 NewsCell,但是 News 和 NewsCell 互相不知道对方的存在。
数据:Controller 成为 TableView 的代理,并在 cellForRowAtIndexPath:
方法里将 News 传递给了 NewsCell,在 NewsCell 内部处理数据。
事件:Controller 成为 TableView 的代理,并在 didSelectRowAtIndexPath:
方法里处理 NewCell 的点击事件。
优点:因为 NewsCell 不需要 News,只需要在 cellForRowAtIndexPath:
方法里获取需要展示的数据,所以 Controller 里的 News 不是必要条件,也可以使用其它的 Model 跟当前的 Controller 和 NewsCell 组成 MVC 结构。比如新建 替换掉 News:
缺点:因为 Controller 要负责将 Model 里的数据传递给 View 用于展示,所以在 View 比较多的情况下,Controller 就会变得臃肿。在实际开发中同一个 TableView 往往会有多种 Cell,或者 Cell 的功能非常复杂,需要处理的数据和逻辑很多,所以一般不会在 Controller 里处理 Cell 数据相关的逻辑,就衍生出了下面这种设计模式👇。
MVC – 变种
Model-View-Controller
优点:对 Controller 进行瘦身,将 View 内部的细节封装起来了,外界不知道 View 内部的具体实现;
缺点:View 依赖于 Model;
Controller 拥有 Model 和 View。View 拥有 Model,在 View 内部处理 Model。
示例代码一
|
|
拥有关系:从示例代码可以看到,Controller 同时拥有 News 和 NewsCell,NewsCell 拥有 News。
数据:Controller 成为 TableView 的代理,并在 cellForRowAtIndexPath:
方法里将 News 传递给了 NewsCell,在 NewsCell 内部处理数据。
事件:Controller 成为 TableView 的代理,并在 didSelectRowAtIndexPath:
方法里处理 NewCell 的点击事件。
示例代码二
|
|
拥有关系:从示例代码可以看到,Controller 同时拥有 App 和 AppView,AppView 拥有 App。
数据:Controller 将 App 传递给了 AppView 并在 AppView 内部处理数据。
事件:Controller 成为 AppView 的代理,并在代理方法 appViewDidClick:
里 AppView 的点击事件。
MVP
Model-View-Presenter
MVP 和 MVC 很像,他们的相同点是都要求 Model 和 View 不需要知道对方的存在。他们的区别在于:
在 MVC 中,Controller 拥有 Model 和 View,并负责处理 Model 和 View 的逻辑。
在 MVP 中,Controller 里的逻辑代码挪到了 Presenter 里,由 Presenter 负责处理 Model 和 View 的逻辑,Controller 不需要知道 Model 和 View 的存在。
示例代码:
拥有关系:从示例代码可以看到,Controller 拥有 AppPresenter,AppPresenter 拥有 Controller、App 和 AppView,Controller、App 和 AppView 不知道对方的存在。
数据:AppPresenter 将 App 的数据传递给了 AppView。
事件:AppPresenter 成为 AppView 的代理,并在代理方法 appViewDidClick:
里 AppView 的点击事件。
MVVM
Model-View-ViewModel
示例代码:
拥有关系:从示例代码可以看到,Controller 拥有 AppViewModel,AppViewModel 拥有 Controller、App 和 AppView,AppView 拥有 AppViewModel,Controller、App 和 AppView 不知道对方的存在。
数据:AppView 监听 AppViewModel 中的属性,在属性发生改变时,获取到 AppViewModel 中的属性的数据。
事件:AppViewModel 成为 AppView 的代理,并在代理方法 appViewDidClick:
里 AppView 的点击事件。
三层结构
四层结构
设计模式
设计模式(Design Pattern),是一套被反复使用、代码设计经验的总结。使用设计模式的好处是:可重用代码、让代码更容易被他人理解、保证代码可靠性。一般与编程语言无关,是一套比较成熟的编程思想。
设计模式可以分为三大类:
- 创建型模式:对象实例化的模式,用于解耦对象的实例化过程。单例模式、工厂方法模式,等等。
- 结构型模式:把类或对象结合在一起形成一个更大的结构。代理模式、适配器模式、组合模式、装饰模式,等等。
- 行为型模式:类或对象之间如何交互,及划分责任和算法。观察者模式、命令模式、责任链模式,等等。