经常会看到MVC设计方式,在前端框架中大量的被应用,其他软件实现中也用到了MVC。
MVC就是模型/视图/控制器三个部分组成的软件架构方式。三者应该互相隔离。但是通常很难完全解耦。
M即Model,模型,指的是对数据的抽象。无论数据是存在文件/网络或者就是模型实现当中。模型并不是指数据本身,而是对数据操作的封装。当然也可以直接把数据放到模型中。
V及View,视图。主要用来显示模型中的数据,不同的View有不同的显示方式,取决于View是如何实现的。比如windows系统中文件夹中显示方式,可以小图标/大图标/详细信息切换视图显示;或者QT中的列表/报表/树形显示。
C即Controller,控制器,主要用于实现业务逻辑以及用户输入。用户通过UI(例如窗口软件/控制台)输入数据,控制器将其进行业务逻辑处理,比如文字处理软件,用户输入了一个字符,内部需要处理该字符的一些格式属性,然后将数据放到内存中存储起来,也就是通知模型层把数据存放起来。数据变化了,通知视图层,要进行显示。
网络上可以看到很多MVC的文章,有些实现耦合比较严重。视图中包含模型对象/控制器对象。实际上,MVC就是为了解耦。某一层的改动不影响另一层。模型不用知道视图怎么显示渲染,也不用知道控制器何时获取数据/设置数据(但是需要提供合适接口给控制器读写数据,这种耦合是不可避免的;)。有的文章中,数据改变了,直接在模型层通知所有相关(就是注册了的)的视图,数据变化了。我觉得比较好的实践就是M和V相互隔离,通过C作为桥梁。如下图中,可以看到模型和视图是完全解耦的。我们只需要在初期将控制器注册到模型对象中,然后模型对象