MVC、MVP、MVVM理解

M:即Model,Model类封装了数据模型和相应的网络操作等。

1.MVC

MVC

简单逻辑

Android中的MVC:

View:即xml文件


View

Controller:即Activity

class MvcActivity : AppCompatActivity() {
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val data = DataCenter.getData()
    data1View.setText(data[0])
    data2View.setText(data[1])
  }
}

Model:数据类

class DataCenter {
  companion object {
    fun getData() = listOf("Hi", "zthsa")
  }
}

可以看到MVC中Controller和View的耦合太高了,原本的MVC应该是Controller操作Model然后Model更新View,但从以上代码来说,Activity即操作了Model也实现了View的更新

2.MVP

MVP

View:

class MvpActivity : AppCompatActivity(), Presenter.IView {
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    Presenter(this).init()
  }

  override fun showData(data: List) {
    data1View.setText(data[0])
    data2View.setText(data[1])
  }
}

Presenter:参数为实现了IView接口的View(这里为Activity,因为Activity中set了View),该接口里有个方法,实现了对View展示数据;内部还有方法init()实现了数据的初始化操作

class Presenter(private val iView: IView) {
  fun init() {
    val data = DataCenter.getData()
    iView.showData(data)
  }

  interface IView {
    fun showData(data: List)
  }
}

Model:

class DataCenter {
  companion object {
    fun getData() = listOf("Hi", "zthsa")
  }
}

MVP解决了MVC中Controller和View耦合过高的问题,但事实上MVC通过修改自身代码也能解决该问题
将View拆为一个类:

class MvcView(context: Context?, attrs: AttributeSet?) : LinearLayout(context, attrs) {
  fun showData(data: List) {
    data1View.setText(data[0])
    data2View.setText(data[1])
  }
}

并在Controller中通知调用showdata()但不关心如何showdata

class MvcActivity : AppCompatActivity() {
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main_mvc)

    val data = DataCenter.getData()
    dataView.showData(data)
  }
}

所以其实总的来说MVC和MVP的区别并没有那么大,它们两者都是为了让业务逻辑更加的独⽴。

3.MVVM

MVVM 就是⼀个加了数据的 MVP(或者 MVC)。
但和 MVVM 相关的 Jetpack 组件是 DataBinding,⽽不是 ViewModel
其次,我们要了解什么是数据绑定?

什么是数据绑定:

数据一般包括外部数据(数据库数据、⽹络数据)、内存数据(Java 代码中的变量)、表现数据(界⾯中展示的数据)
数据绑定即外部表现数据和内存数据互相⾃动更新。
另外,MVVM 有时候还可以给你的内存数据和数据库数据做关联监听,让你的
这三种数据实现进⼀步的联动。

MVVM

ViewModel:

class ViewModel(data1View: EditText, data2View: EditText) {
  var data1: StringAttr = StringAttr()
  var data2: StringAttr = StringAttr()

  init {
    ViewBinder.bind(data1View, data1)
    ViewBinder.bind(data2View, data2)
  }

  fun init() {
    val data = DataCenter.getData()
    data1.value = data[0]
    data2.value = data[1]
  }

//实现表现数据和内存数据绑定
class ViewBinder {
  companion object {
    fun bind(editText: EditText, stringAttr: StringAttr) {
      editText.doAfterTextChanged {
        if (!TextUtils.equals(stringAttr.value, it)) {
          stringAttr.value = it.toString()
          println("表现数据通知内存啦!${it}")
        }
      }
      stringAttr.onChangeListener = object : StringAttr.OnChangeListener {
        override fun onChange(newValue: String?) {
          if (!TextUtils.equals(newValue, editText.text)) {
            editText.setText(newValue)
            println("内存通知表现数据啦!${newValue}")
          }
        }
      }
    }
  }
}
}

Model:

class DataCenter {
  companion object {
    fun getData() = listOf("Hi", "zthsa")
  }
}
class StringAttr {
  var value: String? = null
    set(value) {
      field = value
      onChangeListener?.onChange(value)
    }
  var onChangeListener: OnChangeListener? = null

  interface OnChangeListener {
    fun onChange(newValue: String?)
  }
}

View:

class MvvmActivity : AppCompatActivity() {
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    ViewModel(data1View, data2View).init()
  }
}
  • MVC MVP 的架构性质更强:它提供设计规范
  • ⽽ MVVM 是⼀个框架,像⼀个库:它提供数据绑定的功能特性

你可能感兴趣的:(MVC、MVP、MVVM理解)