根据一些MVC/MVP/MVVM的错误认识我们将MVX分为
- M层 负责业务数据和业务数据处理
VX归属表现层
- V层 负责表现层视图
- X层 负责表现层逻辑
根据Android App的设计架构:MVC,MVP,MVVM与架构经验谈 ,我们知道

- MVC中M层依赖V层
- MVP中M层不依赖V层
一.最一般情况下我们的代码
-
已经独立出了model层,负责获取业务数据和处理业务数据
-
Activity具有M和C的功能,负责表现层逻辑和表现层视图
2.1 表现层逻辑
if(userInfoIsChanged(userInfo))2.2 表现层视图
setUserInfo(userInfo)
class Activity{
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
model.getUserInfo(userInfo:UserInfo ->
if(userInfoIsChanged(userInfo)){
showUserInfo(userInfo)
}
)
}
private fun showUserInfo(userInfo:Userinfo){
}
private fun userInfoIsChanged(userInfo:Userinfo):Boolean{
}
}
class Model{
fun getUserInfo(callBack:CallBack){
val userInfo= //获取UserInfo..
callBack(userInfo)
}
}
二.一点点的改进
M与C都由Activity充当,现在我们将M与C的职责分开
由Activity充当View,
单独新建Controller类
此时
- Model为单独创建
- View由Activity充当
- Controller单独创建
interface MyView{
fun showUserInfo(userInfo:Userinfo)
}
class Activity: MyView{
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
model.getUserInfo(userInfo:UserInfo ->
if(controller.userInfoIsChanged(userInfo)){
showUserInfo(userInfo)
}
)
}
private fun showUserInfo(userInfo:Userinfo){
//实现代码
}
}
class Cotroller{
fun userInfoIsChanged(userInfo:Userinfo){
}
}
class Model{
fun getUserInfo(callBack:CallBack){
val userInfo= //获取UserInfo..
callBack(userInfo)
}
3. 看看改进后MVC的关系
此时M层与V层是解绑的,M层不依赖V层,所以此时更像是MVP的关系。
Controller通过Model获取数据后,Model不直接调用View更改数据,而由Controller调用View更改数据

那么MVC应该是怎样的呢
如下
注意:Controller部分的代码改动,
Controller中的userInfoIsChanged方法需要MyView,(即Controller依赖了MyView)
这就是MVC了
class Activity: MyView{
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
model.getUserInfo(userInfo:UserInfo ->
controller.userInfoIsChanged(userInfo),
this
)
}
private fun showUserInfo(userInfo:Userinfo){
//实现代码
}
}
interface MyView{
fun showUserInfo(userInfo:Userinfo)
}
class Cotroller{
fun userInfoIsChanged(userInfo:Userinfo){
myView.setUserInfo(userInfo)
}
}
class Model{
fun getUserInfo(callBack:CallBack,myView:MyView){
val userInfo= //获取UserInfo..
myView.showUserInfo(userInfo)
}
三.总结
我们平时使用的是将VP功能聚合到Activity的MVP,如下
class Activity{
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
model.getUserInfo(userInfo:UserInfo ->
if(userInfoIsChanged(userInfo)){
showUserInfo(userInfo)
}
)
}
private fun showUserInfo(userInfo:Userinfo){
}
private fun userInfoIsChanged(userInfo:Userinfo):Boolean{
}
}
class Model{
fun getUserInfo(callBack:CallBack){
val userInfo= //获取UserInfo..
callBack(userInfo)
}
}