MVC,MVP,MVVM的理解和区别

news2025/2/1 0:46:53

MVC

MVC ,早期的开发架构,在安卓里,用res代表V,activity代表Controller层,Model层完成数据请求,更新操作,activity完成view的绑定,以及业务逻辑的编写,更新view,这种模式是单向的,虽然代码存在分层,但是之间的耦合性还是很高,并且C层做的事情很多,久而久之会变得臃肿。

代码实现:

ViewModel

   static class  StudentModel{

        private String name;
        private int age;

        public StudentModel(String name, int age) {
            this.name = name;
            this.age = age;
        }

        public String getName() {
            return name;
        }

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

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }
    }

View层

    static class  StudentView{

       public  void PrintStudentData(String name ,int age){
           System.out.println("Student name:"+name+"   age:"+age);
       }

    }

Controller

static class StudentController{
        StudentModel model;
        StudentView view;

        public StudentController(StudentModel model, StudentView view) {
            this.model = model;
            this.view = view;
        }

        public void setStudentName(String name){
            model.setName(name);
        }

        public String getStudentName(){
            return model.getName();
        }

        public void setStudentAge(int age){
            model.setAge(age);
        }

        public  Integer getStudentAge(){
            return model.getAge();
        }

        public  void updateView(StudentView view){
            view.PrintStudentData(model.getName(),model.getAge());
        }


    }

完整代码

package com.example.lib;

public class MvcTest {

    public static void main(String[] args) {
        StudentModel student = getStudentDataBase();
        StudentView view = new StudentView();

        StudentController controller = new StudentController(student,view);
        controller.updateView(view);

        controller.setStudentName("lisi");
        controller.updateView(view);

    }

    public static StudentModel getStudentDataBase(){
        return new StudentModel("zhangsan",18);
    }

   static class  StudentModel{

        private String name;
        private int age;

        public StudentModel(String name, int age) {
            this.name = name;
            this.age = age;
        }

        public String getName() {
            return name;
        }

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

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }
    }


    static class  StudentView{

       public  void PrintStudentData(String name ,int age){
           System.out.println("Student name:"+name+"   age:"+age);
       }

    }

   static class StudentController{
        StudentModel model;
        StudentView view;

        public StudentController(StudentModel model, StudentView view) {
            this.model = model;
            this.view = view;
        }

        public void setStudentName(String name){
            model.setName(name);
        }

        public String getStudentName(){
            return model.getName();
        }

        public void setStudentAge(int age){
            model.setAge(age);
        }

        public  Integer getStudentAge(){
            return model.getAge();
        }

        public  void updateView(StudentView view){
            view.PrintStudentData(model.getName(),model.getAge());
        }


    }


}

MVP

于是,出现了MVP模式,这个架构模式在安卓移动端开发中比较常见,将Activity和res统一作为V层,Model层还是完成数据的请求和更新,新建了一个类Presenter,用来作为P层,这样的好处是,方便管理每一个Activity的业务逻辑,拿到数据后,通过接口回调的方式,更新View层,实现了双向通信。缺点是需要实现Presenter类,并且需要开发接口,对简单的业务逻辑比较繁琐,且P层的事情还是比较臃肿

代码实现(以登录事务为例):

ViewModel层

相比与MVC的ViewModel,MVP的不同在于ViewModle多实现了一个IUser接口,从而实现双向通信

    interface IUser{
        void login(String name,String password,OnLoginListener listener);
    }


    interface OnLoginListener{
        void loginFail();
        void loginSuccess(User user);
    }

    static class UserModel implements IUser{
        @Override
        public void login(String name, String password, OnLoginListener listener) {
            //模拟一下登录
            if(name.equals("admin")&&password.equals("123456")){
                User user = new User();
                user.setUsername(name);
                user.setPassword(password);
                listener.loginSuccess(user);
            }else{
                listener.loginFail();
            }
        }
    }

View层:

在Android开发中,MVP架构模式里,View层指的是Activity和res。同理,也实现了一个IUserLogin接口,从而和P层实现双向通信

 static class UserView implements IUserLogin{
        @Override
        public void showLoading() {
            System.out.println("正在登录...");
        }

        @Override
        public void hideLoading() {
            System.out.println("登录完成,获取结果");
        }

        @Override
        public void loginFail() {
            System.out.println("登录失败");
        }

        @Override
        public void loginSuccess(User user) {
            System.out.println("username:"+ user.getUsername()+" 登陆成功");
        }
    }

    interface IUserLogin{
        void showLoading();
        void hideLoading();
        void loginFail();
        void loginSuccess(User user);
    }

Presenter层

 static class UserPresenter {

        private final UserModel userModel;
        private final UserView userView;
        private final User user;

        public UserPresenter(UserView userView) {
            this.userModel = new UserModel();
            this.userView = userView;
            user = new User("admin","123456");
        }

        void login(){
            userView.showLoading();
            userModel.login(user.getUsername(), user.getPassword(), new OnLoginListener() {
                @Override
                public void loginFail() {
                    userView.hideLoading();
                    userView.loginFail();
                }

                @Override
                public void loginSuccess(User user) {
                    userView.hideLoading();
                    userView.loginSuccess(user);
                }
            });
        }
    }

完整代码如下:

package com.example.lib;

public class MvpTest {

    public static void main(String[] args) {

        UserView loginView  = new UserView();
        UserPresenter presenter = new UserPresenter(loginView);

        presenter.login();
    }

   static class User{
        String username;
        String password;

       public User() {

       }

       public User(String username, String password) {
           this.username = username;
           this.password = password;
       }

       public String getUsername() {
            return username;
        }

        public void setUsername(String username) {
            this.username = username;
        }

        public String getPassword() {
            return password;
        }

        public void setPassword(String password) {
            this.password = password;
        }
    }


    interface IUser{
        void login(String name,String password,OnLoginListener listener);
    }


    interface OnLoginListener{
        void loginFail();
        void loginSuccess(User user);
    }

    static class UserModel implements IUser{
        @Override
        public void login(String name, String password, OnLoginListener listener) {
            //模拟一下登录
            if(name.equals("admin")&&password.equals("123456")){
                User user = new User();
                user.setUsername(name);
                user.setPassword(password);
                listener.loginSuccess(user);
            }else{
                listener.loginFail();
            }
        }
    }

    static class UserView implements IUserLogin{
        @Override
        public void showLoading() {
            System.out.println("正在登录...");
        }

        @Override
        public void hideLoading() {
            System.out.println("登录完成,获取结果");
        }

        @Override
        public void loginFail() {
            System.out.println("登录失败");
        }

        @Override
        public void loginSuccess(User user) {
            System.out.println("username:"+ user.getUsername()+" 登陆成功");
        }
    }

    interface IUserLogin{
        void showLoading();
        void hideLoading();
        void loginFail();
        void loginSuccess(User user);
    }


    static class UserPresenter {

        private final UserModel userModel;
        private final UserView userView;
        private final User user;

        public UserPresenter(UserView userView) {
            this.userModel = new UserModel();
            this.userView = userView;
            user = new User("admin","123456");
        }

        void login(){
            userView.showLoading();
            userModel.login(user.getUsername(), user.getPassword(), new OnLoginListener() {
                @Override
                public void loginFail() {
                    userView.hideLoading();
                    userView.loginFail();
                }

                @Override
                public void loginSuccess(User user) {
                    userView.hideLoading();
                    userView.loginSuccess(user);
                }
            });
        }
    }



}

MVVM

再后面,就是MVVM,同理,Activity和res还是作为V层,Model层请求数据和更新,出现了一个ViewModel的层,这个类的职责在于,对数据进行绑定,以数据驱动View层,同样,当视图层改变后,Model层也能更新,从而实现了M和V之间的双向绑定。最常用的是谷歌2015年推出的jetpack的组件DataBinding,无须进行view绑定,避免了空指针等很多繁琐的业务逻辑。

代码实现:略,用JetPack提供的databinding即可

总结
MVC,MVP,MVVM的出现,都是为了视图分层,使代码结构,逻辑变得清晰,同时,实现类的单一职责,降低耦合度。但是同时选用架构设计模式的时候,也要根据业务类型来考虑,避免出现大多繁琐的设计,总之,一切为了开发效率。

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

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

相关文章

2359. 找到离给定两个节点最近的节点;1781. 所有子字符串美丽值之和;2406. 将区间分为最少组数

2359. 找到离给定两个节点最近的节点 核心思想:统计node1和node2分别到每个点的距离,然后在枚举每个点统计结果。关键在于如何统计node到每个点的距离,首先是初始化为inf很重要,因为在枚举的时候,因为是inf代表了这个节点无法到达…

MVC模式分层练习

新建库 新建表 插入点数据 先不用MVC模式写功能,来看下缺点是什么 新建一个空项目 选项项目使用的JDK 自己的IDEA总是要重启下 新建模块 因maven还没教 添加框架支持 添加后项目多了这些 添加些必要依赖 这里注意下,如果导入jar包不对可以重新导入下或者是jar包本身出了问…

设计模式-2--工厂模式(Factory Pattern)

一、 什么是工厂模式 工厂模式(Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的接口,但是将对象的实例化过程推迟到子类中。工厂模式允许通过调用一个共同的接口方法来创建不同类型的对象,而无需暴露对…

yolov5 应用整理

yolov5 应用整理 适用于0基础人员与有一定yolov5了解的人员食用. 关于yolov5参考: yolov5 github源码链接 目前参与过yolov5的应用: 平台库x86/arm cpuncnnx86libtorch/pytorchBM1684算能标准库(需要进行模型转换)昇腾cann(ascend api) https://gitee.com/Tencent/ncnn ht…

在windows下安装配置skywalking

1.下载地址 Downloads | Apache SkyWalkinghttp://skywalking.apache.org/downloads/ 2.文件目录说明 将文件解压后,可看到agent和bin目录: Agent:作为探针,安装在服务器端,进行数据采集和上报。 Config&#xff1a…

车联网仿真工具Veins安装指南(基于官方文档)

Veins安装指南 官方文档: tutorial 直接选择最easy的way: 下载一个虚拟机:VMware Workstation Player 下载即可。这个普通版是免费的,pro版正版是要收费的,可以找一些其他的方法下载pro版本,可以同时开…

windows11 利用vmware17 安装rocky9操作系统

下载相关软件和镜像 vmware17 下载 下载页面 Download VMware Workstation Pro ​ rocky8镜像下载 官网链接:Rocky Linux 下载页面 Download Rocky | Rocky Linux 点击Minimal下载 安装rocky9 选择镜像文件,点击下一步 点击下一步 启动虚拟机 选…

锂电池充电电路方案

锂电池充电电路一 原理图如下 都是比较小的,SOT-23-6 封装 此方案的优势是器件可以扩容,也就是可以替换成容量更大的mos管。 锂电池充电电路二 锂电池充电电路三 注意线的粗细。 引脚说明 锂电池电量检测电路 键盘上的电量检测电路原理图 电量检…

3D视觉测量:形位公差 平面度测量(附源码)

文章目录 0. 测试效果1. 基本内容2. 实现方法3. 代码实现4. 参考文章目录:3D视觉测量目录微信:dhlddxB站: Non-Stop_0. 测试效果 1. 基本内容 平面度是一个表达平面平整程度的度量指标,它描述了一个表面与一个理想平面之间的偏差程度。在工程和制造领域,平面度是一个重要的…

Neo-reGeorg隧道搭建

目录 Neo-regeorg前言 环境搭建 具体使用 kail安装Neo-reGeorg kail内生成webshell并设置密码 kail与win10连接 windows server内打开服务 kail虚拟机访问windows server以及所在的内网 Neo-regeorg前言 regeorg为reDuh的升级版,主要功能就是把内网服务器的…

windows11 利用vmware17 安装ky10-server-x86操作系统

下载相关软件和镜像 vmware17 下载 下载页面 Download VMware Workstation Pro ky10server-x86镜像下载 官网 国产操作系统、银河麒麟、中标麒麟、开放麒麟、星光麒麟——麒麟软件官方网站 (kylinos.cn) 选择对应版本去下载 安装 选择镜像,点击下一步 磁盘设置要…

springboot web开发静态资源的映射规则

前言 我们之间介绍过SpringBoot自动配置的原理,基本上是如下: xxxxAutoConfiguration:帮我们给容器中自动配置组件; xxxxProperties:配置类来封装配置文件的内容; web开发中都在org.springframework.boot.autoconfig…

一个月能做什么?成长感悟分享

一个月做了什么? 八月做了些什么? 单词打卡 第一件事情就是单词打卡 英语很差的我,一样继续打卡,今天是第736天 当你还在纠结扇贝和不背、可可英语哪一个好的时候,别人已经同时使用了 当你还在咨询学编程、敲代码需…

Linux上git的简单使用

git的作用:版本控制多人协作 客户端 磁盘上的文件-->本地仓库-->远端仓库 服务端 gitee和GitHub是基于git的商业化网站 git的命令行如何使用? 1、新建一个仓库 .git ignore 是忽略带有某些后缀的文件的上传。 例如:里面有 .sln …

输出图元(四)8-2 OpenGL画点函数、OpenGL画线函数

4.3 OpenGL画点函数 要描述一个点的几何要素,我们只需在世界坐标系中指定一个位置。然后该坐标位置和场景中已有的其他几何描述一起被传递给观察子程序。除非指定其他属性值,OpenGL 图元按默认的大小和颜色来显示。默认的图元颜色是白色&#x…

【链表OJ 10】环形链表Ⅱ(求入环节点)

前言: 💥🎈个人主页:​​​​​​Dream_Chaser~ 🎈💥 ✨✨刷题专栏:http://t.csdn.cn/UlvTc ⛳⛳本篇内容:力扣上链表OJ题目 目录 leetcode142. 环形链表 II 1.问题描述 2.代码思路 3.问题分析 leetcode142. 环形链…

案例挑战—java反射

这里写目录标题 背景一、为什么要使用反射?二、反射的应用反射常用应用的思维导图2.1获取class对象的三种方法示例代码 2.2利用反射获取构造方法示例代码 2.3利用反射获取成员变量示例代码 2.4利用反射获取成员方法 三、总结四、升华 背景 由于在公司自研的新项目架…

Java 乘等赋值运算

下面这个题目是在一公司发过来的,如果你对 Java 的赋值运算比较了解的话,会很快知道答案的。 这个运算符在 Java 里面叫做乘等或者乘和赋值操作符,它把左操作数和右操作数相乘赋值给左操作数。 例如下面的:density * invertedRat…

LeetCode(力扣)236. 二叉树的最近公共祖先Python

LeetCode236. 二叉树的最近公共祖先 题目链接代码 题目链接 https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/ 代码 # Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val x # self.…

微服务--SkayWalking(链路追踪:国产开源框架)

SkayWalking:分布式系统的应用程序性能监视工具 作用:分布式追踪、性能指标分析、应用、服务依赖分析; SkayWalking性能剖析: 我操,能够定位到某一个方法会有多慢。。。 通过Tid查看全局所有的日志信息&#xff08…