浅析MVC

207 阅读2分钟

什么是MVC

  • M:模型(Model):保存数据
  • V:视图(View):用户界面
  • C:控制器(Controller):业务逻辑

各部分之间的通信方式如下

  • 传统意义上的MVC各个部分之间的通信是单向的

  • View 传送指令到 Controller,Controller 完成业务逻辑后,要求 Model 改变状态,Model 将新的数据发送到 View,用户得到反馈

各部分伪代码实现

Model

const model = {
    data: { 程序需要操作的数据或信息 },
    create: { 增数据 },
    delete: { 删数据 },
    update(data) { 
       Object.assign(m.data, data) //使用新数据替换旧数据
       eventBus.trigger('m:upate') // eventBus触发'm:update'信息, 通知View刷新 
    },
    get:{ 获取数据 } 
}

View

const view = {
    el: 需要刷新的元素,
    html: `<h1>M V C</h1>....显示在页面上的内容`
    init(){
        v.el: 需要刷新的元素
    },
    render(){ 刷新页面 }
}

Controller

const controller = {
   init(){
      v.init() // View初始化
      v.render() // 第一次渲染
      c.autoBindEvents() // 自动的事件绑定
      eventBus.on('m:update', () => { v.render() }) // 当eventBus触发'm:update'时View刷新
   },
   events:{ 事件以哈希表方式记录 },
   method() {
      data = 改变后的新数据
      m.update(data)
   },
   autoBindEvents() { 自动绑定事件 }
}

EventBus

  • EventBus是一种设计模式,主要用于组件或对象间的通信简化,EventBus包含很多方法,如:on方法用来监听事件,trigger方法用来触发事件
const model = {
    data: {
        i: come from somewhere
    },
    update(data) {
        Object.assign(model.data, data)
        eventBus.trigger('model:updated')   //触发 model:updated 事件
    }
}
const controller = {
    //初始化方法
    init() {
        //初始化渲染
        view.render(model.data.i)
        eventBus.on('model:updated', () => {    //监听 model:updated 方法并渲染更新页面
            v.render(model.data.i)
        })
    },
}

表驱动编程

  • 表驱动编程是一种很重要的编程思想,它的理念是从大量相似的代码中抽取出本质的东西,组成哈希表,利用表进行编程,以减少重复代码。

举一个简单的例子

function person(name){
    if(name === 'Tom'){
        console.log('爱好是打篮球')
    }else if(name === 'Jack'){
        console.log('爱好是打游戏')
    }else if(name === 'Xiaofang'){
        console.log('爱好是学习')
    }else if(){
        
    }
    ...//等等
}

看到上述代码会发现,一个查看爱好的函数如果用if else语句会变成垃圾代码,如果用哈希表来映射这些关系,就会变得非常好

const hashmap={
    'Tom':'篮球',
    'Jack':'游戏',
    'Xiaofang':'学习'
    //等等...
}
function person(name){
    if(name in hashmap){
        console.log(name+"的爱好是"+hashmap[name])
}

如此,就去除了所有重复的代码,使代码变得简洁好看。

模块化编程

  • 模块化可以实现代码的可复用性,使程序的结构更加的清晰,方便后期维护。
  • 模块与模块和之间是相互独立的,互不影响。