MVC设计模式学习

63 阅读5分钟

一、MVC介绍

1.为什么要有MVC

在开发的过程中会遇到的实际情况

  • 重复的代码:三行相同代码写了两遍以上

  • 重复的页面:把类似的页面做了10遍

MVC就是为了让开发者不需要写那么多重复的代码

  • 让新手开发者避免写出屎山

  • 只会调用API,不懂得提升自己

  • 只会写业务不会封装,不会造轮子

2.MVC是啥

每个模块都可以写成三个对象,即M、V、C

  • M:Model(数据模型)负责操作所有数据

  • V:View(视图)负责所有VI界面

  • C-Controller(控制器)没有明确定义,我们把它作为其他代码的集合对象

  • 其实MVC并没有严格定义,一万个开发者心中可能有一万种MVC的定义,因为是抽象的概念

二、MVC代码实现和思想

1.做一个有两个小功能的页面

  • 第一个功能,显示数字下方四个按钮分别对应:加1、减1、乘2、除2,点击按钮后,显示的数字发生对应变化

1_.gif

  • 第二个功能,两个标签,点击不同标签下方显示不同内容,且被选中的标签变色

2_.gif

2.代码实现

  • 新建html文件,引入style.css文件和main.js文件

  • 使用模块化思想分别新建功能1的app1.js文件、app1.css文件和功能2的app2.js文件、app2.css文件

  • 分别把这两个js文件以及css文件引入main.js文件,这样解决了代码很乱的问题

//main.js
import './app1.js'
import './app1.css'
import './app2.js'
import './app2.css'
  • 由于还没有学习vue和react等主流框架,所以我只能用jQuery来实现效果

app1.js

  • jQuery获取显示的数据和四个按钮

  • 把获取到的数据存进变量里

  • 给四个按钮分别设置事件监听,点击以后操作存了数据的变量

  • 每一次按钮点击后还需要把变量内的值更新到页面内

app2.js

  • jQuery获取到四个元素

  • 给上方的标签设置事件监听,点击以后给上方和下方对应的元素添加class,让其改变颜色和显示

  • 判断一下,假如点击了一个标签,则另一个标签的class则为空

MVC改变一下代码

  • 给app1.js和app2.js文件内新建三个对象,M、V、C

  • 把两个文件内的代码分类后装到这三个对象内

3.抽象思维学习MVC

1.最小知识原则

  • 最开始引入一个模块需要引入html、css、js

  • 我们过渡到只需要引入html和js,把css放进js里

  • 最后我们会把功能内需要的html文件也装进对应的js里,最终做到引入一个功能只需要js就够了

  • 以功能1和2为例,我们把需要用的html保存到对应的变量里,在最开始时就添加到页面里

2.以不变应万变

  • 我理解到的其实每个模块都能用MVC的模式搞定

  • 假如未来遇到类似的需求就不用再思考咋做了,直接代入MVC即可

3. View = render(data)

  • 数据改变后,把保存HTML代码的变量直接重新渲染一遍

  • 这样比起操作DOM对象来说,直接render要简单很多

  • 只要改变了数据,就可以得到对应的View

  • 但这样粗犷的渲染比DOM操作更浪费性能(后面学习虚拟DOM能解决)

4.表驱动编程

  • 假如代码内有大批类似但不重复的代码

  • 把重要的数据抽离出来,做成哈希表之类的,用的时候再去调表内的数据

  • 我理解到的就是从表里查找信息而不用逻辑语句if else

  • 比如功能1的四个按钮,我需要设置四个事件监听函数,可以把重要的数据放进表里,每次用到事件监听的时候再去调用相应的数据,这样可以简化很多

5.俯瞰全局

  • 把所有的对象看成点

  • 一个与多个点,多个与多个点之间通信,可以找出一个专门用来通讯的点

  • 比如View需要监听Model内的数据发生了改变就渲染数据

  • 这时候就需要用到Event Bus(事件总线)

6.事不过三

  • 同样的代码写三遍,就应该封装成一个函数

  • 同样的属性写三遍,就应该做成共有属性(原型或类)

  • 同样的原型写三遍,就应该用继承(比如EventBus)

  • EventBus在功能1和功能2里的M、V对象内都用到了,我们可以直接让M和V对象继承EventBus的属性,这样就不用反复在M和V里写EventBus了

三、总结

  • MVC确实很抽象,且晦涩难以理解,但如果以后写代码时尽量往这个思想上靠,强迫自己利用MVC优化代码,这样久而久之就能理解MVC的便利

  • 理解MVC是为了学习Vue和React打好基础,其实主流框架也就是MVC设计模式优化或做了改变而来的

  • MVC还可以简化为MV,因为C确实感觉实际的用处不太大,给我的感觉是为了多一个对象而新建的C对象

  • MV对象可以直接作为类让app1和app2直接使用,这样MV对象就成为了中间件,app1和app2之间就不会相互影响了