目录

安卓应用架构模式-MVC-MVP-MVVM有什么区别

安卓应用架构模式 MVC MVP MVVM有什么区别?

在 Android 开发中, MVCMVPMVVM 是三种常见的架构模式,它们的目标都是通过分层解耦代码,提升可维护性和可测试性。以下是它们的核心区别和实际应用对比:

1. 核心职责划分

架构模式分层结构各层职责
MVCModel-View-Controller- Model : 数据逻辑(数据库、网络请求) - View : UI 显示(XML布局) - Controller : 业务逻辑(Activity/Fragment)
MVPModel-View-Presenter- Model : 数据逻辑 - View : UI 显示 + 接口(Activity/Fragment 实现) - Presenter : 业务逻辑(纯 Java/Kotlin 类)
MVVMModel-View-ViewModel- Model : 数据逻辑 - View : UI 显示(XML + Activity/Fragment) - ViewModel : 业务逻辑 + 数据驱动(通过 LiveData/Flow 暴露数据)

2. 数据流向

架构模式数据流
MVC单向 :用户操作 → Controller → 更新 Model → 通知 View 刷新(但 Controller 可能直接操作 View)
MVP双向 :用户操作 → View → Presenter → Model → Presenter → View
MVVM双向 :用户操作 → View → ViewModel → Model → ViewModel → View(通过数据绑定自动更新)

3. 核心优缺点对比

MVC(传统 Android 开发模式)
  • 优点

    • 结构简单,适合小型项目。
  • 缺点

    • Controller 臃肿 :Activity/Fragment 同时承担 View 和 Controller 职责。
    • 测试困难 :业务逻辑和 UI 耦合,难以单元测试。
MVP(解耦业务逻辑)
  • 优点

    • 职责清晰 :Presenter 独立于 Android API,便于测试。
    • View 被动 :通过接口定义交互,降低耦合。
  • 缺点

    • 接口冗余 :需要为每个 View 定义大量接口。
    • 手动绑定 :需在 View 中主动调用 Presenter 方法。
MVVM(Jetpack 推荐模式)
  • 优点

    • 自动更新 :通过数据绑定(如 LiveData + DataBinding )实现 UI 自动刷新。
    • 生命周期感知 :ViewModel 自动管理数据,避免内存泄漏。
    • 代码简洁 :减少手动更新 UI 的代码。
  • 缺点

    • 学习成本 :需掌握 Jetpack 组件(ViewModel、LiveData 等)。
    • 过度绑定 :不当使用可能导致逻辑分散到 XML。

4. 代码示例对比

MVC(典型问题)
// Activity 承担 Controller + View 职责
class UserActivity : AppCompatActivity() {
    private lateinit var textView: TextView
    private val userModel = UserModel()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_user)
        textView = findViewById(R.id.text_view)
        
        // 直接操作 Model 和 View
        userModel.fetchUser { user ->
            textView.text = user.name // Controller 直接更新 View
        }
    }
}
MVP(解耦实现)
// View 接口
interface UserView {
    fun showUserName(name: String)
}

// Presenter 类
class UserPresenter(private val view: UserView) {
    private val userModel = UserModel()

    fun loadUser() {
        userModel.fetchUser { user ->
            view.showUserName(user.name)
        }
    }
}

// Activity 实现 View 接口
class UserActivity : AppCompatActivity(), UserView {
    private lateinit var presenter: UserPresenter
    private lateinit var textView: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_user)
        textView = findViewById(R.id.text_view)
        presenter = UserPresenter(this)
        presenter.loadUser()
    }

    override fun showUserName(name: String) {
        textView.text = name
    }
}
MVVM(Jetpack 实现)
// ViewModel
class UserViewModel : ViewModel() {
    private val _user = MutableLiveData<User>()
    val user: LiveData<User> = _user

    init {
        loadUser()
    }

    private fun loadUser() {
        UserModel.fetchUser { user ->
            _user.value = user
        }
    }
}

// Activity + DataBinding
class UserActivity : AppCompatActivity() {
    private lateinit var binding: ActivityUserBinding
    private val viewModel: UserViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_user)
        binding.lifecycleOwner = this
        binding.viewModel = viewModel // XML 中直接绑定 user.name
    }
}

5. 适用场景

  • MVC :快速原型开发或简单页面,不推荐复杂项目。
  • MVP :需要高测试覆盖率的项目(Presenter 可独立测试)。
  • MVVM :中大型项目,结合 Jetpack 组件(推荐 Google 官方方案)。

6. 总结

维度MVCMVPMVVM
代码耦合度高(Controller 臃肿)低(通过接口解耦)低(数据驱动)
测试难度困难容易(Presenter 可单元测试)容易(ViewModel 可测试)
维护性较好优秀
学习曲线简单中等中等(需 Jetpack 知识)

7. 现代 Android 开发推荐

  • 优先选择 MVVM :结合 Jetpack 组件(ViewModel + LiveData + DataBinding/Room)实现高效开发。

  • 辅助工具

    • Dagger/Hilt :依赖注入,进一步解耦。
    • Jetpack Compose :声明式 UI,天然适合 MVVM。

通过理解这三种架构的核心差异,开发者可以更合理地选择适合项目需求的模式。对于新项目,强烈建议采用 MVVM + Jetpack 的现代化架构方案。