浅析MVC

146 阅读2分钟

什么是MVC

MVC是一种软件设计模式.它强调分离软件的业务逻辑和显示.这种“分离”提供了更好的分工、改进与维护。

  1. M:模型(model),用来保存数据
  2. V:视图(view),用户界面
  3. C:控制器(controller),业务逻辑层面。

这各个模块之间可以互相通信,不同的人有不同的看法,例如

4. 各个部分的代码实现

  • M:
const m = {
    data: {
        n: parseInt(localStorage.getItem('n')),
    },
    create() { },
    delete() { },
    update(data) {
        Object.assign(m.data, data)//意思就是把更新的这个data传给m.data
        eventBus.trigger('xxx')
        localStorage.setItem('n', m.data.n)

    },
    get() { }

}
  • V:
const v = {
    container: null,
    html: ` <div id="app1">
    <div class="output">
        <span id="number">{{number}}</span>
    </div>
    <div class="actions">
        <button id="add1">+1</button>
        <button id="minus1">-1</button>
        <button id="mul2">*2</button>
        <button id="divide2">÷2</button>
    </div>
    </div>`,

    init(container) {
        v.container = $(container)
    },
    render(n) {
        if (v.container.children.length === 0) {
            $(v.html.replace("{{number}}", n)).appendTo(v.container)
        } else {
            v.container.empty()
            $(v.html.replace("{{number}}", n)).appendTo(v.container)

        }

    }
}
  • C:
const c = {
    init(container) {
        v.init(container)
        v.render(m.data.n)
        c.autoBlindEvents()
        eventBus.on('xxx', () => {

            v.render(m.data.n)

        })
    },
    events: {
        'click #add1': 'add',
        'click #minus1': 'minus',
        'click #mul2': 'mul',
        'click #divide2': 'div'

    },
    add() {

        m.update({ n: m.data.n + 1 })


    },
    minus() {
        m.update({ n: m.data.n - 1 })
    },
    mul() {
        m.update({ n: m.data.n * 2 })
    },
    div() {
        m.update({ n: m.data.n / 2 })
    },
    autoBlindEvents() {
        for (let key in c.events) {
            const value = c[c.events[key]]
            let spaceIndex = key.indexOf(' ')
            let part1 = key.slice(0, spaceIndex)
            let part2 = key.slice(spaceIndex + 1)
            console.log(part1, ",", part2)
            v.container.on(part1, part2, value)
        }
    }

EventBus

EventBus 是一种设计模式,主要用于组件/对象间通信的优化简化,jquery和vue构造出来的对象都有监听事件的方法,我们只需要构造一个对象,然后调用他的on和trigger方法就可以实现组件之间的通信。例如M和C之间的通信,因为m.update()调用触发xxx事件,而 c.init就会接收到, 当接收以后,调用一个函数,再次渲染网页,

const eventBus = $(window)//$表示jquery
const m = {
    data: {
        index: parseInt(localStorage.getItem(localKey)) || 0,
    },
    create() { },
    delete() { },
    update(data) {
        Object.assign(m.data, data)//意思就是把更新的这个data传给m.data
        eventBus.trigger('xxx')//触发xxx事件
        localStorage.setItem(localKey, m.data.index)

    },
    }
    const c = {
    init(container) {
        v.init(container)
        v.render(m.data.index)
        c.autoBlindEvents()
        eventBus.on('xxx', () => {
            v.render(m.data.index)

        })//接收到消息,将网页再次渲染
    }
    }
  1. EventBus 常用API,上述例子已经介绍了其中两个,一个叫做trigger 触发函数, on 监听函数,还有一个叫做off 停止监听函数。

表驱动编程

这个概念比较抽象,简单讲是指用查表的方法获取值,表驱动法是一种编程模式,表里可以存数据,也可以存指令,或函数等都可以。在数值不多的时候我们可以用逻辑语句(if/else 或 case do)的方法来获取值,但随着数值的增多逻辑语句就会越来越长,此时表驱动法的优势就显现出来了。 一个简单的例子来做演示

function color(flower){
    if(flower==="rose"){
        console.log(flower+'is red')
    }else if(flower==="chrysanthemum"){
        console.log(flower+'is yellow')
    }else if(){
       
    }
    //....等等
}
换用表驱动编程变为如下
const flowerList={
    "rose":red
    "chrysanthemum":yellow
    "Gardenia":white
    
}
function color(flower){
    if(flower in flowerList){
        console.log(flower+'is'+flowerList[flower])
    }else {
        console.log('没有此花')
    }
    
}

目前看来或许两者差异不大,但是当花的种类非常之多的时候,运用方法二会明显减少重复代码量。

模块化

模块化可大可小,可以是把一个js文件当做一个模块也可以是把一个函数一个对象当成一个模块,使用模块化的好处就是把每个不相同的功能分成不同模块,互不依赖,互不影响,有利于代码的维护和读写,更重要的是再也不用写大量重复的代码。