浅析MVC

132 阅读3分钟

MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个 基本部分:数据模型(Model)、视图(View)、和控制器(Controller)。MVC不是一种技 术,而是一种理念。

MVC模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并使软件某一部 分的重复利用成为可能。除此之外,此模式通过对复杂度的简化,使程序结构更加直观。

数据模型(Model):模型持有所有的数据、状态和程序逻辑。用于封装与应用程序的业务逻辑相 关的数据以及对数据的处理方法。

视图(View):负责界面的布局和显示。处理控制器里的HTML资料并且将它们插入DOM中。能 够实现数据有目的的显示。访问它监视的数据模型(Model)。

控制器(Controller):负责模型和界面之间的交互。定义用户界面对用户输入的响应方式,起到 不同层面间的组织作用,用于控制应用程序的流程和处理事件并做出响应。“事件”包括用户的行为和数据Model上的改变。

/** 模拟 Model, View, Controller */

/** Model 负责存放数据资料 */
const Model = {
    data: {
      数据源
    },
    create: {
      增加数据
    },
    delete: {
      删除数据
    },
    update(data) {
      Object.assign(m.data, data) //用新数据替换旧数据 
      eventBus.trigger('m:update') //eventBus触发'm:update'信息,通知View刷新界面 
    },
    get: {
      获取数据
    }
  }
  /** View 负责将资料输出给用户*/
const View = {
    el: 要刷新的元素,
    html: '要显示在页面上的内容'
    init() {
      v.el: 需要刷新的元素
    },
    render() {
      刷新页面
    }
  }
  /** Controller 作为连接 M 和 V 的桥梁 */

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

EventBus

事件总线是一种设计模式,可以用于简化不同组件之间的通信。它也可以被认为是发布/订阅。组 件可以监听事件总线来知道什么时候做它们做的事情。 基本API有on(监听事件)、trigger(emit)(触发事件)、off(取消监听)方法。

//EventBus.js 
class EventBus {
  constructor() {
    this._eventBus = $(window)
  }
  on(eventName, fn) {
    return this._eventBus.on(eventName, fn)
  }
  trigger(eventName, data) {
    return this._trigger.trigger(eventName, data)
  }
  off(eventName, fn) {
    return this._eventBus.off(eventName, fn)
  }
}
export default EventBus //new.js 
import EventBus from 'EventBus.js'
const e = new EventBus()
e.on()
e.trigger()
e.off()

表驱动编程

表驱动方法是一种使你可以在表中查找信息,而不必用逻辑语句来把它们找出来的方法。事实上, 凡是能通过逻辑语句来选择的事物,都可以通过查表来选择。对简单的情况而言,使用逻辑语句更 为容易和直白。但随着逻辑链的越来越复杂,查表法也就愈发显得更具吸引力。 表驱动编程的意义在于逻辑与数据的分离。 优点: • 提高了程序的可读性。 • 减少了重复代码。 • 可扩展性。 • 程序有一个明显的主干。 • 降低了复杂度。 用一个例子展示,今天是几号

const day = new Date().getDay()
let day_zh;
if (day === 0) {
  day_zh = '1号'
} else if (day === 1) {
  day_zh = '2号'
}
...
else {
  day_zh = '31号'
}
// 或者 用 switch case switch(day) {
case 0:
  day_zh = '1号'
  break;
case 1:
  day_zh = '2号'
  break;...
  }

实现同样功能的一种更简单、更容易修改的方法是把这些数据存到一张表里面。

const mouth = ['1号', '2号',..., '31号'] 
const day = new Date().getDay()
const day_zh = mouth[day]

模块化编程

模块化编程(modular programming)是一种软件设计技术,它将软件分解为若干独立 的、可 替换的、具有预定功能的模块,每个模块实现一个功能,各模块通过接口(输入输出 部分)组合 在一起,形成最终程序。 模块化编程具有易设计、 易实现、易测试、易维护、可重用的优点。