M:即Model,Model类封装了数据模型和相应的网络操作等。
1.MVC
Android中的MVC:
View:即xml文件
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
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 有时候还可以给你的内存数据和数据库数据做关联监听,让你的
这三种数据实现进⼀步的联动。
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 是⼀个框架,像⼀个库:它提供数据绑定的功能特性