浅析 MVC

一、 MVC 设计模式

1. 设计模式

  • 设计模式,是通用代码(组织方式)的一种统称

2. MVC 是什么

  • MVC 是三个单词的首字母缩写,他们分别是 Model(模型)、View(视图)、Controller(控制器)
  • MVC 认为,程序无论是简单还是复杂,从结构上看都能分为三层:
  1. 最下层,核心的的”数据层“(Model):数据保存,用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法
  2. 最上层,面向用户的”视图层“(View):用户界面,它是提供给用户的界面,描绘的是 model 的当前状态
  3. 中间层,”控制层“(Controller):业务逻辑,它处理用户的行为和数据 model 上的改变。负责根据用户从"视图层"输入的指令,选取"数据层"中的数据,然后对其进行相应的操作,产生最终结果
  • 这三层紧密联系在一起,但又是互相独立的,每一层内部的变化不影响其他层。每一层都对外提供接口供调用。这样一来,软件就可以实现模块化,修改外观或者变更数据都不用修改其他层,大大方便了维护和升级,提高灵活性和复用性
MVC.jpg

二、MVC 实例

比如以一个实现加减乘除的简易计算机为例

1. Model 数据模型

  • 定义并封装数据以及数据的处理方法
let Model={
    data:{}, // 数据源
    create:{}, // 增加数据
    delete:{}, //删除数据
    update(data){}, // 更新数据
    get:{} // 获取数据
}

2. View 视图

  • 定义和封装渲染到页面的元素和渲染方法
let View={
    el, // 要渲染的元素
    html, // 要显示在页面上的渲染内容
    init(){
        v.el // 初始化需要渲染的元素
    },
    render(){} // 渲染页面
}

3. Controller 控制器

  • 根据用户的行为,更新数据和视图
let Controller={
    init(){}, // 初始化渲染页面
    events: {}, // 事件
    // 点击事件的实现
    add(){},
    minus() {},
    mul(){},
    div(){},
    autoBindEvents(){} // 绑定事件
}

三、 发布/订阅

JS 中事件完全可以理解成“信号”,如果存在一个“信号中心”,某个任务执行完成,就向信号中心“发布”一个信号,其他任务可以向信号中心“订阅”这个信号,从而知道什么时候自己可以开始执行,这就叫做”发布/订阅模式”,又称“观察者模式”

// f2 向信号中心 jQuery 订阅 done 信号
jQuery.subscribe('done', f2)
// f1 执行完成后,向信号中心 jQuery 发布 done 信号,从而引发 f2 的执行
function f1() {
  setTimeout(function () {
    // ...
    jQuery.publish('done')
  }, 1000)
}
// f2 完成执行后,可以取消订阅
jQuery.unsubscribe('done', f2)

这种方法的性质与“事件监听”类似,但是明显优于后者。因为可以通过查看“消息中心”,了解存在多少信号、每个信号有多少订阅者,从而监控程序的运行

四、 EventBus

EventBus,也称为事件总线,在 JS 是一种对象或组件的通信方式,是发布订阅模式的一种具体实现
可以利用 EventBus 原生的 on()off()trigger()/emit() API 来发布订阅、取消订阅、触发

如何理解 EventBus 呢

  • 用一个十分浅显的例子,Bus 即公交车,城市中的公交车的是怎么运作的呢?
    公交车会在城市中按照既定的路线一遍遍的循环。乘客上车之后会跟公交车司机说一下”我在第二站,下车“,于是等公交车到了第二站后,会提醒乘客”第二站到了,请下车“,如果乘客中途改变了注意也会告诉司机”我第二站不下车了,后面的站再下车“。
  • EventBus 是怎么运行的呢?
    相应的,EventBus 对象会在 JS 线程中一遍一遍的循环。它是一个订阅中心,比如你向起订阅一个点击事件 EventBus.on('click'),当事件触发时 EventBus 会执行你添加的事件监听函数 EventBus.emit('click'),如果想取消订阅可以 EventBus.off('click') 来取消订阅
  • 事实上,我们在使用 JS 绑定事件监听函数,都是在使用发布订阅模式

五、表驱动编程

我们在编程过程中,免不了会遇到需要判断多种条件的情况,这种时候如果使用 if...else、switch 语句,写出的代码就会出现可读性较差甚至出现错误,如果我们使用表驱动编程的方式就会是代码可读性增强并且不容易出错。

  • 浅显易懂的例子
const day = new Date().getDay()
let day_zh;
if(day === 0){
    day_zh = '星期日'
}else if(day === 1) {
    day_zh = '星期一'
}
...
else{
    day_zh = '星期六'
}

// 或者 用 switch case
switch(day) {
    case 0:
        day_zh = '星期日'
        break;
    case 1:
        day_zh = '星期一'
        break;
        ...
}

// 使用表驱动的方式
const week = ['星期日', '星期一',..., '星期六']
const day = new Date().getDay(
const day_zh = week[day]

六、模块化

  • 模块化就是把功能相对独立的代码从一大段代码里封装成一个个短小精悍的模块
  • 每个模块之间相对独立,每个模块的修改不会影响其他模块的功能,甚至不同模块之间使用不同的技术实现也不会带来影响
  • ES6的语法里使用 Import 和 export 语法来实现 JS 代码的模块化
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容

  • 一、MVC是什么? M 就是 model, 即数据模型,负责数据相关的任务,包括对数据的增删改查 V 就是view...
    Carlmac阅读 249评论 0 0
  • MVC 是什么,三个对象分别做什么 MVC是一种架构设计模式,它通过关注点分离鼓励改进应用程序组织 MVC即 Mo...
    csy没有昵称阅读 322评论 0 0
  • 《浅析MVC》 MVC 三个对象分别做什么,给出伪代码示例 模型model用于封装与应用程序的业务逻辑相关的数据以...
    Jepson21阅读 218评论 0 0
  • 【目录】 一、MVC 三个对象分别做什么二、EventBus 有哪些 API,是做什么用的三、表驱动编程是做什么的...
    云卷云舒听雨声阅读 406评论 0 0
  • 1.MVC模式 MVC模型对应着 Model(模型) View(视图) Controller(控制器) 构成的开...
    Prayx阅读 166评论 0 0