1、MVC简介
MVC是Model-View-Controller的简称,即模型层-视图层-控制层。按照这种设计我们可以将业务逻辑、视图显示以及数据层面的代码进行分离。下面说下MVC在Android中对应的角色:
- M:Model(模型层),是程序中处理数据的部分,比如对数据库的操作或者网络请求。
- V:View(视图层),对应程序中的XML文件或自定义控件,主要是视图的显示。
-
C:Controller(控制层),对应应用程序中的Activity、Fragment或Adapter。主要处理用户交互部分,接收用户事件调用Model获取数据,然后返回给View进行展示。
MVC简单来说通过Controller来操作Model层的数据并返回给View展示。
mvc.png
2、MVC在Android的使用
下面我们使用MVC来完成一个简单的登录功能。
Model层
/**
* Model层 数据处理
*/
class LoginModel {
fun login(userName: String, pwd: String, callBack: DataCallBack<AccountInfo>) {
Handler().postDelayed({
val isSuccess = Random.nextBoolean()
if (isSuccess) {
callBack.onSuccess(AccountInfo(userName, pwd))
} else
callBack.onFailure()
}, 2000)
}
}
Controller层
/**
* Controller层
*/
class LoginActivity : AppCompatActivity() {
private lateinit var model: LoginModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_login)
model = LoginModel()
btn_login.setOnClickListener {
val userName = getUserName()
val pwd = getPwd()
login(userName, pwd)
}
}
/**
* 处理用户点击 调用Model中的登录接口,并通过注册监听的方式
* 来实现Model和View的通信
*/
private fun login(userName: String, pwd: String) {
model.login(userName, pwd, object : DataCallBack<AccountInfo> {
override fun onSuccess(t: AccountInfo) {
showSuccessView()
}
override fun onFailure() {
showFailView()
}
})
}
/**
* 以下几个方法是对View的操作
*/
/**
* 获取输入的用户
*/
private fun getUserName(): String {
return et_username.text.toString()
}
/**
* 获取输入的密码
*/
private fun getPwd(): String {
return et_pwd.text.toString()
}
/**
* 显示登陆成功的界面
*/
private fun showSuccessView() {
tv_result.text = "登陆成功"
}
/**
* 显示登陆失败的界面
*/
private fun showFailView() {
tv_result.text = "登陆失败"
}
}
从上面代码可以看出:
- 由于XML文件视图功能较弱,所以Activity不得不承担视图的工作,Activity不是一个标准的Controller,它的首要工作是初始化界面,在其中还需要处理业务逻辑,调用Model获取数据以及View视图的展示。随着业务逻辑的复杂性提高,Activity必然越来越臃肿。
- MVC只能说一定程度上对Model和View进行了分离,View和Model依然可以直接通信,并没有做到View和Model的解耦。
- Controller和View耦合严重,很难做到复用。
可见MVC还是存在很多问题的,这也是MVP出现的原因,MVP很好的解决了这些问题。
- Controller和View耦合严重,很难做到复用。
网友评论