MVP、MVVM,MVC设计模式的实例分析

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

简单介绍

一个典型的MVC的模式
在这里插入图片描述
可以看到,这个是非常自然的想法。也无怪乎是人类第一种提出来的方案。这个的问题就是用久了的话,
MVC的使用非常常见,可以看一下经典的SpringMVC
在这里插入图片描述

controller会变得非常复杂,因为主要的业务逻辑都会集中在controller里,controller既要负责更新数据,又要负责选择视图,又要负责处理用户请求。另一个问题,view是依赖于model的。代码很有可能导致view根据model的数据进行业务逻辑判断后进行展示。所以,有人又提出了MVVM
在这里插入图片描述
这种情况下,前端界面和ViewModel严格绑定。这样杜绝了View中掺杂业务逻辑。Controller(现在的ViewModel)的部分逻辑拆入到了Service当中,保证ViewModel的代码足够简洁。

实例

先只考虑V和P的分离,在这里,我们用接口实现
首先,程序先实例化V,主函数代码如下

    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new FrmTestMvp());
        }
    }

然后,我们让V去实例化P,将对自己的引用传给P
VIEW代码如下

    public partial class FrmTestMvp : Form, ITestMvpView
    {
        private TestMvpPresenter _testMvpPresenter;

        public FrmTestMvp()
        {
            InitializeComponent();
            //注意构造Presenter时需把自身传过去
            this._testMvpPresenter = new TestMvpPresenter(this);
        }

        //单击按钮事件
        private void button1_Click(object sender, EventArgs e)
        {
            if (Click != null) 
            {
                Click();
            }
        }

        #region ITestMvpView 成员

        //实现接口属性方法
        public TextBox TextBox1
        {
            get { return this.textBox1; }
        }

        //委托事件
        public new event Button1_Click Click;
      
        #endregion
    }

VIEW实现了如下接口。这让我们的Presenter可以支持多个VIEW,只要他作出了对接口的实现

    //声明了一个委托类型,并在接口安上了和这个委托类型相关的事件
    public delegate void Button1_Click();

    interface ITestMvpView
    {
        //声明控件
        TextBox TextBox1{get;}
        //事件
        event Button1_Click Click;
    }

最后就是我们的Presenter部分,利用界面给它的接口来访问界面。

    class TestMvpPresenter
    {
        private ITestMvpView _testMvpView;

        /// <summary>
        /// 构造函数,出入视图接口
        /// </summary>
        /// <param name="testMvpView">ITestMvpView接口</param>
        public TestMvpPresenter(ITestMvpView testMvpView) 
        {
            this._testMvpView = testMvpView;
            this.InitEvent();
        }

        //加载委托事件
        private void InitEvent() 
        {
            this._testMvpView.Click += new Button1_Click(_testMvpView_Click);
        }

        //处理事件
        void _testMvpView_Click()
        {
            if (CheckValue())
            {
                this.ShowMessage(this._testMvpView.TextBox1.Text);
            }
            else
            {
                this.ShowMessage("输入的值不能为空!");
                this._testMvpView.TextBox1.Focus();
            }           
        }

        //检查TestBox1的输入值是否合法
        private bool CheckValue()
        {
            if (this._testMvpView.TextBox1.Text.ToString() == "") 
            {
                return false;
            }
            return true;
        }

        private void ShowMessage(string message) 
        {
            MessageBox.Show(message);
        }
    }

实际上,上面的例子是先初始化view,然后初始化presenter的方式,我们成为view-first。反过来当然也一样,叫做presenter-first方式。
另外一个例子,首先,在来看我们的Model,model是一个只包含属性的实体类.书写如下

    public class TestMvpModel
    {
        public string Name { get; set; }
    }

然后写我们的view类
View类中依赖model,并负责model和view的绑定

   public partial class FrmTestMvp : Form
    {
        private TestMvpModel model;
        public TestMvpModel Model
        {
            get
            {
                return model as TestMvpModel;
            }
            set
            {
                model = value as TestMvpModel;
                label1.Text = model.Name;
            }
        }

        public FrmTestMvp()
        {
            InitializeComponent();
        }

        public EventHandler ButtonClick;

        private void button1_Click(object sender, EventArgs e)
        {
            if (ButtonClick != null)
            {
                ButtonClick(sender,e);
            }
        }
    }

最后写我们的presenter,负责一切的初始化,和页面逻辑的控制

 class TestMvpPresenter
    {
        public FrmTestMvp View { get; set; }
        public TestMvpPresenter(FrmTestMvp view)
        {
            this.View = view;

            this.View.Model = new TestMvpModel() {Name = "GDL" };

            this.View.ButtonClick += delegate
            {
                this.View.Model = new TestMvpModel() { Name = "ABC" };
            };
        }

    }

主程序改为如下

        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            TestMvpPresenter presenter = new TestMvpPresenter(new FrmTestMvp());
            Application.Run(presenter.View);
        }

在我的理解中,MVP模式的核心就是将传统VIEW中相互耦合的业务逻辑,页面静态部分,和页面中动态部分分开。页面中不变的静态部分继续放在view里。动态部分放在model里。而业务逻辑放在我们的presenter中。
是不是觉得上面的view代码有点多,还需要手工绑定两件事:
(1)页面动作和presenter中的处理函数

        private void button1_Click(object sender, EventArgs e)
        {
            if (ButtonClick != null)
            {
                ButtonClick(sender,e);
            }
        }

(2)模型和页面的一致性变化

        public TestMvpModel Model
        {
            get
            {
                return model as TestMvpModel;
            }
            set
            {
                model = value as TestMvpModel;
                label1.Text = model.Name;
            }
        }

所以,微软又推出了WPF。我们来看一下WPF中的view典型写法

<Window x:Class="MVPDemo2.PanelView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="PanelView" Height="300" Width="300">
    <Grid>
        <Label Height="28" HorizontalAlignment="Left" Margin="10,10,0,0" Name="label1" VerticalAlignment="Top" Width="120" Content="{Binding Name}" />
        <Button Height="24" HorizontalAlignment="Left" Margin="10,79,0,0" Name="btnModify" VerticalAlignment="Top" Width="111" Click="btnModify_Click">修改Label的文字</Button>
    </Grid>
</Window>

显然,在上述的XAML中,已经对前文提到的两件事进行了绑定。在wpf下,我们可以轻松的写出model代码(#region部分为INotifyPropertyChanged
接口添加)

    public class PanelPresenterationModel : INotifyPropertyChanged
    {
        private string name;

        public string Name
        {
            get
            {
                return this.name;
            }
            set
            {
                if (this.name != value)
                {
                    this.name = value;
                    this.OnPropertyChanged("Name");
                }
            }
        }

        #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;

        private void OnPropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler Handler = PropertyChanged;
            if (Handler != null) Handler(this, new PropertyChangedEventArgs(propertyName));
        }

        #endregion
    }

我们给出presenter代码

    public class PanelPresenter
    {
        public PanelPresenter(PanelView view)
        {
            this.View = view;

            //初始化Model
            this.View.Model = new PanelPresenterationModel() { Name = "Bao, Jianqiang" };

            this.View.ButtonClick += delegate
            {
                this.View.Model.Name = "Jax.Bao";

            };
        }

        public PanelView View { get; set; }
    }

我们看到WPF很成功的实现了MVP。

然而,还有好事者,他们开发了MVVM模式
Simple Mvvm,Mvvm Light和Prism都是MVVM的开源框架
下面只贴上典型的viewmodel的实例

namespace SilverlightApplication2.ViewModels
{
    public class StudentViewModel : NotificationObject
    {
        public StudentViewModel()
        {
            student = new Student();
        }

        Student student;
        public Student Student 
        {
            get
            {
                return this.student;
            }
            private set
            {
                this.student = value;
                this.RaisePropertyChanged(() => this.student);
            }
        }
        public bool CanSubmit
        {
            get
            {
                return true;
            }
        }

        public void Submit()
        {
            student.Mock();
        }
    }
}

在上代码中可以看见,viewmodel又负责处理view内容的更新,同时也负责对model内容进行同步调整。下面展现了一个一般MVVM系统的架构
这里写图片描述

下面,我们用一个图来解释MVC
这里写图片描述
MVC架构和MVP架构的区别
这里写图片描述

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... 阅读详情

相关推荐

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

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

weixin_45365889的博客 1496

WPF经典编程模式MVVM介绍及其简单的实例

一、MVVM理论知识 WPF技术的主要特点是数据驱动UI,所以再使用WPF技术开发的过程中是以数据为核心的,WPF提供了数据绑定机制,当数据发生变化时,WPF会自动发出通知去更新UI。 使用WPF开发中,经典的编程模式时MVVM,是为WPF量身定做的模式,改模式充分利用了WPF的数据绑定机制,最大限度的减低了XMAL和CS文件的耦合度。与WinForm开发相比,我们一般在后台代码中会使用控件的名字来操作控件的属性来更新UI,而在WPF中通常是通过数据绑定来更新UI;在响应用户操作上,WinForm是通过控件

weixin_42974146的博客 1830

MVC、MVP和MVVM这三种设计模式的区别

MVC、MVP 和 MVVM 这三种设计模式的区别

是阿超 2461

C#:WPF中实现MVVM设计模式小例子

1、监听者文件夹中的两个类,都是固定写法,具体代码含义不用明白(事实是我自己不懂,我也是抄的),只需要知道这两个类实现了监听界面上的值变化了、界面上的按钮被点击了、ViewModie中的属性被改变了、ViewModie中的命令可以被执行了(其实也是属性被改变)。3、当我们点击按钮的时候,触发了一个命令,这时候我们想传入一个参数,这种情况我们就要改变一下ICommandClass(监听者文件夹中的一个类)个人习惯是第一步先实现Monitor监听者类,以下为类中的代码,都是固定写法,直接复制粘贴即可。

y1612559111的博客 2444

WPF的MVVM模式完整示例(登录窗口)

这个Demo是WPF的MVVM模式的一个登录窗口的完整实例,包含了在MVVM模式下的数据绑定、命令和事件、PasswordBox的绑定、RadioButton等一对多控件的绑定、关闭窗口和打开新窗口和数据验证等内容。

WPF MVVM完整示例(登录窗口)

包含了在MVVM模式下的数据绑定、命令和事件、PasswordBox的绑定、RadioButton等一对多控件的绑定、关闭窗口和打开新窗口和数据验证等内容。

WPF:MVVM框架的简单例程

本文参照于刘铁猛老师“深入浅出WPF”系列视频的一个计算器的例子,并做了相应改进,使其更符合MVVM模式界面和业务分离的核心思想。

我爱学习,学习爱我 2877

3-RRR并联机器人结构详解:从运动学到奇异点分析(附MATLAB仿真代码)

本文详细解析了3-RRR并联机器人的结构设计、运动学建模及奇异点分析,并提供了MATLAB仿真代码。通过对称性设计和可分析性,3-RRR结构成为教学与研究的理想对象。文章从基础杆件参数设置到奇异位形的实时捕捉,深入探讨了机构运动的数学本质,并分享了仿真调试中的实用技巧,助力工业自动化和精密控制应用。

sunny的博客 367

WPF应用程序 MVVM开发示例

WPF(Windows Presentation Foundation)是微软推出的基于Windows 的用户界面框架。 MVVM是Model-View-ViewModel的简写。

Mr_Bobcp的博客 6875

Android 面试题 Handler篇

1.Handler的实现原理。

ViewHandKownHealth的博客 955

CMU动作捕捉数据集实战:从AMC文件到Python可视化的完整流程

本文提供了CMU动作捕捉数据集的完整实战指南,详细解析了AMC文件格式,并对比了MATLAB转换、Python原生解析及转换为BVH格式三种数据解析策略。重点介绍了如何构建Python数据处理与可视化管道,包括将数据转换为Pandas DataFrame、绘制时间序列与相关性热力图,以及实现3D骨架动画,帮助开发者高效利用这一经典动作捕获数据集进行运动分析与模型训练。

android的专栏 716

WPF 之MVVM实例

一、安装 1、nuget搜索“mvvmlight”安装 安装完成安装了如下3个相关插件 mvvmlights和commonservicelocator是自动关联安装的 2、安装时版本不要选最新,否则后期会提示找不到相关引用 如下图,安装4.X版本 3、安装完成后,项目目录下自动生成viewmodel文件夹和viewmodellocator类 viewmodellocato...

zhang8907xiaoyue的博客 1571

SystemVerilog新手实战指南:iverilog与VScode的完美组合

本文为SystemVerilog新手提供了一套高效入门方案,详细介绍了如何利用开源编译器iverilog与轻量编辑器VScode搭建学习环境。内容涵盖十分钟快速安装配置、首个工程从编码到查看波形的完整流程,并演示了动态数组和队列等SystemVerilog新特性的使用,旨在帮助初学者避开复杂商业工具,快速掌握数字电路设计与验证的核心技能。

f6g7h8i9j的博客 514

MVC、MVP、MVVM

MVC、MVP、MVVM的差異特點 Understanding Basics of UI Design Pattern MVC, MVP and MVVM Web前端开发:为何选择MVVM而非MVC 从MVC在前端开发中的局限性谈起 闲话Web编程模型:WebForm、MVP还是MVC? 专访微软MVP衣明志:走进ASP.NET MVC 2框架开发 使用 MVP 模式改进 Web 窗体...

weixin_30511107的博客 72

【gridsample】地平线征程6芯片中gridsample算子的优化与部署实践

本文详细介绍了地平线征程6芯片中gridsample算子的优化与部署实践,重点探讨了PTQ和QAT量化方案在BEV感知任务中的应用。通过双线性插值优化、内存布局调整和混合精度配置等关键技术,显著提升了算子在自动驾驶场景下的性能和精度,为开发者提供了实用的部署指南和调优建议。

zero1的博客 1019

从零开始:IBM V3700控制器更换与机器代码升级全流程指南

本文详细介绍了IBM V3700存储系统控制器更换与机器代码升级的全流程指南。从前期准备、硬件更换到版本同步,逐步解析如何应对503错误等常见问题,确保系统稳定运行。通过实战案例和优化建议,帮助工程师高效完成维护任务,提升存储系统可用性。

weixin_28365523的博客 312

MVP模式

一、软件设计鼻祖MVC 1.1、MVC 第一次听到MVC这个名词是在C#中,相信对于MVC大家都已经很熟悉了,作为一种软件设计模式,MVC这个概念已经诞生好多年了。 如果你已经开发一段时间的iOS应用,你一定听说过Model-View-Controller,在iOS开发中Apple从一开始就给我们引入这一理念,相信这个名词大家都不陌生。 模型-视图-控制器(Model-View-Contr...

weixin_30301449的博客 192

Hermes深入理解及源码解析(二):Hermes的记忆机制

源码位置:tools/memory_tool.py存储内容为两个文件,放在 ~/.hermes/memories/:MEMORY.md:Agent 自己的笔记(环境事实、项目约定、工具坑、学到的东西)—— 上限 2200 字符USER.md:关于用户的画像(角色、偏好、沟通风格)—— 上限 1375 字符作为一个独立的工具注册在系统中(为了让智能体正确使用它,System Prompt()中明确下达了禁令存储目标存储位置数据类型持久偏好/事实MEMORY.md我是谁、我喜欢什么、环境配置。

qq_41984117的博客 560

MVC、MVP和MVVM三种设计模式之间的区别是什么

在MVC中,View会直接从Model中读取数据而不是通过 Controller;View和 Controller之间存在多对一关系。在MVP中,View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部;View和Presenter之间是一对一关系。

峰会路转的博客 2507

微信小程序 - 下单账号和支付账号不一致,请核实后再支付(微信小程序或微信H5页面/微信公众号网页支付时报错:“下单账号和支付账号不一致,请核实后再支付”,买家微信支付时提示错误)详细排查和解决方案!

微信支付出现 “下单账号与支付账号不一致,请核实后再支付”微信小程序下单账号与支付账号不一致不让支付,微信公众号网页 微信H5页面JS-SDK支付时出现错误:下单账号和支付账号不一致,请核实后再支付,openId导致的微信中“下单账号和支付账号不一致”原因及解决办法,调用统一下单所传openId与实际支付用户的openId不一致,微信支付jssdk报错,检查了没有不一致依然报错怎么办,微信支付下单账号和支付账号不一致,请核实后再支付,微信支付功能用JSAPI支付,H5页面负责下单并支付jsapi,微信调起支

🏆 前端领域优质创作者 5331

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

MVC、MVP、MVVM三种区别

一直以来对MVC、MVP、MVVP三种理念理解不是特别深刻,今天主要讲讲我对三种设计模式的理解和它们的适用场合; 1.MVC MVC模式最初生根于服务器端的Web开发,后来渐渐能够胜任客户端的Web开发,能够满足其复杂性和丰富性; 从实现上来说,主要可以分为后端MVC和前端MVC两种;这两种MVC的不同点如下: 可以看到,前端的MVC其实是为了解决前端复杂JS模块化的问题,从后端MVC的V分出来的MVC,与后端MVC并没有直接的关系。前端的MVC中,M占的比例很低,只指代数据。而后端V的比例很低.

Tiger的专栏 7914

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

MVC,MVP,MVVM设计模式的比较

MVC,MVP,MVVM设计模式的比较

JackChan 4563

IEM模型,地表粗糙度模拟

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

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

MVVM、MVP、MVC

MVVM、MVP、MVC的三大核心部分、核心机制、工作流程以及优势

2201_75883040的博客 1483

iOS——MVC、MVP、MVVM

MVC模式是将应用程序分成三个部分的一种架构模式,一般分为:Model(模型),View(视图),Controller(控制器)。三者关系如图:MVC的优缺点:优点:能提高开发效率,减少冗余代码缺点:会出现大量代码堆积在ViewController中对Model层的误解、误用:很多人把Model理解成只是单独的数据模型,比如上面示例中只定义了几个字段,但Model层正确定义是业务模型层,就是所有业务数据以及数据逻辑都应该在Model层中。

qq_74177011的博客 1962
上一篇: JAVA EE基础教程(5)hibernate的基本使用(视频笔记)
下一篇: JAVA C# C/C++之比教学:继承
define_us
博客等级 码龄14年 157粉丝 531原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值