1、MVC->MVP->MVVM

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值