MVC,MVP,MVVM的理解和区别

这篇具有很好参考价值的文章主要介绍了MVC,MVP,MVVM的理解和区别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

MVC

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

MVC,MVP,MVVM的理解和区别,Android基础,mvc

代码实现:

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());
        }


    }


}

MVC,MVP,MVVM的理解和区别,Android基础,mvc

MVP

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

MVC,MVP,MVVM的理解和区别,Android基础,mvc

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

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);
                }
            });
        }
    }



}

MVC,MVP,MVVM的理解和区别,Android基础,mvc

MVVM

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

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

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

到了这里,关于MVC,MVP,MVVM的理解和区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android面试题:MVC、MVP、MVVM

    MVC结构: 1.MVC(Model-View-Controller) 2.Model:对数据库的操作、对网络等的操作都应该在Model里面处理,当然对业务计算,变更等操作也是必须放在的该层的。 3.View:主要包括一下View及ViewGroup控件,可以是系统控件也可以是自定义控件。4.Controller:Android的控制层通常在Activity、Fragmen

    2024年02月11日
    浏览(31)
  • 安卓基础巩固(四):设计原则、安卓主流技术框架MVC/MVP/MVVM、设计模式

    模块化功能:使得程序模块化,即内部高聚合,模块之间低耦合 提高开发效率:开发人员只需要专注于一点(视图显示、业务逻辑、数据处理) 提高测试效率:后期测试时可以迅速根据报错反馈,定位到问题出现的位置。 六大设计原则是设计模式的理论,设计模式是设计原

    2024年02月06日
    浏览(38)
  • 【软件架构模式——MVC、MVP、MVVM】

    1. MVC(Model-View-Controller) 概念介绍: MVC是一种软件架构模式,用于组织应用程序的代码和逻辑。它将应用程序分为三个核心部分:模型(Model)、视图(View)和控制器(Controller)。 **模型(Model)**负责处理应用程序的数据逻辑和状态。它表示应用程序的数据源,并封装了与

    2024年02月11日
    浏览(40)
  • 浅谈下mvc和mvp、mvvm到mvvm+Jetpack

    作者:抓不住老鼠的猫 MVC MVC全名为Model-View-Controller,图解如下 View:负责与用户交汇,显示界面。 Controller:负责接收来自view的请求,处理业务逻辑。 Model:负责数据逻辑,网络请求数据以及本地数据库操作数据等。 在MVC架构中,Controller是业务的主要承载者,几乎所有的业

    2024年02月16日
    浏览(32)
  • 【面试题】MVC、MVP与MVVM模式是什么?

     MVC模式 MVC是应用最广泛的软件架构之一,一般 MVC 分为: Model ( 模型 ) 、 Controller ( 控制器 ) 、 View ( 视图 ) 。 这主要是基于分层的目的,让彼此的职责分开。 View 一般通过 Controller 来和 Model 进行联系。 Controller 是 Model 和 View 的协调者, View 和 Model 不直接联系。基

    2024年02月11日
    浏览(28)
  • 编程框架概述:MVC, MVP, MVVM, Flux/Redux, 和 Clean Architecture

            在软件开发中,选择合适的编程框架和架构模式对于构建可维护和可扩展的应用程序至关重要。初学者在面对多种架构选项时可能会感到困惑。本文将详细介绍五种流行的编程框架:MVC、MVP、MVVM、Flux/Redux和Clean Architecture。 MVC是一种将应用程序分为三个核心组件的架

    2024年01月20日
    浏览(45)
  • MVC、MVP、MVVM的成本角度结合业务,如何考虑选型?一文了解方方面面

    大家都知道,使用架构的目的是使程序模块化,做到模块内部的高聚合和模块之间的低耦合,使得程序在开发的过程中,开发人员只需要专注于一点,提高程序开发的效率。那么MVC、MVP、MVVM,该怎么选?在什么最省去开发时间和业务成本? 本篇来彻底理解MVC、MVP、MVVM这三个

    2024年02月10日
    浏览(27)
  • [架构之路-195]-《软考-系统分析师》- MVC、MVP、MVVM架构各自的优缺点

    目录 前言: 一、MVC 1.1 MVC的基本结构 1.2 MVC的工作流程 1.3 MVC的优缺点 二、MVP 2.1 MVP的基本结构 2.2 MVP的工作流程 2.3 MVP的优缺点 三、MVVM 3.1 MVVM的基本结构 3.2 MVVM的工作流程 3.3 MVVM的优缺点 MVC: 一个controller对应多个view,model可以直接通过view。从大锅烩时代进化,引入了分层

    2024年02月04日
    浏览(41)
  • MVC 和 MVVM的区别

    M(model数据)、V(view视图),C(controlle控制器) 缺点是前后端无法独立开发,必须等后端接口做好了才可以往下走; 前端没有自己的数据中心,太过依赖后台 M(model数据)、V(view视图)、VM(viewModel控制数据的改变和控制视图) html部分相当于View层,可以看到这里的Vi

    2024年01月25日
    浏览(29)
  • MVC与MVVM模式的区别

    Model(模型):用于处理应用程序数据逻辑,负责在数据库中存取数据。处理数据的crud View(视图):处理数据显示的部分。通常视图是依据模型数据创建的。 Controller(控制器):处理 数据显示 的部分,控制器负责从视图读取数据,控制用户输入,并将数据发送给模型。一

    2024年02月15日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包