iOS知识梳理4:MVC和一些其他的架构模式

接着上一章设计模式,前面三种单例模式, 委托模式, 观察者模式都是比较局部的设计模式...下面讲一些复合设计模式. 我
(我所入门的iOS书,是把前三种和MVC,MVVM,MVP等都当做设计模式来说的....其实更多地方把后者归为"架构模式"来和"设计模式"做区别....我们这里还是说设计模式哈...主要是习惯了...)

MVC是cocoa里面最常见的设计模式, 面试会问到的可能性也非常大. 另外还有一些比较好却不是经常被问到的设计模式, MVVM和MVP等等,(有些公司的项目就是用MVVM设计出来的....他可能肯本不会问题你MVC方面的东西...如果你对MVVM一点内容都说不出来,,或者解释的模糊不清,,,当然会给面试减分不少...),这些可以简单了解一下....
(网络上好多让你解释一下MVC的面试题的答案,都写的好简单,,,我这写的好啰嗦,,但是感觉还是要自己理解到了,,然后用自己的话说出来,才比较好吧)


1.MVC模式

a.模型Model: 保存应用的状态,回应视图对状态的查询; 处理应用的业务逻辑,完成应用的功能,将状态变化(通过控制器)通知给视图

b.视图View: 为用户展示信息并提供接口. 用户通过视图向控制器发出动作请求,然后(控制器)再向模型发出查询状态的申请,而(控制器会将)模型状态的变化会通知给视图...

c.控制器Controller: 接收用户请求,根据请求更新模型,另外,控制器还会更新所选视图用来作为对用户请求的回应.

(备注:加括号是cocoa中的MVC模式,不加括号是通用的MVC,,也就是说cocoa的MVC一般M和V是不直接通信的,需要通过C)

其实cocoa关于MVC的说明更加简单易懂..

  • Model Objects Encapsulate Data & Basic Behaviors
  • View Objects Present Information to the User
  • Controller Objects Tie the Model to the View

大概就是这样的一个关系图:


MVC模式(我的笔记照片..字很丑不要嫌弃..).png

用一个例子来解释一下MVC大概是这样样子的:
比如,,,你想做一个汇率转换的APP,那么:
M就可以用来保存所有的货币名称,以及货币之间相互转换的逻辑代码.
V就可以是Text用于展示货币名和转换出的货币金额,TextField用于提供用户输入接口来发送请求给控制器,同时展示用户输入的金额.
C就是viewcontroller代理了textfield的方法,当用户输入时,就会收到textfield的通知,同时向Model发出查询状态的请求,然后M就会通知C我变了,M会通过逻辑代码计算出所有的货币金额,C就会把这些金额的变化在V的各个Text中表现出来...

问题1.C除了连接M和V之外,还有哪些有优点?

答:控制器除了是View和Model的媒介,还可以降低两者之间的耦合度(就是相似重叠的程度),让两者权责更加清晰,从而提高开发效率.

2.MVVM模式

关于MVVM的一篇流传很广,也很经典的帖子,被误解的MVC和被神化的的MVVM希望能够帮助理解.
Objc中国-MVVM介绍
ios开发之利用MVVM框架来优化项目结
大体总结是, 尽管MVC分层明确各司其职, 但是实际开发还是有很多逻辑不知道应该写在哪里, 就会导致会把大量的逻辑堆积在Controller.为了避免Controller的臃肿,我们可以把controller的一些逻辑分离到ViewModel里.

我们再深入解释一下,在实际开发中,虽然View和Controller是不同的组件,但是他们几乎是手牵手成对出现的,所以实际开发中MVC几乎变成了这样:

iOS知识梳理4:MVC和一些其他的架构模式_第1张图片
MVC实际情况

在开发中一些"表示逻辑",以MVVM术语来说,就是将Model数据转换为View可以呈现的东西,比如讲一个NSDate转换为NSString的,我们就可以把这些臃肿在controller里的逻辑提出来,放在ViewModel中.

iOS知识梳理4:MVC和一些其他的架构模式_第2张图片
MVVM设计模式

所以这里就可以描述什么是MVVM: MVC的增强版, 我们正式连接了视图和控制器, 并且将表示逻辑从Controller移出放到一个新的对象里,即ViewModel.

比如,我们要实现一个Person类,并展示出来,他的出生年月日需要我们把NSDate通过DateForMatter转换成NSString.....在MVC中,我们一般会把这些逻辑都都塞在controller里面,而在MVVM中,我们需要建立一个PersonViewModel类,把model属性到可以展示的View属性放到ViewModel里面,只需要在controller里加入self.birthdateLabel.text = self.viewModel
.birthdateText;这样一句代码,降低了controller的臃肿....

当然MVVM也会出现一些问题.对于可变的Model,我们还需要使用一些绑定机制,这样ViewModel就能在背后的Model改变时更新自身的属性.....这样我们就上到KVO模式...但是这样任有一些问题....需要给每一个属性做关键字绑定...代码会变得更加麻烦.....这里就提到网上很推崇的ReativeCocoa....(其实我也对MVVM研究的很深入,,,,以后有了跟多的体会再补充过来吧...这里只做面试相关的内容,,,以上内容应该够和面试官侃一阵子了...)

问题1.ViewModel里面都可以放一些什么东西呢?

答:用户输入验证逻辑, 视图显示逻辑, 发起网络请求 ,封装数据缓存等等,,,你觉得放在controller里面比较冗余的逻辑都可以考虑放进来.所白了,就是把原来viewcontroller层的业务逻辑和页面逻辑等剥离出来放到ViewModel层

3.MVP模式

MVP模式是MVC的演化版,全程Model-View-Presenter.
如同上面讲到的实际开发中,MVC的view和controller十分容易耦合,在MVP中,把ViewController当做View,通过Presenter来完成M和V的沟通...实际上就是理想化的MVC模式...
这个帖子详细的说明了MV(X)系列模式的演化

我所理解的MVP和MVVM的区别(不知道是不是正确.....):
MVP的presenter仍然是管理者级别的,比如说V原本代理给Controller的方法,要通过更多的代码代理给presenter,让presenter去代理,从而减负...但是实际使用会增加更多的代码....
MVVM的ViewModel实际上是和M & V同级的,他只负责View和Model的数据的沟通,管理的任务实际上还是在controller里面,ViewModel只是负责数据的转换,把一部分逻辑从controller里面迁出到ViewModel里,controller保留自己的管理任务.从而达到contreoller减负的效果.

4.VIPER模式

里面有讲到一些MV(X)系列的区别..和VIPER模式
项目MV(X)系列,分层更加明确的,模块化的模式.

  • View/UserInterface 视图
    显示信息给用户; 检测用户交互
  • Interaction 交互
    执行业务逻辑
  • Presenter/Event Handler 展示
    告诉视图显示什么内容; 处理事件
  • Entity 实体
    表示数据
  • Router/Wirefram 路由
    初始化所有其他类;处理数据包路由到其他视图.

大体是这样的结构,实际怎么用我也不太清楚,实际应用学起来应该挺困难的,,,这里知道有这个模式就好了....毕竟我们只是整理面试相关内容....具体内容以后再来补充...

补充: 其他的一些面试不常问到的设计模式

1.外观模式 Facade
外观模式针对复杂的子系统提供单一的接口..使用者不用关心背后的复杂性,,这个模式非常适合一大堆很难使用或者理解的类.

2.装饰模式 Decorator
在不修改原来代码的情况下动态给对象(而不是类)增加新的行为和职责...iOS中的实现是Category(类别)和Delegation(委托)
(这两个很少被称作"装饰模式"来说,,都是分别提出来的另外的知识点,,,我们以后再说.....但是万一问到呢....所以还是写在这里.)

3.策略模式Strategy
定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化

4.工厂模式Factory
个人理解: 为很多相似的类建立一个统一的父类....父类在初始化时可以通过传入的参数判断返回哪一个子类...
对工厂模式简洁的理解
(当然这里只是对工厂模式最最简单的解释....看网上对工厂模式随意一个帖子就可以讲一大堆东西出来....还是先放在这里,,,以后整理...)
更加深入可以去了解一下:简单工厂模式,工厂模式,抽象工程模式

5.适配器模式
6.模板模式
7.建造者模式

你可能感兴趣的:(iOS知识梳理4:MVC和一些其他的架构模式)