Android MVC,MVP和MVVM架构模式的探究

Android 架构MVI、MVVM、MVC、MVP 简单了解一下MVI、MVC、MVP和MVVM。 阅读详情
首语
  • Android项目开发中,尤其大型的项目中,模块内部的高聚合和模块间的低耦合显得很是重要。为此我们需要选择一种框架模式,Android通常使用到的有MVC,MVP和MVVM。通过框架模式设计的项目能够极大提高开发效率,提高项目的可维护性和可扩展性,同时在模块测试和Bug处理上也有很大便利。
需求(查询用户账号信息)
  • 用户输入账号,点击按钮可进行查询账号信息,如果查询数据成功,则将数据展示在页面上;如果查询失败,则在页面上提示获取数据失败。
不使用框架
  • Activity主要实现的功能有获取用户输入的信息、展示获取信息成功页面、展示获取信息失败页面、查询用户数据和业务逻辑。
	//获取用户输入的信息
	private String getUserInput(){
        return etinput.getText().toString().trim();
    }

	//展示获取信息成功页面
    private void showSuccessPage(Account account){
        tvinformation.setText("用户账号:"+account.getName()+"用户等级:"+account.getLevel());
    }

	//展示获取信息失败页面
    private void showFailedPage(){
        tvinformation.setText("获取数据失败");
    }
	
	//查询用户数据
    private void getAccountData(String accountName, MCallBack callBack){
        Random random = new Random();
        boolean isSuccess = random.nextBoolean();
        if (isSuccess){
            Account account = new Account();
            account.setName(accountName);
            account.setLevel(100);
            callBack.onSuccess(account);
        }else {
            callBack.onFailed();
        }
    }
     @Override
    public void onClick(View view) {
        String userInput = getUserInput();
        getAccountData(userInput, new MCallBack() {
            @Override
            public void onSuccess(Account account) {
                showSuccessPage(account);
            }

            @Override
            public void onFailed() {
                showFailedPage();
            }
        });
    }
    
    public interface MCallBack {

    void onSuccess(Account account);
    void onFailed();
}

	//Account Bean类
	private String name;//姓名
    private int level;//等级

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getLevel() {
        return level;
    }

    public void setLevel(int level) {
        this.level = level;
    }
MVC
  • MVC的全名是Model-View-Controller,是模型(Model)-视图(View)-控制器(Controller)的缩写。Model层负责数据处理(网络请求,SQL等),View层负责Layout、View控件。Controller层负责Activity,Fragment。
需求分析
  • Controller层:业务逻辑处理,获取用户输入,展示成功页面,展示失败页面。
  • Model层:查询账号数据。
  • View层:layout布局。
实现
  • 1.将数据的获取与界面的展示分离 。
  • 2.解决各层之间通信问题(Activity通知Model获取数据,Model通知Activity更新页面)。
//Model层
public void getAccountData(String accountName, MCallBack callBack){
        Random random = new Random();
        boolean isSuccess = random.nextBoolean();
        if (isSuccess){
            Account account = new Account();
            account.setName(accountName);
            account.setLevel(100);
            callBack.onSuccess(account);
        }else {
            callBack.onFailed();
        }
    }
//Controller层
	private String getUserInput(){
        return etinput.getText().toString().trim();
    }
    private void showSuccessPage(Account account){
        tvinformation.setText("用户账号:"+account.getName()+"用户等级:"+account.getLevel());
    }

    private void showFailedPage(){
        tvinformation.setText("获取数据失败");
    }
    @Override
    public void onClick(View view) {
       mMvcModel.getAccountData(getUserInput(), new MCallBack() {
           @Override
           public void onSuccess(Account account) {
               showSuccessPage(account);
           }

           @Override
           public void onFailed() {
               showFailedPage();
           }
       });
    }    
MVC优缺点
  • 优点:一定程度上实现了Model与View的分离,降低了代码的耦合性。
  • 缺点:Controller与View难以完全解耦,并且随着项目复杂度的提升,Controller将越来越臃肿。
MVP
  • MVP的全名是Model-View-Presenter,是模型(Model)-视图(View)-中间层(Presenter)的缩写。Model层负责数据处理(网络请求、SQL等) ,View层负责用户交互(Activity,Fragment),Presenter层作为View层与Model层中间的纽带,负责处理与用户交互的主要业务逻辑。
需求分析
  • Model层:查询账号数据。
  • View层:获取用户输入、展示成功界面、展示失败界面。
  • Presenter层:业务逻辑处理。
实现
  • 1.Activity负责提供View层面的功能(采用实现接口的方式)
  • 2.Model层负责提供数据方面的功能。
  • Model层与View层不再直接通信,通过Presenter来实现。
//Model层负责提供数据方面的功能
public void getAccountData(String accountName, MCallBack callBack){
        Random random = new Random();
        boolean isSuccess = random.nextBoolean();
        if (isSuccess){
            Account account = new Account();
            account.setName(accountName);
            account.setLevel(100);
            callBack.onSuccess(account);
        }else {
            callBack.onFailed();
        }
    }
//采用实现接口的方式实现View层面的功能
    public interface MVPView {

    String getUserInput();
    void showSuccessPage(Account account);
    void showFailedPage();
}
//中间层Presenter
private MVPView mMVPView;
    private MVPModel mMVPModel;

    public MVPPresenter(MVPView mMVPView) {
        this.mMVPView = mMVPView;
        mMVPModel = new MVPModel();
    }
    public void getData(String accountName){
        mMVPModel.getAccountData(accountName, new MCallBack() {
            @Override
            public void onSuccess(Account account) {
                mMVPView.showSuccessPage(account);
            }

            @Override
            public void onFailed() {
                mMVPView.showFailedPage();
            }
        });
    }
//Activity中Model与View不再直接通信,通过Presenter来实现。继承View接口层   
	@Override
    public void onClick(View view) {
        mMVPPresenter.getData(getUserInput());
    }

    @Override
    public String getUserInput() {
        return etinput.getText().toString().trim();
    }

    @Override
    public void showSuccessPage(Account account) {
        tvinformation.setText("用户账号:"+account.getName()+"用户等级:"+account.getLevel());
    }

    @Override
    public void showFailedPage() {
        tvinformation.setText("获取数据失败");
    }
MVP优缺点
  • 优点:解决了MVC中Controller与View过度耦合的的缺点,职责划分明显,更加易于维护。
  • 缺点:接口数量多,项目复杂度提高,随着项目复杂度的提高,Presenter将越来越臃肿。
建议
  • 1.接口规范化(封装父类接口以减少接口的使用量)。

  • 2.使用MVP插件自动生成MVP的代码。

  • 3.对于一些简单的页面,可以选择不使用框架。

  • 4.根据项目复杂度,部分模块可以选择不使用接口。

MVC与MVP的区别
  • 1.Model与View不再直接进行通信,而是通过中间层Presenter来实现。
  • 2.Activity的功能被简化,不再充当控制器,主要负责View层面的工作。
PS(常见MVP插件)
MVVM
  • MVVM的全名是Model-View-ViewModel,是模型(Model)-视图(View)-数据视图管理器(ViewModel)的缩写。Model层负责数据处理,View层负责Activity,Fragment。VIewModel层负责调用Model,拿到数据更新自身,而View与ViewModel双向绑定,所以View会自动更新。MVVM在MVP的基础上实现了数据视图的绑定(DataBinding),当数据变化时,视图会自动更新;反之,视图发生变化时,数据也会自动更新。
DataBinding
使用步骤

1.启用DataBinding

//编辑app目录下的build.gradle文件,添加下面的内容。
android {
    ...
    dataBinding {
        enabled = true
    }
}

2.修改布局文件为DataBinding布局

  • 选中布局文件根布局(如LinearLayout),按alt+enter,点击Convert to data binding layout,
    布局文件转化为DataBinding布局。它最外层是layout,里面包含data和我们的原始布局。
  • 在data中我们可以声明对象,然后我们就可以在布局文件中使用对象。@={}表示双向绑定(具体见代码)
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>

        <variable
            name="account"
            type="com.yhj.framedemo.bean.Account" />

        <variable
            name="activity"
            type="android.app.Activity" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".databinding.DemoActivity">

        <TextView
            android:id="@+id/tv_level"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginTop="80dp"
            android:text="@{account.name+'|'+account.level}" />

        <Button
            android:id="@+id/bt_level"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginTop="80dp"
            android:onClick="@{activity.onClick()}"
            android:text="等级+1" />

    </LinearLayout>
</layout>
  • 生成DataBinding布局以后,setContentView(view)也要发生改变,使用DataBindingUtil.setContentView,同时使用binding省略了findViewById。
  ActivityMvvmBinding binding = 
  DataBindingUtil.setContentView(this, R.layout.activity_mvvm);
  binding.etInput.setText("省略findViewById()");

3.数据绑定

  • 让Bean类Account继承BaseObservable,为了使数据发生变化视图自动更新,在getLevel()上加注解Binable,在setLevel()中notifyPropertyChanged(BR.level)。
	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.setContentView(this, R.layout.activity_demo);
        account = new Account();
        account.setName("Tom");
        account.setLevel(100);
        binding.setAccount(account);
        binding.setActivity(this);
    }

    public void onClick(View view){
        Toast.makeText(this, "点击了!", Toast.LENGTH_SHORT).show();
        int level = account.getLevel();
        account.setLevel(level+1);
	    //binding.setAccount(account);
    }
public class Account extends BaseObservable {

    private String name;//姓名
    private int level;//等级
    
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Bindable
    public int getLevel() {
        return level;
    }

    public void setLevel(int level) {
        this.level = level;
        notifyPropertyChanged(BR.level);
    }
}
需求分析
  • Model层:查询账号数据。
  • View层:获取用户输入,展示成功界面,展示失败界面。
  • ViewModel层:业务逻辑处理,数据更新。
实现
  • 提供View,ViewModel以及Model三层。
  • 将布局修改为DataBinding布局
  • View与ViewModel之间通过DataBinding进行通信。
  • 获取数据展示在界面上。
<?xml version="1.0" encoding="utf-8"?>
    <!--    首先是DataBinding布局-->
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">
    <data>
        <variable
            name="viewModel"
            type="com.yhj.framedemo.mvvm.MVVMViewModel"/>
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".mvvm.MVVMActivity">

        <EditText
            android:hint="请输入要查询的账号"
            android:text="@={viewModel.userInput}"
            android:layout_marginTop="20dp"
            android:id="@+id/et_input"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
        <Button
            android:layout_gravity="center"
            android:layout_marginTop="80dp"
            android:id="@+id/bt_get"
            android:onClick="@{viewModel.getData}"
            android:text="获取账号信息"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <TextView
            android:layout_gravity="center"
            android:layout_marginTop="80dp"
            android:id="@+id/tv_information"
            android:text="@{viewModel.result}"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>
</layout>
//Model层数据处理
public void getAccountData(String accountName, MCallBack callBack){
        Random random = new Random();
        boolean isSuccess = random.nextBoolean();
        if (isSuccess){
            Account account = new Account();
            account.setName(accountName);
            account.setLevel(100);
            callBack.onSuccess(account);
        }else {
            callBack.onFailed();
        }

    }
//ViewModel层
public class MVVMViewModel extends BaseObservable {
    private String result;
    private String userInput;

    @Bindable
    public String getUserInput() {
        return userInput;
    }

    public void setUserInput(String userInput) {
        this.userInput = userInput;
        notifyPropertyChanged(BR.userInput);
    }

    private final MVVMModel mvvmModel;
    private MVVMModel mvvmModel1;
    private ActivityMvvmBinding binding;

    @Bindable
    public String getResult() {
        return result;
    }

    public void setResult(String result) {
        this.result = result;
        notifyPropertyChanged(BR.result);
    }

    //一般需要传入Application对象,方便在ViewModel中使用Application
    //比如SharedPreference
    public MVVMViewModel(Application application) {
        mvvmModel = new MVVMModel();
    }

    public void getData(View view) {
        mvvmModel.getAccountData(userInput, new MCallBack() {
            @Override
            public void onSuccess(Account account) {
                String info = account.getName() + "|" + account.getLevel();
                setResult(info);
            }

            @Override
            public void onFailed() {
                setResult("获取失败!!!");
            }
        });
    }
}
//View层Activity
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityMvvmBinding binding =
                DataBindingUtil.setContentView(this, R.layout.activity_mvvm);
        MVVMViewModel mvvmViewModel = new MVVMViewModel(getApplication());

        binding.setViewModel(mvvmViewModel);

    }
  • View可以向ViewModel传递信息,ViewModel改变数据通知View自动更新,但是有些功能我们要在Activity中实现(比如点击按钮获取应用权限),ViewModel如何通知View呢?要实现这个功能,我们可以让ViewModel执有Activity的引用,或者借用EventBus。对于MVVM模式来说,我们可以使用LiveData+ViewModel来实现。
LiveData
MVVM优缺点
  • 优点:实现了数据与视图的双向绑定,极大的简化代码。
  • 缺点:bug难以调试,并且DataBinding目前还存在一些编译问题。
总结
  • Android开发中,一直在用MVC框架,甚至可以说没有使用框架,一些大型项目随着不断的迭代,出现了许多问题,推出了MVP框架,再到现在主推的MVVM框架。架构演进代码质量也更高,但学习难度也增大。
  • Android开发语言,一直在用Java,如今推出了Kotlin语言已经成为Android官方支持开发语言。以及跨平台开发方案Flutter使用的Dart语言,想想哇,Android之路漫漫啊,还有许多东西要学习使用。需要一直提升自己,做未来的T型人才。
  • 项目源码:FrameDemo
Android MVC MVP MVVM简单例子 目录 1. MVC MVP MVVM 间的区别 1.1 MVC(Model-View-Controller) 1.2 MVP(Model-View-Presenter) 1.3 MVVM(Model-View-ViewModel) 2. 例子Demo 2.1MVC 2.2MVP 2.3MVVM 1. MVC MVP MVVM 间的区别 三者的区别如下图所示: 1.1... 阅读详情

相关推荐

Android 架构模式 MVC、MVP、MVVM、MVI

理想状态 Activity / Fragment 是只处理表现逻辑的部分 ,但现实是 Activity 天然不可避免要处理 UI,也要处理用户交互,说明 Activity 本身天然承担了 View 的角色。那么这个架构就会造成 Activity 里糅合了视图和业务的代码,分离程度不够。对可预测性和可调试性要求极高的项目,与 Jetpack Compose 高度契合。小型项目,功能非常少、UI逻辑简单的页面。中大型项目,结构清晰,易于模块化和维护。

随手纪念的博客 1027

细说Android框架设计三剑客MVC、MVP和MVVM

最近几年的移动端开发越来越火,功能越来越强大,处理业务越来越复杂,因此对系统扩展性的要求越来越高。而为了更好地进行移动端架构设计,我们最常用的就是MVC和MVP,今天本篇博客就和大家一起聊一聊这两种框架设计。MVC框架MVC的定义    MVC (Model-View-Controller):M是指逻辑模型,V是指视图模型,C则是控制器。使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以

Android研发专栏 1万+

Android - MVC、MVP与MVVM架构

模型负责管理应用程序的数据。它从控制器接收用户输入。视图意味着以特定格式呈现模型。控制器响应用户输入并在数据模型对象上执行交互。控制器接收输入,可选地对其进行验证,然后将输入传递给模型。与其他软件模式一样,MVC表示问题的“解决方案核心”,同时允许其适用于每个系统。特定的MVC设计可能与此处的传统描述大不相同。MVP即为模型-视图-演示者,是MVC架构模式的派生产品,主要用于构建用户界面。在MVP中,Presenter承担“中间人”的功能,所有演示逻辑都被推送到Presenter。

2401_85699696的博客 1306

Android框架MVC、MVP和MVVM探究(图解+案例+附源码)

1、介绍 MVC、MVP、MVVM这些模式是为了解决开发过程中的实际问题而提出来的,目前作为主流的几种架构模式而被广泛使用。本文代码 2、了解并区分MVC,MVP,MVVM 2.1 MVC MVC,(Model View Controller),是软件架构中最常见的一种框架,简单来说就是通过controller的控制去操作model层的数据,并且返回给view层展示,具体见下图 ...

MG_ZXC的专栏 8538

Android 开发中的架构模式(1) -- MVC / MVP / MVVM

Android 开发中的架构模式 -- MVC / MVP / MVVM

u013083465的专栏 1217

Android 架构MVC MVP MVVM+实例

1.View 接收用户交互请求2.View 将请求转交给ViewModel3.ViewModel 操作Model数据更新4.Model 更新完数据,通知ViewModel数据发生变化5.ViewModel 更新View数据MVVM的优点1.提高可维护性。Data Binding可以实现双向的交互,使得视图和控制层之间的耦合程度进一步降低,分离更为彻底,同时减轻了Activity的压力。2.简化测试。

2401_87029500的博客 1802

为什么我不再使用MVC框架?

Jean-Jacques Dubray是一名资深工程师,他最近引入了一个新的模式:状态-行为-模型(State-Action-Model,SAM)。SAM是一个函数式反应型的编程模式,它致力于简化数据Model和View之间的交互。它究竟有何优点值得作者弃用MVC呢?   话题起因   在我最近的工作中,最让人抓狂的就是为前端开发人员设计API。我们之间的对话大致就是这样的:

chanzhu的博客 1万+

Android:MVC、MVP、MVVM模式的详解

MVC适合小型应用,简单易懂,但在复杂应用中可能导致 Controller 过于臃肿。MVP提供了更好的解耦和可测试性,适合中型应用,但需要更多的代码结构。MVVM是现代 Android 开发的推荐模式,特别是与 Jetpack 组件(如 LiveData 和 ViewModel)结合使用时,能够提供更好的数据管理和 UI 更新机制。选择哪种模式取决于你的应用需求、团队的熟悉程度以及项目的复杂性。

Gabo_Summer的博客 2310

选择恐惧症的福音!教你认清MVC,MVP和MVVM

相信大家对MVC,MVP和MVVM都不陌生,作为三个最耳熟能详的Android框架,它们的应用可以是非常广泛的,但是对于一些新手来说,可能对于区分它们三个都有困难,更别说在实际的项目中应用了,有些时候想用MVP的,代码写着写着就变成了MVC,久而久之就对它们三个的选择产生了恐惧感,如果你也是这样的人群,那么这篇文章可能会对你有很大的帮助,希望大家看完都会有收获吧! 文章重点: (1)了

LightLu 2428

鸿蒙【ArkTS】使用TS装饰器封装网络请求HTTP

在HarmonyOS应用开发中,通过HTTP访问网络,可以使用官方提供的@ohos.net.http模块。但是官方提供的直接使用不太好使用,需要封装下才好。这里采用TS的装饰器实现AOP效果 完成前后端接口风格的统一

weixin_60376559的博客 5609

CMOS传输门(互补开关)实战指南 | 设计优化 + 常见问题解析

本文深入解析CMOS传输门(互补开关)的设计优化与常见问题,涵盖导通特性、版图设计、高频应用及混合信号设计等关键领域。通过实测数据和优化技巧,帮助工程师解决衬底连接、信号完整性等实际问题,提升数字和模拟混合信号设计的效率与可靠性。

weixin_29229989的博客 161

一种互联网应用的分布式架构模式微服务应用框架的实现(gradle,dubbo,zookeeper,springmmvc)

框架是用freemarker、springmvc、dubbo、hibernate编写的快速互联网应用敏捷开发框架,采用web层和service层分离独立的设计模式, 用最流行的微服务架构,使用gradle替代maven管理项目结构依赖

沙舟狼客 3221

TransUnet官方代码训练自己数据集(彩色RGB3通道图像的分割)

官方代码:https://github.com/Beckschen/TransUNet 目的:训练5个类别的汽车部件分割任务(测试在另一篇博客中) 实现效果: 1. github下载代码,并解压。 项目里的文件可能跟你下载的不一样,不急后面会讲到! 2. 配置数据集(尽最大努力还原官方数据集的格式)。 通常自己手上的数据集分images和labels文件夹,分别存放着原始图像和对应的mask图像,如下图所示; mask图像中的像素有0,1,2,3,4 分别代表背景,车身,轮子,车灯,窗户,一共五个

qq_37652891的博客 5万+

Android:MVC/MVP/MVVM 架构

文章目录0、需求1、不使用架构2、MVC 模型3、MVP 模型3、MVVM 模型 0、需求 1、用户输入账号名称->点击查询账户信息->展示查询成功失败结果。 1、不使用架构 1、activity_architecture.xml <?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.Li...

strugglelin'blog 372

第2.0章 机器人C++学习开篇(一):SLAM为什么使用C++语言及学习路线资料推荐

ROS(机器人操作系统):机器人领域的“操作系统”,提供节点通信、参数管理、工具链支持,是SLAM算法在机器人上部署的核心框架。PCL(点云库):处理三维点云数据的利器,包含滤波、分割、配准等算法,是激光SLAM的核心依赖。Eigen(矩阵运算库):高效的矩阵与线性代数运算库,SLAM中的位姿变换、优化求解都依赖它。Ceres/G2O(优化库):SLAM后端优化的“王牌”,Ceres擅长通用非线性优化,G2O则专为图优化设计,二者是BA( bundle adjustment)等算法的实现基础。

行知SLAM 1241

YOLOv13涨点改进 | 全网独家创新、高效涨点改进篇 | CVPR 2024 | YOLOv13引入SHSA单头自注意力模块,减少冗余的多头注意力,轻量化改进,助力目标检测和图像分类任务高效涨点

本文提出了一种改进YOLOv13模型的新方法——SHSA(单头自注意力)模块,用于提升目标检测任务的计算效率和推理速度。SHSA通过简化多头注意力机制为单头结构,显著减少了计算冗余和内存占用。实验表明,该模块在保持精度的同时,在GPU、CPU和移动设备上分别实现了3.3倍、8.1倍和2.4倍的加速效果。文章详细介绍了SHSA的结构原理、核心代码实现方法,以及如何集成到YOLOv13的配置文件中。这种改进特别适合资源受限设备,为实时目标检测提供了更优的速度-精度平衡方案。

Ai缝合怪、助力小伙伴高效发论文 506

Android的MVC MVP MVVM模式

学习Android的同学一定要了解的三种开发模式,不然自己写的项目采用的什么模式都不清楚MVC,MVP,MVVM都是为了解决UI页面与逻辑代码分离而出现的模式,MVP和MVVM都是MVC的基础上演化而来MVC全名是Model View Controller,是模型(mV----odel)-视图(view)-控制器(controller)的缩写M——模型层(Model)负责处理数据的加载或者存储V——视图层(View)负责界面数据的展示,与用户进行交互C——控制器层(Controller)负责逻辑业务的处理在

Ai1114的博客 2万+

搞定ESD(四):ESD干扰耦合路径深入分析(二)

静电放电过程中静电干扰主要通过三种间接耦合方式干扰敏感源,即电场耦合、磁场耦合、地弹。前文已经深入分析了静电放电过程中的电场耦合,今天就谈谈静电放电过程中的磁场耦合,也可以理解环路耦合。熟话说的好〝人往高处走,水往低处流〞,静电电流也会选择阻抗最低的路径返回到源端。静电电流流会源端的路径实际上就构成了电流环路,当敏感信号形成的电流环路与静电电流环路存在共环路时,就会将静电放电干扰耦合到敏感信号环路内,干扰敏感信号。

记得诚 2793

探究 Android MVC、MVP、MVVM 的区别以及优缺点

面试题:说一下对 MVVM 的了解面试题:为何使用 Android Jetpack?MVVM 面试题:说一下对 MVVM 的了解 举例说明,好证明自己确实对 MVVM 有着正确、深入的理解 eg: 分析为什么使用 MVVM,它相对于其他MVP这类架构师如何解决你的项目问题的,另外,还要回答jetpack使用过程中遇到的坑是怎样的。最后,面试官估计会问你对各种架构的选择的对比原则之类的哦 面试题:为何使用 Android Jetpack? 快速开发 组件可以单独采用(不过这些组件是为协同工作而构建的),.

怪咖先森的博客 1万+

【STK】手把手教你利用STK进行关联分析仿真01-STK/CAT模块介绍

今天主要介绍接近分析工具CAT。

weixin_44184852的博客 1106

C#实现低通和高通滤波算法

低通滤波器允许通过低于某个截止频率的信号成分,并且抑制高于该频率的成分。而高通滤波器则允许通过高于某个截止频率的信号成分,并抑制低于该频率的成分。巴特沃斯滤波器是一种对称的滤波器,具有平坦的幅度响应和最小的群延迟。低通和高通滤波是数字信号处理中常用的滤波技术,用于滤除或增强信号中的特定频率成分。在本篇文章中,我们将使用C#编程语言来实现低通和高通滤波算法。以上就是使用C#实现低通和高通滤波算法的示例代码。你可以根据自己的需求调整截止频率和采样率,将这些代码应用于你的项目中。是滤波器的截止频率,

XisVisual_Basic的博客 1274

Android安卓架构MVC、MVP、MVVM模式的概念与区别

MVC(Model-View-Controller)、MVP(Model-View-Presenter)、MVVM(Model-View-ViewModel)是三种常见的软件架构模式,它们的目的都是将应用程序的不同部分分离开来,以提高代码的可维护性、可扩展性和可测试性。在 Android 开发中,MVP(Model-View-Presenter)是一种常用的架构模式,它是基于MVC模式的改进,旨在进一步分离应用程序的各个组件,提高代码的可测试性和可维护性。同时,也使得代码更加清晰、简洁,降低了维护成本。

m0_74293254的博客 4237

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

安卓应用架构模式 MVC MVP MVVM有什么区别?

结合 Jetpack 组件(ViewModel + LiveData + DataBinding/Room)实现高效开发。是三种常见的架构模式,它们的目标都是通过分层解耦代码,提升可维护性和可测试性。:中大型项目,结合 Jetpack 组件(推荐 Google 官方方案)。:Presenter 独立于 Android API,便于测试。:需要高测试覆盖率的项目(Presenter 可独立测试)。:快速原型开发或简单页面,不推荐复杂项目。:业务逻辑和 UI 耦合,难以单元测试。结构简单,适合小型项目。

hnlgzb的专栏 1187

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

安卓中的MVC、MVP、MVVM

安卓中的MVC、MVP、MVVM

似霰的博客 1024

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Android 开发架构-MVC MVP MVVM详解

这篇文章我们讲了是什么是架构和三种架构模式MVC、MVP、MVVM的架构思想,最后再讲了三种架构的区别与选择。相信通过这篇文章读者可能对这三种架构有了一定的认识。一个完美的架构模式是一个架构师一生的追求,在使用的时候我们可以多多思考这些架构模式的本质以及背景,想想架构师为什么这么设计,可以帮我们更好地理解架构。全文到此为止。笔者才疏学浅,有不同观点欢迎评论区或私信讨论。如需转载私信告知即可。另外欢迎阅读笔者的个人博客一只修仙的猿的个人博客,更精美的UI,拥有更好的阅读体验。

不得不学的程序猿 3175
上一篇: 数据结构与算法(图的最短路径与拓扑排序)
下一篇: Android动画系列(1)—帧动画
八归少年
八归少年 新星创作者: 操作系统技术领域 新星创作者: 操作系统技术领域
博客等级 码龄9年 9011粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

八归少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值