【温故而知新】Android架构模式

news2024/11/26 20:29:06

Android项目工程中常用的架构模式有MVC, MVP, MVVM以及现在新出的MVI。

下面一起温故而知新。

MVC

MVC(Model-View-Controller)是一种在Android应用程序中使用的架构模式,用于实现松耦合、可测试和可维护的应用程序。

MVC架构模式包括三个主要组件:Model(模型)、View(视图)和Controller(控制器)。

  • Model表示应用程序的数据和业务逻辑。它可以是数据库、网络请求或其他数据源。

  • View负责渲染UI,并与用户进行交互。它将用户的操作转发给Controller,并通过观察Model中的数据来更新UI。

  • Controller是View和Model之间的中间层。它从Model中获取数据,并将数据转换为View可以使用的格式。Controller还包含与用户交互相关的逻辑,并将用户的操作转发给Model。

以下是使用Kotlin在Android中实现MVC模式的示例代码:

// Model
data class User(val name: String, val age: Int)

// View
class MainActivity : AppCompatActivity() {
    private lateinit var nameTextView: TextView
    private lateinit var ageTextView: TextView

    private lateinit var controller: MainController

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        nameTextView = findViewById(R.id.name_text_view)
        ageTextView = findViewById(R.id.age_text_view)

        controller = MainController()

        // Trigger an action in the Controller
        button.setOnClickListener {
            controller.loadUser()
        }
    }

    fun showUser(user: User) {
        nameTextView.text = user.name
        ageTextView.text = user.age.toString()
    }
}

// Controller
class MainController {
    fun loadUser() {
        // Perform some business logic or data manipulation
        val user = User("John Doe", 30)

        // Update the View
        (context as MainActivity).showUser(user)
    }
}

MVC模式通过将业务逻辑从View中分离出来,使得代码更易于测试和维护。它通过控制器来协调View和Model之间的交互,实现了解耦。

请注意,MVC模式需要对控制器和回调有一定的了解。它适用于中大型应用程序,特别是需要处理大量数据和复杂业务逻辑的应用程序。

MVP

MVP(Model-View-Presenter)是一种在Android应用程序中使用的架构模式,用于实现松耦合、可测试和可维护的应用程序。

MVP架构模式包括三个主要组件:Model(模型)、View(视图)和Presenter(展示者)。

  • Model表示应用程序的数据和业务逻辑。它可以是数据库、网络请求或其他数据源。

  • View负责渲染UI,并与用户进行交互。它将用户的操作转发给Presenter,并通过观察Presenter中的数据来更新UI。

  • Presenter是View和Model之间的中间层。它从Model中获取数据,并将数据转换为View可以使用的格式。Presenter还包含与用户交互相关的逻辑,并将用户的操作转发给Model。

以下是使用Kotlin在Android中实现MVP模式的示例代码:

// Model
data class User(val name: String, val age: Int)

// View
interface MainView {
    fun showUser(user: User)
}

class MainActivity : AppCompatActivity(), MainView {
    private lateinit var nameTextView: TextView
    private lateinit var ageTextView: TextView

    private lateinit var presenter: MainPresenter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        nameTextView = findViewById(R.id.name_text_view)
        ageTextView = findViewById(R.id.age_text_view)

        presenter = MainPresenter(this)

        // Trigger an action in the Presenter
        button.setOnClickListener {
            presenter.loadUser()
        }
    }

    override fun showUser(user: User) {
        nameTextView.text = user.name
        ageTextView.text = user.age.toString()
    }
}

// Presenter
class MainPresenter(private val view: MainView) {
    fun loadUser() {
        // Perform some business logic or data manipulation
        val user = User("John Doe", 30)

        // Update the View
        view.showUser(user)
    }
}

MVP模式通过将业务逻辑从View中分离出来,使得代码更易于测试和维护。它通过接口实现了View和Presenter之间的解耦,使得它们可以独立开发和测试。

请注意,MVP模式需要对接口和回调有一定的了解。它适用于中大型应用程序,特别是需要处理大量数据和复杂业务逻辑的应用程序。

MVVM

MVVM(Model-View-ViewModel)是一种在Android应用程序中使用的架构模式,用于实现松耦合、可测试和可维护的应用程序。

MVVM架构模式包括三个主要组件:Model(模型)、View(视图)和ViewModel(视图模型)。

  • Model表示应用程序的数据和业务逻辑。它可以是数据库、网络请求或其他数据源。

  • View负责渲染UI,并与用户进行交互。它通过观察ViewModel中的数据来更新UI,并将用户的操作转发给ViewModel。

  • ViewModel是View和Model之间的中间层。它从Model中获取数据,并将数据转换为View可以使用的格式。ViewModel还包含与用户交互相关的逻辑,并将用户的操作转发给Model。

以下是使用Kotlin在Android中实现MVVM模式的示例代码:

// Model
data class User(val name: String, val age: Int)

// View
class MainActivity : AppCompatActivity() {
    private lateinit var nameTextView: TextView
    private lateinit var ageTextView: TextView

    private val viewModel: ViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        nameTextView = findViewById(R.id.name_text_view)
        ageTextView = findViewById(R.id.age_text_view)

        // Observe data changes and update UI
        viewModel.user.observe(this) { user ->
            nameTextView.text = user.name
            ageTextView.text = user.age.toString()
        }

        // Trigger an action in the ViewModel
        button.setOnClickListener {
            viewModel.updateUser()
        }
    }
}

// ViewModel
class ViewModel : ViewModel() {
    private val _user = MutableLiveData<User>()
    val user: LiveData<User> = _user

    fun updateUser() {
        // Perform some business logic or data manipulation
        val updatedUser = User("John Doe", 30)

        // Update the LiveData
        _user.value = updatedUser
    }
}

MVVM模式通过将业务逻辑从View中分离出来,使得代码更易于测试和维护。它还支持数据绑定和双向绑定,使得UI的更新更加方便。

请注意,MVVM模式需要对观察者模式和数据绑定有一定的了解。它适用于中大型应用程序,特别是需要处理大量数据和复杂业务逻辑的应用程序。

MVI

MVI(Model-View-Intent)是一种在Android应用程序中使用的架构模式,用于构建响应式和可扩展的应用程序。

MVI架构模式包括三个主要组件:Model(模型)、View(视图)和Intent(意图)。

  • Model表示应用程序的状态,是一个不可变的数据结构,保存了渲染UI所需的所有信息。
  • View负责渲染UI,从Model接收状态并相应地更新UI。
  • Intent表示用户执行操作的意图,触发Model中的状态变化。

MVI模式的数据流是单向的,从Model到View。View不能直接修改状态,而是通过发送Intent到Model来更新状态并将其发送回View。

以下是使用Kotlin在Android中实现MVI模式的示例代码:

// Model
data class State(val count: Int)

// View
class MainActivity : AppCompatActivity() {
    private lateinit var textView: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        textView = findViewById(R.id.text_view)

        // Observe state changes and update UI
        viewModel.state.observe(this) { state ->
            textView.text = state.count.toString()
        }

        // Send an Intent to the ViewModel
        button.setOnClickListener {
            viewModel.processIntent(Intent.Increment)
        }
    }
}

// Intent
sealed class Intent {
    object Increment : Intent()
}

// ViewModel
class ViewModel : ViewModel() {
    private val _state = MutableLiveData<State>()
    val state: LiveData<State> = _state

    fun processIntent(intent: Intent) {
        when (intent) {
            is Intent.Increment -> {
                val currentState = _state.value ?: State(0)
                val newState = currentState.copy(count = currentState.count + 1)
                _state.value = newState
            }
        }
    }
}

请注意,MVI模式需要对响应式编程和函数式编程概念有很好的理解。对于小型或简单的应用程序,不建议使用MVI,因为它可能会增加不必要的复杂性。

没有银弹

在Android项目中,选择架构模式的最佳实践取决于项目的规模和需求。

以下是一些常见的最佳实践:

  • 对于小型或简单的应用程序,可以选择使用MVC(Model-View-Controller)模式。它将应用程序分为三个组件:Model、View和Controller。Model负责数据和业务逻辑,View负责渲染UI,Controller负责协调View和Model之间的交互。

  • 对于中大型应用程序,可以选择使用MVP(Model-View-Presenter)或MVVM(Model-View-ViewModel)模式。MVP模式通过Presenter来协调View和Model之间的交互,而MVVM模式通过ViewModel来实现数据绑定和双向绑定。

  • 如果应用程序需要处理大量数据和复杂业务逻辑,可以选择使用MVI(Model-View-Intent)模式。MVI模式通过单向数据流和响应式编程的概念来构建可扩展和可测试的应用程序。

请根据项目的规模和需求选择适合的架构模式,并根据需要进行适当的调整和定制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/718441.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高级篇十六、多版本并发控制(重要)

目录 1、什么是MVCC2、快照读与当前读2.1 快照读2.2 当前读 3、复习3.1 隔离级别3.2 隐藏字段、Undo Log版本链 4、MVCC实现原理之ReadView4.1 什么是ReadView&#xff1f; 1、什么是MVCC MVCC &#xff08;Multiversion Concurrency Control&#xff09;&#xff0c;多版本并…

Django之ORM的锁,开启事务,Ajax

一、行锁 select_for_update(nowaitFalse, skip_lockedFalse) 注意必须用在事务里面&#xff0c;至于如何开启事务&#xff0c;我们看下面的事务一节 Book.objects.select_for_update().filter(nid3) # 锁住nid3的行select_for_update中的两个参数了解即可&#xff0c;因为在…

机器学习入门

AI人工智能 ANI 弱人工智能&#xff0c;狭义人工智能&#xff0c;指的是一种针对特定任务或领域进行优化的人工智能&#xff0c;例如语音识别、图像识别、自然语言处理、推荐系统 AGI 通用人工智能&#xff0c;强人工智能&#xff0c; ASI 超级人工智能&#xff0c;超人工智…

Erupt框架学习

Erupt框架学习 Erupt框架Erupt简介学习EruptEruptFieldErupt的逻辑删除Erupt的自定义按钮多数据源配置 Erupt框架 Erupt简介 最近因为工作所以接触到了一个低代码框架Erupt。这是一个通用的配置管理框架&#xff0c;主打就是零前端代码&#xff0c;急速开发通用管理框架。 Er…

C# 如何调用python,避免重复造轮子

文章目录 原因资源调用python文件需求解决方案1、C#里面运行python引入python文件&#xff0c;再调用其中的方法启动python脚本&#xff0c;监听返回值改造一下&#xff0c;可以入参的python调用查看是否等待python运行完成之后再运行C#如果参数比较复杂 开一个python网络后端 …

如何用Airtest脚本无线连接Android设备?

1. 前言 之前我们已经详细介绍过如何用AirtestIDE无线连接Android设备&#xff1a; 手把手教你用AirtestIDE无线连接手机&#xff01; &#xff0c;它的关键点在于&#xff0c;需要先 adb connect 一次&#xff0c;才能点击 connect 按钮无线连接上该设备&#xff1a; 但是有很…

​浅谈大型语言模型

大型语言模型&#xff08;Large Language Models&#xff0c;LLMs&#xff09;是一类强大的人工智能模型&#xff0c;具有出色的自然语言处理能力。它们在许多任务中表现出色&#xff0c;如机器翻译、文本摘要、对话生成和情感分析等。下面我们将介绍大型语言模型的训练和生成过…

海康监控摄像机接入NTV GBS GB28181平台实现远程调取监控视频

海康威视各种型号监控摄像头或硬盘录像机(NVR/HVR)接入NTV GBS GB28181平台配置过程都非常简单明了&#xff0c;但有些细节需要注意&#xff0c;避免走弯路踩泥坑。 1、基本要求 1)网络要求 总体来说&#xff0c;只要监控设备和GB28181平台的网络是连通的&#xff0c;设备可以主…

MATLAB基础篇(上)

一、MATLAB简介 MATLAB(Matrix Laboratory, 即矩阵实验室)是MathWork公司推出的一套高效率的数值计算和可视化软件.MATLAB是当今科学界最具影响力、也是最具活力的软件, 它起源于矩阵运算, 并已经发展成一种高度集成的计算机语言.它提供了强大的科学运算、灵活的程序设计流程、…

保姆级python环境配置(anaconda+pycharm+cuda+cudnn+pytorch)

文章目录 前言一、如何下载anaconda1、下载网址2、版本选择3、下载流程4、注意事项 二、如何下载pycharm1、下载网址2、下载流程 三、更新NVIDIA驱动1、下载网址2、选择相应配置进行下载 四、如何下载cuda1、查看可安装的cuda版本号2、下载网址3、下载流程4、注意事项 五、如何…

牛客网数据库sql实战基础知识

sql基础知识 1.concat(a,“-”,b)&#xff1a; 将a和b列&#xff0c;连接成字符串&#xff0c;用-分割后输出成一列。&#xff08;分隔符在参数中间&#xff09; 2.insert into values(),()&#xff1a; 插入多列时用逗号分割&#xff0c;不需要在最外层加再加括号。 3.inse…

工信部新材料大数据创新联盟成立,龙讯旷腾作为首批会员单位参与大会

近日&#xff0c;“新材料大数据创新联盟”成立大会暨第一届理事会在京召开。为深入贯彻国家创新驱动发展战略&#xff0c;联盟在工业和信息化部指导下&#xff0c;由北京科技大学、中国钢研科技集团有限公司、中关村材料试验技术联盟联合材料和信息技术领域重点高校、科研院所…

浅学CSS

目录 CSS 是什么 基本语法规范 引入方式 内部样式表 行内样式表 外部样式 代码风格 样式格式 样式大小写 空格规范 选择器 选择器的功能 选择器的种类 基础选择器 标签选择器 类选择器 id 选择器 通配符选择器 基础选择器小结 复合选择器 后代选择器 子选…

<C语言> 指针(上)

1.指针是什么&#xff1f; 指针&#xff08;Pointer&#xff09;是一种特殊的变量类型&#xff0c;它存储了一个内存地址。可以将指针视为存储了另一个变量的地址的变量。通过指针&#xff0c;可以直接访问和修改内存中的数据。 指针提供了一种间接访问内存的方式&#xff0c…

SpringCloud源码探析(七)-整合Elasticsearch

1.概述 ElasticSearch是一个基于Lucene的搜索服务器&#xff0c;提供了一个分布式多用户能力的全文搜索引擎。它是基于JAVA语言开发&#xff0c;并且是基于RESTful web接口进行查询和结果返回&#xff0c;是一款非常流行的企业级搜索引擎。Elasticsearch的核心功能包括存储数据…

Redis缓存问题与缓存更新机制

目录 ​编辑 一、缓存问题 1.1 缓存穿透 1.1.1 问题来源 1.1.2 解决方案 1.1.2.1 缓存空对象 1.1.2.2 使用布隆过滤器 1.2 缓存击穿 1.2.1 问题来源 1.2.2 解决方案 1.2.2.1 设置热点数据永远不过期 1.2.2.2 新增后台定时更新缓存线程&#xff08;逻辑不过期&#xff09; 1.2.…

详解Java Synchronized锁升级原理

✅作者简介&#xff1a;热爱Java后端开发的一名学习者&#xff0c;大家可以跟我一起讨论各种问题喔。 &#x1f34e;个人主页&#xff1a;Hhzzy99 &#x1f34a;个人信条&#xff1a;坚持就是胜利&#xff01; &#x1f49e;当前专栏&#xff1a;JAVA多线程 &#x1f96d;本文内…

蓝桥杯专题-试题版含答案-【猴子吃桃问题】【小光棍数】【九九乘法表】【谁是最好的Coder】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

(Linux) 套接字socket基础

文章目录 前言基本原理 Codeserverclient 核心函数socketbindlistenacceptrecvsendconnectclose 多线程改进END 前言 本文将以纯C语言描述&#xff0c;编译器gcc。 C/C没有标准的网络库&#xff0c;因为都需要用到各个平台的接口才行。 本文讲解Linux下最基础的socket编程&a…