MVC模式讲解与实例

一文带你全面了解MVC、MVP、MVVM模式(实例讲解) 前言 在Android开发中,当你梳理完需求后,你要做的并不是马上写下你的第一行代码,而是需先设计好整个项目的技术框架 今天,我将全面介绍Android开发中主流的技术框架MVC、MVP 与 MVVM模式,并实例讲解MVP模式,希望您们会喜欢。 目录 1. 为什么要进行技术框架的设计 模块化功能 使得程序模块化,即:内部的高聚合、模块之间的低耦合 提高开发效率 开发人员只... 阅读详情
MVC模式
1、概念

MVC模式(Model–view–controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。

其中M层处理数据,业务逻辑等;V层处理界面的显示结果;C层起到桥梁的作用,来控制V层和M层通信以此来达到分离视图显示和业务逻辑层。

2.1 MVC流程

MVC模式图

1、View接受用户的交互请求

2、View将请求转交给Controller

3、Controller操作Model进行数据更新

4、数据更新之后,Model通知View数据变化

5、View显示更新之后的数据

View和Controller使用策略模式(Strategy)实现,View使用组合模式(Composite),View和Model通过观察者模式(Observer)同步信息。Controller不知道任何View的细节,一个Controller能被多个View使用。MVC的一个缺点是很难对Controller进行单元测试,Controller操作数据,但是如何从View上断言这些数据的变化呢?例如,点击一个View的按钮,提交一个事件给Controller,Controller修改Model的值。这个值反映到View上是字体和颜色的变化。测试这个Case还是有点困难的。

2.2 Android中的MVC

视图层(View)

一般采用XML文件进行界面的描述,这些XML可以理解为App的View。使用的时候可以非常方便的引入。同时便于后期界面的修改。逻辑中与界面对应的id不变化则代码不用修改,大大增强了代码的可维护性。

控制层(Controller)

Android的控制层的重任通常落在了众多的Activity的肩上。这句话也就暗含了不要在Activity中写代码,要通过Activity交割Model业务逻辑层处理,这样做的另外一个原因是Android中的Actiivity的响应时间是5s,如果耗时的操作放在这里,程序就很容易被回收掉。

模型层(Model)

我们针对业务模型,建立的数据结构和相关的类,就可以理解为App的Model,Model是与View无关,而与业务相关的。对数据库的操作、对网络等的操作都应该在Model里面处理,当然对业务计算等操作也是必须放在的该层的。

2.3 实例

MVC实例图

模拟用户登录:当手机界面上,用户点击登录按钮,获取用户输入的账号和密码后,提交数据到服务器,服务器处理完成后响应,显示用户登录的结果。

//定义接口,监听登录响应回调
package yuekaoti.mvcdemo.custominterface;

/**
 * @version 1.0
 * @auth JackHappiness
 * @date 2019/3/26
 * @summary : 登录接口
 */
public interface LoginListener {
    /**
     * 登录成功
     *
     * @param result 结果信息
     */
    void success(String result);

    /**
     * 登录失败
     *
     * @param errorMsg 错误信息
     */
    void fail(String errorMsg);
}

//定义业务接口
package yuekaoti.mvcdemo.model.baseModel;

import yuekaoti.mvcdemo.custominterface.LoginListener;

/**
 * @version 1.0
 * @auth JackHappiness
 * @date 2019/3/26
 * @summary : User Model
 */
public interface IUser {
    void login(String userPhone, String userPass, LoginListener listener);
}


//定义Model实现
package yuekaoti.mvcdemo.model;

import android.text.TextUtils;

import yuekaoti.mvcdemo.custominterface.LoginListener;
import yuekaoti.mvcdemo.model.baseModel.IUser;

/**
 * @version 1.0
 * @auth JackHappiness
 * @date 2019/3/26
 * @summary : User Model 实现类
 */
public class UserModel implements IUser {
    /**
     * 用户登录
     *
     * @param userPhone 手机
     * @param userPass  密码
     * @param listener  监听器
     */
    @Override
    public void login(String userPhone, String userPass, LoginListener listener) {
        if (TextUtils.isEmpty(userPhone)) {
            listener.fail("手机号不能为空");
        } else {
            if (TextUtils.isEmpty(userPass)) {
                listener.fail("密码不能为空不能为空");
            } else {
                //网络登录
                int code = postLogin(userPhone, userPass);
                if (code == 200) {
                    listener.success("登录成功");
                } else {
                    listener.fail("登录失败,请稍候重试");
                }
            }
        }
    }

    /**
     * 网络登录
     *
     * @param userPhone 手机
     * @param userPass  密码
     * @return 结果码
     */
    private int postLogin(String userPhone, String userPass) {
        return 0;
    }
}

//定义Controller
package yuekaoti.mvcdemo.controller;

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import yuekaoti.mvcdemo.R;
import yuekaoti.mvcdemo.custominterface.LoginListener;
import yuekaoti.mvcdemo.model.UserModel;

/**
 * MVC Controller
 */
public class MainActivityFragment extends Fragment implements View.OnClickListener {
    //View
    private View view;
    private EditText etPhone, etPass;
    private TextView tvResult;
    //Model
    private UserModel userModel;

    public MainActivityFragment() {
    }

    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.fragment_main, container, false);
        return view;
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        //创建model User对象
        userModel = new UserModel();
        //初始化控件
        etPhone = view.findViewById(R.id.etPhone);
        etPass = view.findViewById(R.id.etPass);
        Button btnLogin = view.findViewById(R.id.btnLogin);
        btnLogin.setOnClickListener(this);
        tvResult = view.findViewById(R.id.tvResult);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            //登录 view
            case R.id.btnLogin:
                String phone = etPhone.getText().toString().trim();
                String pass = etPass.getText().toString().trim();
                //调用登录
                userModel.login(phone, pass, new LoginListener() {
                    @Override
                    public void success(String result) {
                        updateResult(result);
                    }

                    @Override
                    public void fail(String errorMsg) {
                        updateResult(errorMsg);
                    }
                });
                break;
            default:
                break;
        }
    }

    /**
     * 更新结果
     *
     * @param msg 结果信息
     */
    @SuppressLint("SetTextI18n")
    private void updateResult(String msg) {
        tvResult.setText(getString(R.string.text_login_result) + ":" + msg);
    }
}

从代码中可以看出,Activity持有了UserModel模型的对象,当用户有点击Button交互的时候,Activity作为Controller控制层读取View视图层EditText View的数据,然后向Model模型发起数据请求,也就是调用UserModel对象的方法 login()方法。当Model模型处理数据结束后,通过接口LoginListener通知View视图层数据处理完毕,然后View视图层调用updateResult方法更新UI。至此,整个MVC框架流程就在Activity中完成。

代码中设计了一个IUser业务接口,然后实现接口的UserModel类。Controller控制器Activity调用UserModel类中的方法发起网络请求,然后通过注册LoginListener接口来获得网络请求的结果,通知View视图层更新UI和显示提示。至此,Activity就将View视图显示和Model模型数据处理隔离开了。Activity担当Contronller完成了Model和View之间的协调作用。

实例分析:在Android开发中,Activity并不是一个标准的MVC模式中的Controller,它的首要职责是加载应用的布局和初始化用户 界面,并接受并处理来自用户的操作请求,进而作出响应。随着界面及其逻辑的复杂度不断提升,Activity类的职责不断增加,以致变得庞大臃肿。Activity中的View关心业务和数据,才能知道自己该怎么展示(比如成功显示绿色,失败显示红色)。很难在不沟通的情况下一个负责获取数据,一个负责展示UI,完成这个功能!并且逻辑都在Activity里面,View和Controller根本没有分开,并且数据和View严重耦合。MVC的真实存在是MC(V)!

2.3 主要缺点

主要缺点有两个:

1、View对Model的依赖,会导致View也包含了业务逻辑;

2、Controller会变得很复杂。

2.4 演变MVP

对MVC的演变模式,主要解决MVC第一个缺点:将View和Model解耦。

2.5 演变MVVP

对MVP的优化模式,采用双向绑定,View的变动,自动反映在ViewModel,反之亦然。

2.6 下载实例

github Demo下载

2.7 参考资料

Android App的设计架构:MVC,MVP,MVVM与架构经验谈

mvc mvp mvvp区别

MVC中的项目案例 我们先一起来看看超期的效果图吧!!! 以上就是超期的效果图,我来解析一下:超期操作的模态窗体弹出的条件与归还一样,应选择需要超期的书籍,再弹出模态窗体,模态窗体弹出,数据自动回填上去,罚款金额=超期天数×0.2,获取当前时间为罚款时间,罚款成功后,可借册数(库存数)自动+1,书籍状态为归还。 再来聊聊视图的操作, 与归还操作一样,先给它一个小判断,再获取数据,回填上去。 超期天数(当前时间-到期时间) 而罚款金额,则是通过超期天数再乘上超期一天该罚的金额 注意:使用 pare.. 阅读详情

相关推荐

还不了解MVC、MVP、MVVM模式?(深度解析、全实例讲解)

MVP技术架构的项目结构非常清晰:把MVPModelViewPresenter,每个文件下分别是对应的接口和实现的类其中Model层的fanyi类是作为实现用GSON解析JSON信息的一个JavaBean我坚信,坚持学习,每天进步一点,滴水穿石,我们离成功都很近!以下是总结出来的字节经典面试题目,包含:计算机网络,Kotlin,数据结构与算法,Framework源码,微信小程序,NDK音视频开发,计算机网络等。字节高级Android经典面试题和答案。

2401_84003733的博客 2175

JSP( `EL表达式——获取数据` 和 `JSTL标签——展现数据`)(已被替代) 、 `MVC模式` 和 `三层架构`实现增删改查操作

>JSP 及 JSP 原理 > 在 JSP中使用 `EL表达式` 和 `JSTL标签` > `MVC模式` 和 `三层架构` > 完成品牌数据的增删改查功能

habe33的博客 1178

基于ASP.NET MVC项目实例

基于ASP.NET MVC框架的学习项目,包含MVC的框架的设计思路,通俗易懂学习MVC框架,需要VS2010及以上版本打开,初学者可以快速理解MVC的构思以及开发。

MVC综合案例

mvc

weixin_56777219的博客 1853

MVC源码案例

完整的mvc增删改查项目,很适合初学者来当作案例来学习,当初我也是通过此案例来开始对mvc的学习认识,希望对大家有帮助

D类功放几种常见“爆破音”问题根源与改善措施

在数字D类功放刚上电或功放播放状态切换时,人耳偶尔会听到“嘣”的声音,我们把这个爆破的Pop Noise。数字功放Pop Noise 出现的原因有很多,本文主要分析Pop Noise 出现原因,并提供相应解决方法。

qq_26815321的博客 3591

PHP MVC模式讲解及实例

一、MVC模式流程图 二、MVC概念 (1)作用 MVC包括控制器(Controller),模型(Model),视图(View)。 控制器的作用是调用模型和 视图,将模型产生的数据传递给视图,并让视图去显示 模型的作用是获取数据并处理返回数据 ...

YICONGITSME的博客 1万+

Mamba-YOLO实战:环境配置+模型训练+精度调优全流程指南(附Colab代码)

在目标检测领域,一场由状态空间模型引发的技术革新正在悄然改写行业格局。近期国际顶级学术期刊连续发布的YOLOv5_mamba、FER-YOLO等突破性成果,不仅刷新了检测精度记录,更开创了结构化状态空间模型(SSM)与经典检测框架的创新融合范式。当前该领域涌现的十大标杆性研究,已在以下维度取得突破性进展:√ 遮挡目标识别准确率提升38%√ 小样本场景泛化能力增强2.7倍√ 视频流检测延迟降低至17ms√ 多目标交叉干扰抑制效果达SOTA。

2501_90555291的博客 1581

一文带你全面了解MVC、MVP、MVVM模式(含实例讲解)

前言 在Android开发中,当你梳理完需求后,你要做的并不是马上写下你的第一行代码,而是需先设计好整个项目的技术框架 今天,我将全面介绍Android开发中主流的技术框架MVC、MVP与MVVM模式,并实例讲解MVP模式,希望您们会喜欢。 目录 示意图 1. 为什么要进行技术框架的设计 模块化功能 使得程序模块化,即:内部的高聚合、模块之间的低耦合 提高开发效率 开发人员...

WesleyLee1986的博客 617

TMC22系列步进电机驱动设计:从静音原理到硬件实战

步进电机驱动是运动控制系统的核心,其性能直接影响设备的精度、噪音和效率。传统驱动方案如A4988采用方波控制,存在转矩脉动大、运行噪音高等问题。而高性能驱动通过优化电流波形与切换策略,从根本上提升了运动质量。其中,**StealthChop2**技术通过同步MOSFET开关与电机反电动势过零点,实现了近乎无声的低速运行;**SpreadCycle**模式则通过逼近正弦波的电流调节,优化了中高速动态性能。这些技术为3D打印机、CNC机床、自动化设备等对静音和精度有要求的场景提供了关键解决方案。本文以广泛应用的

weixin_31858171的博客 353

DDR4/LPDDR4与DDR5/LPDDR5的差别

最新的 DDR5 可支持单一芯片容量 64Gbit,最高容量上限可增加到 128GB,较 DDR4 提高了四倍;价格:随着规格提升,DDR5 价格也较 DDR4 高出逾 50%,可能成为业者导入的阻碍。但如前所述,包括 5G、机器学习(ML)等各式进阶应用中,DDR5 的整体效能、规格的提升,对相关业者来说仍具一定优势与吸引力。电源管理 IC(PMIC IC):电源管理芯片内建至 DDR5 内存中,除可提高讯号完整性及噪声辨识能力,还能更具效率与扩展性;DDR5 规格与效能整理。(来源:JEDEC)

flomingo1的专栏 9017

三分钟让你深入了解//MVC、MVP、MVVM模式(深度解析、全实例讲解)

在Android开发中,当你梳理完需求后,你要做的并不是马上写下你的第一行代码,而是需先设计好整个项目的技术框架 今天,我将全面介绍Android开发中主流的技术框架MVC、MVP与MVVM模式,并实例讲解MVP模式,希望您们会喜欢。 目录 1. 为什么要进行技术框架的设计 模块化功能 使得程序模块化,即:内部的高聚合、模块之间的低耦合 提高开发效率 开发人员只需专注于某一点(视图显示、业务逻辑 / 数据处理) 提高测试效率 方便后续的测试 & 定位问题 切记:不要为了设..

粉丝交流群:569545109 506

嵌入式PCB电源完整性分析:PDN建模与电流密度优化

电源完整性(PI)是高速数字与混合信号系统稳定运行的基础,其核心在于保障芯片供电网络(PDN)在动态负载下的电压稳定与热安全。PDN分析本质上是通过量化电流密度与电压降两个关键物理量,揭示PCB走线、过孔及平面的载流瓶颈与压降路径。电流密度超标将引发局部温升与可靠性风险,而电压降则直接侵蚀器件供电裕量,导致复位、采样失真等典型故障。借助Altium Designer等工具开展工程级PDN建模,需严格依据电源预算表定义源/负载,并精准配置铜厚、过孔参数及IPC-2152限值,从而实现从原理图到制造工艺的闭环验

weixin_28949937的博客 209

php mvc,PHP——MVC模式讲解与实例

一、 MVC模式流程图二、MVC概念(1)作用MVC包括控制器(Controller),模型(Model),视图(View)。控制器的作用是调用模型和 视图,将模型产生的数据传递给视图,并让视图去显示模型的作用是获取数据并处理返回数据视图的作用是将取得的数据进行美化,并向用户终端输出(2)执行过程1. 浏览者 -> 调用控制器,发出指令2. 控制器 -> 按指令选择合适的模型3...

weixin_39983383的博客 301

2025_NIPS_Better Tokens for Better 3D: Advancing Vision-Language Modeling in 3D Medical Imaging

近年来,3D医学成像领域的视觉语言建模取得了显著进展,这得益于大规模带配对自由文本报告的计算机断层扫描(CT)语料库、更强大的架构以及高性能预训练模型。这些进展推动了自动报告生成和文本条件3D图像合成等应用的发展。然而,现有方法在处理高分辨率、长序列体积数据时仍面临挑战:对比预训练往往导致视觉编码器与临床语言错位,而基于切片的令牌化会模糊精细解剖结构,降低下游任务的诊断性能。

c_cpp_csharp的专栏 90

半导体器件仿真:双极型晶体管仿真_15.双极型晶体管的高级仿真技术

双极型晶体管(Bipolar Junction Transistor, BJT)是一种重要的半导体器件,广泛应用于放大、开关和调制等电路中。随着半导体技术的发展,对BJT的仿真要求也越来越高。本节将详细介绍双极型晶体管的高级仿真技术,包括器件模型的选择、仿真参数的优化、温度效应的考虑以及噪声分析等。

2401_87715305的博客 1243

这是一份全面 & 清晰的架构设计指南:MVC、MVP & MVVM模式(含实例讲解)

今天,我将全面介绍Android开发中主流的技术框架MVC、MVP 与 MVVM模式,并实例讲解MVP模式,

Carson带你学Android 5958

代数拓扑与AI架构:AI应用架构师深入探索数学研究如何分析复杂系统的结构特性

随着人工智能技术的飞速发展,AI系统变得越来越复杂。AI应用架构师需要有效的工具和方法来理解、设计和优化这些复杂系统。代数拓扑作为数学的一个分支,提供了独特的视角和技术来分析复杂系统的结构特性。本文旨在帮助AI应用架构师深入了解代数拓扑,以及如何将其应用于AI架构设计中,提升对复杂系统的分析能力。首先,我们会介绍代数拓扑和AI架构相关的核心概念及其联系,通过有趣的故事引入主题,让读者轻松理解复杂概念。接着,深入探讨代数拓扑的核心算法原理,结合具体的编程语言代码示例详细阐述。

大模型应用工坊 670

android课程项目总结:MVC模式(以ListView为实例讲解)

由于之前实习的时候就是用的MVC模式,所以主要总结下之前项目是如何运用MVC模式。 1. MVC模式 首先盗一张图,来自链接。 应对于我做的课程项目来说,是按照下图来分层的。 Model层 View层 Controller层 ExampleModel、ExampleDataSource、ExampleDataList xml文件、自定义View(.java文件) ExampleA...

一名正在成长的程序员 1140

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

全面了解MVC、MVP、MVVM模式(含实例讲解)

android 架构

qq_33635618的博客 591

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

[中文版]实例讲解JSP Model 2体系结构(探索MVC设计模式)--1

最近已经有了很多相关的介绍,JSP正在成为一种卓越的Java技术,可用于创建动态Web应用程序。Java程序员之所以喜爱JSP有数不清的理由。有些人喜欢它为交互式页面带来的“一次编写,处处使用”的方式;还有些人欣赏它是因为它容易学习,并且使他们可以把Java作为一种服务器端脚本语言来使用。但更多的还都是因为一个共同原因——使用JSP的最大好处是它能帮助你有效地把表达与内容分离开。在本文中,我对下面...

weixin_33895695的博客 442

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

简单工厂模式、单例模式以及MVC模式

本文是对简单工厂模式、单例模式、以及MVC模式的简单介绍。至于你问,为什么把这三种模式放在一起讲,笔者目前也很懵逼,因为这是一个作业...好了,言归正传。一、简单工厂模式(Simple Factory)严格的说,在23种设计模式中是没有简单工厂模式的,那么它的定位是什么呢?在23种设计模式中,有工厂方法模式和抽象工厂模式,而一般我们提到工厂模式却有三种,再加上简单工厂模式。因为,GOF在《设计模式

Yarn_的博客 5377

Android架构探究之MVC设计模式

Android框架探究之MVC设计模式1. 经典MVC模式介绍-Model-View-Controller2. Android的设计架构不同于经典MVC3. 在Android中如何实现标准的MVC设计架构?1. 首先我们创建个学生信息Bean类,StudentBean。和一个接口 OnUpdateViewList作为M层处理完毕后给C层的回调。2. Activity里做两件事,1,绑定xml中的控件并监听点击事件。2,向C层提供更新V层UI的可调用方法。3. StudentController里做两件事,1

ruiruiddd的博客 2286

Servlet MVC 项目实战实例

MVC的架构模式,一直是JavaEE开发中所遵循的标准,如今很多框架都已经很好的实现了MVC,像大家所熟知的Struts,SpringMVC,JSF等,但是如果没有任何框架的支持,仅仅通过JavaWeb中servlet,jsp等基本知识的运用,可以如何实现MVC的开发模式呢?本文将通过...

chuifuhuo6864的博客 105

mvc中jsp文件调用java_JSP使用Servlet作为控制器实现MVC模式实例详解

本文实例讲述了JSP使用Servlet作为控制器实现MVC模式的方法。分享给大家供大家参考。具体如下:一、目标:① 初步理解MVC模式;② 掌握Servlet的编写;③ 使用MVC模式完成登录功能。二、主要内容:① 分析JSP+JavaBean模式存在的问题,并介绍JSP+JavaBean+Servlet模式,以及和MVC模式的关系;② 通过简单实例介绍Servlet的编写、配置和运行;③ 采用S...

weixin_39805851的博客 416
上一篇: Fragment应该知道的一切(2)
下一篇: MVP模式讲解与实例
Litepal
博客等级 码龄12年 17粉丝 38原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值