Android中关于MVC与MVP的一点思考

481 阅读2分钟

根据一些MVC/MVP/MVVM的错误认识我们将MVX分为

  1. M层 负责业务数据和业务数据处理

VX归属表现层

  1. V层 负责表现层视图
  2. X层 负责表现层逻辑

根据Android App的设计架构:MVC,MVP,MVVM与架构经验谈 ,我们知道

  1. MVC中M层依赖V层
  2. MVP中M层不依赖V层

一.最一般情况下我们的代码

  1. 已经独立出了model层,负责获取业务数据和处理业务数据

  2. 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类
此时

  1. Model为单独创建
  2. View由Activity充当
  3. 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)
    }
}