MVC与MVVM有何本质区别,导致架构设计理念大相径庭?
摘要:一、MVC 架构 1. 角色定义 Model(数据模型):管理数据、业务逻辑、网络请求、数据库操作等 View(视图):负责 UI 展示,接收用户操作并抛出事件,不包含业务逻辑 Controller(控制器):作为调度中心,处理用户交互、调
一、MVC 架构
1. 角色定义
Model(数据模型):管理数据、业务逻辑、网络请求、数据库操作等
View(视图):负责 UI 展示,接收用户操作并抛出事件,不包含业务逻辑
Controller(控制器):作为调度中心,处理用户交互、调用 Model、更新 View
2. 目录结构
src/main/ets/
├── model/
│ └── DataModel.ets
├── view/
│ └── MyView.ets
└── pages/
└── Index.ets // 作为 Controller
3. 代码示例
Model
export class DataModel {
getInfo(): string {
return "鸿蒙 MVC 标准架构";
}
}
View
@Component
export struct MyView {
@Prop content: string;
onButtonClick?: () => void;
build() {
Column() {
Text(this.content)
.fontSize(28)
.margin(15)
Button("点击获取数据")
.onClick(() => {
this.onButtonClick?.();
})
}
}
}
Controller(主页面)
import { DataModel } from '../model/DataModel';
import { MyView } from '../view/MyView';
@Entry
@Component
struct Index {
private dataModel: DataModel = new DataModel();
@State showText: string = "请点击按钮";
build() {
Column() {
MyView({
content: this.showText,
onButtonClick: () => {
this.showText = this.dataModel.getInfo();
}
})
}
.width('100%')
.height('100%')
.justifyContent(FlexAlign.Center)
}
}
4. 执行流程
用户在 View 上点击
View 将事件抛给 Controller
Controller 调用 Model 获取数据
Controller 更新 @State 状态,View 自动刷新
5. 流程图
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ View │───────▶│ Controller │───────▶│ Model │
│ 自定义UI组件 │ 事件 │ 主页面 │ 调用 │ 数据模型 │
└─────────────┘ └─────────────┘ └─────────────┘
▲ │
│ 返回数据 │
└──────────────────────────────────────────────────┘
二、MVVM 架构
1. 角色定义
Model(数据模型):数据、业务逻辑、网络请求、数据库操作
View(页面/组件):只负责 UI 显示,不包含业务逻辑
ViewModel(视图模型):核心枢纽,管理状态、处理逻辑、提供数据绑定,自动驱动 UI 更新
2. 目录结构
src/main/ets/
├── model/
│ └── DataModel.ets
├── viewmodel/
│ └── DataViewModel.ets
├── view/
│ └── NewMyView.ets
└── pages/
└── Index.ets // 仅作为入口,不再承担控制器职责
3. 代码示例
Model
export class DataModel {
getInfo(): string {
return "鸿蒙 MVVM 自动绑定!";
}
}
ViewModel
import { DataModel } from '../model/DataModel';
export class DataViewModel {
private model: DataModel = new DataModel();
message: string = "等待点击";
fetchData() {
this.message = this.model.getInfo();
}
}
View
import { DataViewModel } from '../viewmodel/DataViewModel';
@Component
export struct NewMyView {
@Link vm: DataViewModel;
build() {
Column() {
Text(this.vm.message)
.fontSize(30)
.margin(20)
Button("获取数据")
.onClick(() => {
this.vm.fetchData();
})
}
.justifyContent(FlexAlign.Center)
}
}
主页面(入口)
import { DataViewModel } from '../viewmodel/DataViewModel';
import { NewMyView } from '../view/NewMyView';
@Entry
@Component
struct Index {
@State vm: DataViewModel = new DataViewModel();
build() {
Column() {
NewMyView({ vm: this.vm })
}
.width('100%')
.height('100%')
}
}
4. 执行流程
View 触发点击,调用 ViewModel 的方法
ViewModel 调用 Model 获取数据
Model 返回数据,ViewModel 更新内部状态
View 通过数据绑定自动刷新(无需手动操作)
5. 流程图
┌──────────┐ 双向绑定 ┌────────────┐ ┌──────────┐
│ View │◄──────────────────►│ ViewModel │◄────►│ Model │
│ 页面UI │ 数据自动同步更新 │ 状态+逻辑 │ │ 数据层 │
└──────────┘ └────────────┘ └──────────┘
三、MVC vs MVVM 核心区别
对比维度
MVC
MVVM
数据流
单向:View → Controller → Model → 手动更新 View
双向绑定:View ↔ ViewModel,数据变化自动驱动 UI
职责划分
Controller 承担调度、更新 UI、调用 Model,易臃肿
ViewModel 专注状态与逻辑,View 仅负责展示,职责单一
依赖关系
View 依赖 Controller,Controller 依赖 Model
View 依赖 ViewModel,ViewModel 依赖 Model,View 与 Model 完全隔离
可测试性
需要模拟 UI 环境,测试成本较高
ViewModel 无 UI 依赖,可用单元测试直接验证
代码量
随业务增长,Controller 代码膨胀,维护成本上升
通过数据绑定减少模板代码,状态集中管理
四、总结与选型建议
1. 核心理念对比
MVC:手动调度,Controller 作为“中间人”协调 View 与 Model,适合逻辑简单的场景。
MVVM:自动绑定,ViewModel 作为“桥梁”连接 View 与 Model,通过数据驱动 UI,代码更解耦、更易维护。
2. 鸿蒙开发中的实践
鸿蒙 ArkUI 采用 声明式 UI,天然契合 MVVM 思想。通过 @State、@Link、@Provide 等装饰器,可以轻松实现数据与视图的双向同步。
推荐在复杂业务中使用 MVVM 模式,将状态提升到 ViewModel,保持 View 的纯净与可复用性。
3. 如何选择
如果你的页面逻辑非常简单(如仅展示静态数据),MVC 足够。
一旦涉及表单交互、状态共享、多组件通信或复杂业务逻辑,建议使用 MVVM,它将大幅提升代码的可维护性和可测试性。
