0
点赞
收藏
分享

微信扫一扫

MVC->MVP->MVVM

以前干嘛去了 2022-04-27 阅读 56
android

1、MVC架构

1.1 组件的互动

1.2 MVC之间的经典

PS:注意,是经典合作。不是必须这样做,这只是其中一种合作方式。在不同的项目开发里面,分别有不同的内容充当MVC。那在Android里是什么充当View,什么充当Model,什么充当Controller呢?

View:Acitivity(View)、Fragment(View)视图,在android里xml布局转成View后,加载到了Activity/Fragment里了。

Controller:Controller对应着Activity/Fragment,绑定UI,处理各种业务。

Model:数据的获取,存储,更新,domain

1.3 优点

view与model隔离,view换了,model不影响。model换其他的数据源,view层也不受影响。一个view可以连接多个model,有些model可以复用。比如说你这个页面需要用户信息,另外一个界面也需要用户信息。

1.4 缺点

这里我们主要指Android上的缺点,不适合在Android开发上使用。在Android开发中,View的相关内容和Controller都写到一起了,会让Activity/Fragment越来越臃肿

1.5 代码M层

package com.example.jetpackbysob.mvctest

import java.util.*
import kotlin.concurrent.schedule

/**
 * Project_name:JetPackBySob
 * Created by:ChenFuXu.
 * Date: 2022/4/27 20:20
 */
class ModelTest {
    private val random = Random()

    // 进行登录操作
    fun doLogin(
        call: OnDoLoginStateChange,
        account: String,
        password: String
    ) {
        call.onLoading()
        // 开始去调用登录的api
        // 有结果,该操作为耗时操作
        Timer().schedule(3000) {

        }
        val randomValue = random.nextInt(2)
        if (randomValue == 0) {
            call.onLoginSuccess()
        } else {
            call.onLoginFailed()
        }
    }

    fun checkUserState(account: String, block: (Int) -> Unit) {
        /**
         * 1: 表示该账号已经注册
         * 0:表示该账号没有注册
         */
        block.invoke(random.nextInt(2))
    }

    interface OnDoLoginStateChange {
        // 登录中
        fun onLoading()

        // 登录成功
        fun onLoginSuccess()

        // 登录失败
        fun onLoginFailed()
    }

}

1.6 代码C层和V层(都在activity中) 

package com.example.jetpackbysob.mvctest

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.text.TextUtils
import com.example.jetpackbysob.R
import com.example.jetpackbysob.mvctest.ModelTest.OnDoLoginStateChange
import kotlinx.android.synthetic.main.view_test.*


class ViewTest : AppCompatActivity(), OnDoLoginStateChange {
    // view层持有model层的对象
    private val userModel by lazy { // 惰性初始化,首次使用才会初始化
        ModelTest()
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.view_test)
        initListener()
    }

    private fun initListener() {
        text_login.setOnClickListener {
            // 进行登录
            toLogin()
        }
    }

    /**
     * 处理登录逻辑
     * 这个地方是Controller层,持有Model对象,userModel
     */
    private fun toLogin() {
        // 做登录的逻辑处理
        val account = account_input.text.toString()
        val password = password_input.text.toString()
        // 检查账号的格式是否正确
        if (TextUtils.isEmpty(account)) {
            // 提示账号有问题
            return
        }
        // 检查密码长度是否正确
        if (TextUtils.isEmpty(password)) {
            // 提示密码有问题
            return
        }
        // 给密码加盐
        userModel.checkUserState(account) {
            when(it) {
                0 -> {
                    // 不可用,没有注册,提示注册
                }
                1 -> {
                    // 可用,已经注册了
                    // 禁止登录按钮可以点击, 不可以点击了,防止重复登录操作
                    text_login.isEnabled = false
                    text_login.background = resources.getDrawable(R.drawable.shape_mvc_login_press_bg)
                    // 进行登录,操作为异步
                    userModel.doLogin(this, account, password)
                }
            }
        }
    }

    override fun onLoading() {
        text_login.text = "登录中"
    }

    override fun onLoginSuccess() {
        text_login.text = "登录成功"
        text_login.isEnabled = true
        text_login.background = resources.getDrawable(R.drawable.shape_mvc_login_normal_bg)
    }

    override fun onLoginFailed() {
        text_login.text = "登录失败"
        text_login.isEnabled = true
        text_login.background = resources.getDrawable(R.drawable.shape_mvc_login_normal_bg)
    }
}

PS:整个activity是V层, toLogin()函数属于逻辑控制层C层

举报

相关推荐

0 条评论