一、前言:为什么需要架构模式?
在软件开发中,随着项目复杂度增加,代码很容易变得混乱不堪。架构模式的出现就是为了解决这个问题,它像城市的规划图一样,让不同功能的代码各司其职。今天我们就来聊聊最常用的两种前端架构模式:MVC 和 MVVM。
二、MVC 架构模式
2.1 什么是 MVC?
MVC 是 Model-View-Controller 的缩写,它将应用程序分为三个核心部分:

-
Model(模型):负责数据和业务逻辑
-
View(视图):负责界面显示
-
Controller(控制器):接收用户输入,协调 Model 和 View
2.2 代码示例
原生 JavaScript 实现
<!-- View -->
<div id="app">
<h1 id="title"></h1>
<button id="btn">更改标题</button>
</div>
<script> // Model
class Model {
constructor() {
this.title = "初始标题"
}
setTitle(newTitle) {
this.title = newTitle
}
}
// Controller
class Controller {
constructor(model, view) {
this.model = model
this.view = view
// 绑定事件
document.getElementById('btn').addEventListener('click', () => {
this.changeTitle()
})
}
changeTitle() {
const newTitle = prompt('输入新标题:')
this.model.setTitle(newTitle)
this.view.update(this.model.title)
}
}
// View
class View {
update(title) {
document.getElementById('title').textContent = title
}
}
// 初始化
const model = new Model()
const view = new View()
new Controller(model, view)
view.update(model.title) // 初始化视图 </script>三、MVVM 架构模式
3.1 什么是 MVVM?
MVVM 是 Model-View-ViewModel 的缩写,它是 MVC 的进化版:

-
Model(模型):同样负责数据和业务逻辑
-
View(视图):负责界面显示
-
ViewModel(视图模型):连接 View 和 Model 的桥梁,实现数据绑定
3.2 MVVM 的核心:数据绑定
MVVM 最大的特点是数据双向绑定:
-
当 Model 改变时,View 自动更新
-
当 View 中用户输入改变时,Model 自动更新
3.3 Vue.js 实现示例
<div id="app">
<!-- View -->
<h1>{{ title }}</h1>
<input v-model="title">
<button @click="changeTitle">更改标题</button>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
<script> // 创建Vue实例(ViewModel)
new Vue({
el: '#app',
// Model
data: {
title: '初始标题'
},
// 方法
methods: {
changeTitle() {
this.title = prompt('输入新标题:', this.title)
}
}
}) </script>四、MVC vs MVVM 对比
| 特性 | MVC | MVVM |
|---|---|---|
| 数据流向 | 单向(Controller 控制) | 双向(自动绑定) |
| 耦合度 | 较低 | 更低 |
| 代码量 | 较多 | 较少 |
| 适用场景 | 传统 Web 应用 | 现代前端框架 |
| 学习曲线 | 平缓 | 较陡 |
五、实际应用场景
5.1 适合使用 MVC 的场景
-
传统的服务器端渲染应用
-
需要精细控制渲染过程的项目
-
团队成员对 MVC 模式更熟悉的情况
5.2 适合使用 MVVM 的场景
-
复杂的前端单页应用 (SPA)
-
需要快速开发迭代的项目
-
数据驱动型的界面开发
六、现代框架中的实现
6.1 React 中的类 MVC 实现
虽然 React 自称是 “视图库”,但配合 Redux 可以形成类 MVC 架构:
import React, { Component } from 'react';
import { createStore } from 'redux';
// Model (Redux部分)
const initialState = { title: '初始标题' };
function reducer(state = initialState, action) {
switch(action.type) {
case 'CHANGE_TITLE':
return { ...state, title: action.payload };
default:
return state;
}
}
const store = createStore(reducer);
// View
class App extends Component {
state = store.getState();
componentDidMount() {
store.subscribe(() => {
this.setState(store.getState());
});
}
changeTitle = () => {
const newTitle = prompt('输入新标题:');
// Controller逻辑
store.dispatch({ type: 'CHANGE_TITLE', payload: newTitle });
}
render() {
return (
<div>
<h1>{this.state.title}</h1>
<button onClick={this.changeTitle}>更改标题</button>
</div>
);
}
}6.2 Angular 中的 MVVM 实现
Angular 是典型的 MVVM 框架:
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
template: `
<h1>{{title}}</h1>
<input [(ngModel)]="title">
<button (click)="changeTitle()">更改标题</button>
`
})
export class AppComponent {
// Model
title = '初始标题';
// ViewModel方法
changeTitle() {
this.title = prompt('输入新标题:', this.title) || this.title;
}
}七、如何选择?
根据项目需求选择:
-
选择 MVC:
-
需要更多控制权
-
项目结构相对简单
-
团队熟悉传统模式
-
-
选择 MVVM:
-
追求开发效率
-
复杂的数据驱动界面
-
使用现代前端框架
-
八、总结
-
MVC 通过 Controller 明确控制数据流向,适合传统 Web 开发
-
MVVM 通过数据绑定简化开发,适合现代前端框架
-
理解两者差异有助于选择合适的技术栈
-
实际开发中,框架往往混合了多种模式
无论选择哪种架构,清晰的代码组织和职责分离才是最终目的。希望本文能帮助你理解这两种重要的架构模式!
开启新对话