浅析MVC

141 阅读2分钟

1.MVC是什么?

MVC(Model View Controller)是一种架构设计模式

  • M : model,即数据层(数据模型),负责操作所有的数据。

  • V :view,即视图层,负责所有UI界面,是提供给用户的操作界面,是程序的外壳。

  • C :Controller,即控制层,负责根据用户从“视图层”输入指令,选取“数据层中的数据”,对其进行相应的操作(绑定事件等),产生最终结果。

这三层是紧密联系在一起的,但又是互相独立的,每一层内部的变化不影响其他层。每一层都对外提供接口(Interface),供上面一层调用。这样一来,软件就可以实现模块化,修改外观或者变更数据都不用修改其他层,大大方便了维护和升级。

Model 数据层

  • 数据管理,主要负责和服务器进行交互,将请求到的数据传给Controller。
const m = {
    data: {},
    create() {增 },
    delete() { 删},
    update() {改},
    get() {查}
}

View 视图层

  • 负责用户界面,HTML 渲染
const v = {
    el: null,
    // 初始化html
    html: `代码`
    ,
    init(container) {
        v.el = $(container)
    },
    render(n) { }
}

Controller 控制层

  • 负责监听并处理View 的事件,更新和调用 Model,也负责监听 Model数据的变化并更新到View视图
const c={
  init(container){}
  events:{事件}
  add(){执行}
  minus(){执行}
  update(){执行}
  get(){执行}
  autoBindEvents(){逻辑}
}

2.EventBus

EventBus是什么

前面提到MVC三层是紧密联系在一起的,但又是互相独立的,每一层内部的变化不影响其他层。当层与层之间需要通信时,这时就需要用到EventBus。EventBus主要用于组件之间的监听与通信。

EventBus 常用API

  • EventBus.on()监听事件

  • EventBus.trigger()触发事件

  • EventBus.off()取消监听事件

EventBus的作用:作用是用于模块间的通讯

实例代码:

import $ from "jquery";
class EventBus{
    constructor() {
        this._eventBus = $(window);
    }
    on(eventName,fn){
        return this._eventBus.on(eventName,fn)
    }
    trigger(eventName,data){
        return this._eventBus.trigger(eventName,data)
    }
    off(eventName,fn){
        return this._eventBus.off(eventName,fn)
    }
}
export default EventBus

3.表驱动编程

概念:

  • 表驱动法是一种编程模式(scheme),从表里面查找信息而不使用逻辑语句(if或case)

用途:对于简单的逻辑编程,且数量较少时,直接使用逻辑语句会更方便快捷,但当逻辑链数量庞大且经常需要维护时,表驱动编程会更加高效。

代码案例:

//未简化代码
add.addEventListener("click", () => {
  const num1 = parseInt($("#num1").val())
  const num2 = parseInt($("#num2").val())
  const result = num1 + num2;
  $("#result").text(result);
})
minus.addEventListener("click", () => {
  const num1 = parseInt($("#num1").val())
  const num2 = parseInt($("#num2").val())
  const result = num1 - num2;
  $("#result").text(result);
})
//表驱动代码
const c = {
    events: {
        'click #add1': 'add',
        'click #minus1': 'minus',
        'click #mul2': 'mul',
        'click #divide2': 'divide'
    },
    add() {
        m.update({n: m.data.n + 1})
    },
    minus() {
        m.update({n: m.data.n - 1})
    },
    mul() {
        m.update({n: m.data.n * 2})
    },
    divide() {
        m.update({n: m.data.n / 2})
    },
    autobindEvents() {
        for (let key in c.events) {
            const value = c[c.events[key]]
            const spaceIndex = key.indexOf(' ')
            const part1 = key.slice(0, spaceIndex)
            const part2 = key.slice(spaceIndex + 1)
            v.el.on(part1, part2, value)
        }
    }
}

模块化

    在一个完整的页面应用中,不同的功能,不同的结构可以将其简化为多个不同模块,每个模块的实现的方式以及用
    到的技术都可以不相同。
    使用模块化编程可以减小各个模块之间的影响和联系,可以更方便的优化代码和重构代码,提高我们代码的复用率,
    有利于后期维护。