浅析 MVC

MVC 三个对象分别做什么,给出伪代码示例

MVC是三个单词的首字母缩写,它们是Model(模型)、View(视图)和Controller(控制)。

这个模式认为,程序不论简单或复杂,从结构上看,都可以分成三层。

1)最上面的一层,是直接面向最终用户的"视图层"(View)。它是提供给用户的操作界面,是程序的外壳。

2)最底下的一层,是核心的"数据层"(Model),也就是程序需要操作的数据或信息。

3)中间的一层,就是"控制层"(Controller),它负责根据用户从"视图层"输入的指令,选取"数据层"中的数据,然后对其进行相应的操作,产生最终结果。

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

const m = {
  data :{
    time : new Date()
  },
  update: function(data){
    m.data.time = data
  }
}
//model得到数据
const v = { el: null, html:`<span>{{time}}<span><button id="getTime">得到时间</button>`, init: function(container){ v.el = document.querySelector(container) }, render: function(time){ v.el.innerHTML = v.html.replace('{{time}}',time) }, selector:function(btn){ return document.querySelector(btn)   }
} //view展示数据和重新渲染
const c = { init:function(container){ v.init(container) v.render(c.deal()) c.autoBindEvents() }, events:{'click #getTime':'reset'},
//表驱动的数据 deal:function(){ let hour = m.data.time.getHours() let minute = m.data.time.getMinutes() let sec = m.data.time.getSeconds() return `${hour}:${minute}:${sec}` }, reset:function(){ m.update(new Date()) v.render(c.deal()) c.autoBindEvents() }, 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.selector(part2).addEventListener(part1, value) } }
//表驱动的功能部分
}
//control负责处理m的数据和控制m和v c.init('#app')
//往需要的html标签里写入当前时间,按钮可以更新时间

  

EventBus 有哪些 API,是做什么用的,给出伪代码示例

const EventBusObj = new EventBus()
const f1=(p)=>{
    console.log('f1')
    console.log(p)
}
const f2=(p)=>{
    console.log('f2')
    console.log(p)
}
//注册
EventBusObj.$on('event1',f1)

//监听一次
EventBusObj.$once('event1',f2)
      
 
//触发
EventBusObj.$emit('event1',{a:1})
//移除event1的f1方法
EventBusObj.$remove('event1',f1)   

  

表驱动编程是做什么的(可以自己查查资料)

  代码大全》对表驱动编程的描述:
表驱动方法是一种使你可以在表中查找信息,而不必用逻辑语句(if 或 case)来把他们找出来的方法。事实上,任何信息都可以通过表来挑选。在简单的情况下,逻辑语句往往更简单而且更直接。但随着逻辑链的复杂,表就变得越来越富于吸引力了。
  表驱动编程的意义在于逻辑与数据的分离。(类似于事件委托)
例如:if-else

function translate(term) {
    if (term === '1') {
        return '一'
    } else if (term === '2') {
        return '二'
    } else if (term === '3') {
        return '三'
    } else {
        return '???'  
    }
}

// 如果想添加一个新的名词翻译,需要再添加一个if-else逻辑,例如:
function translate(term) {
    if (term === '1') {
        return '一'
    } else if (term === '2') {
        return '二'
    } else if (term === '3') {
        return '三'
    } else if (term === '4') {   
        // 此处添加了一个新的名词翻译
        return '四'
    } else {
        return '???'  
    }
}
表驱动:

function translate(term) {
    let terms = {
        '1': '一',
        '2': '二',
        '3': '三'
    }
    return terms[term];
}

// 如果想添加一个新的名词翻译,只需要在terms中添加一个新的表项,不需要修改整个逻辑
function translate(term) {
    let terms = {
        '1': '一',
        '2': '二',
        '3': '三'
        '4': '四'   // 添加一个新的名词翻译
    }
    return terms[term];
}

  

我是如何理解模块化的

  模块化编程我的理解就是把需要的代码按照其功能分割开,这样必要时可以复用,代码可以不用揉在一起,难以管理和修改。

posted @ 2021-02-01 22:49  时间观测者  阅读(49)  评论(0编辑  收藏  举报