加深对于 MVC、MVP、MVVM 的概念理解
目录
MVC
MVC 是软件工程的一种软件架构模式,它不是具体的技术,而是一种代码分层的理念,主要体现了职责分离原则。
M-Model 模型
V-View 视图
C-Controller 控制器
对 MVC 的误解及缘由
误解:页面视图 = View ,Entity 和 Dto = Model
缘由:因为刚入坑程序员职业的时候,接触的是 ASP.NET Web Form 项目,而 ASP.NET Web Form 对于 Controller 和 View 的职责并没有很好的规划和定义,所以自己就很粗暴的把页面视图认为是 View 层。View 页面散列在各个 Controller 之下,虽竭力将文件夹命名清晰,但因为 Model 没有很好的实现,Dto乱飞,数据访问代码在 Controller 随处可见,某些 Controller 文件中代码堆积,各种逻辑全在 Controller 层。
尝试优化:将 View 归置到一个文件夹之下,将 Entity 和 Dto 独立类库,分出数据访问层 DataAccess 和 业务逻辑层 Business ,通用方法层 Common
项目结构大概是
- Demo.Web
- Views
- Controllers
- Demo.Entity
- Demo.Dto
- Demo.DataAccess
- Demo.Business
- Demo.Common
不太完美的结果:优化之后代码结构比之前的要清晰许多,Controller 放数据绑定代码和对参数的XSS校验和Sql注入校验。但是新的问题出现,数据库字段变动或者业务调整,Model 层的改动涉及到了 Entity、Dto、DataAccess、Business。在此不作 ASP.NET Web Form 和 ASP.NET MVC 的优劣比对。
MVP
MVP 是 MVC 模式的延伸,不是替代品。
P:Presenter
Presenter 包含着组件的事件处理,负责检索 Model 获取数据,和将获取的数据经过格式转换与 View 进行沟通。
摘自 Model-view-presenter - 维基百科,自由的百科全书
在我看来 Presenter 层应该是被包含在 Business 层,因为规划时对 Business 层的部分职责预想和上述引用完全一致。因为没有更具体地规划 Presenter ,所以后期项目中 Business 层和 Controller 层中参杂了本应由 Presenter 层承担的职责代码,降低了项目的可维护性。
MVVM
MVVM有助于将图形用户界面的开发与业务逻辑或后端逻辑(数据模型)的开发分离开来,这是通过置标语言或GUI代码实现的。MVVM的视图模型是一个值转换器,[1] 这意味着视图模型负责从模型中暴露(转换)数据对象,以便轻松管理和呈现对象。在这方面,视图模型比视图做得更多,并且处理大部分视图的显示逻辑。[1] 视图模型可以实现中介者模式,组织对视图所支持的用例集的后端逻辑的访问。
ViewModel 作为中介者,屏蔽了数据绑定过程代码和GUI代码,借助 XMAL 标记语言可以轻松完成复杂的 GUI 展示。WPF 的强大不用多说。
在此推荐两个按照 MVVM开发模式的开源项目
- riganti/dotvvm: Open source MVVM framework for Web Apps
- dotnetcore/WTM: WTM框架是针对中小规模后台管理系统的开发利器。基于DotNetCore,实现0编码创建项目,0编码生成业务模块。框架严格遵循MVVM的开发模式,并深得MVVM的精髓。对于新手,可以快速上手搭建项目;对于高手,可以把那些繁琐重复的工作交给框架生成,专心攻克需求难点。框架经过数十个真实项目检测,可以极大提高开发效率,降低开发成本。
加深对于 MVC、MVP、MVVM 的概念理解的更多相关文章
- Android App的设计架构:MVC,MVP,MVVM与架构经验谈
相关:http://www.cnblogs.com/wytiger/p/5996876.html 和MVC框架模式一样,Model模型处理数据代码不变在Android的App开发中,很多人经常会头疼于 ...
- MVC, MVP, MVVM比较以及区别(上)
MVC, MVP和MVVM都是用来解决界面呈现和逻辑代码分离而出现的模式.以前只是对它们有部分的了解,没有深入的研究过,对于一些里面的概念和区别也是一知半解.现在一边查资料,并结合自己的理解,来谈一下 ...
- MVC, MVP, MVVM比较以及区别
MVC, MVP和MVVM都是用来解决界面呈现和逻辑代码分离而出现的模式.以前只是对它们有部分的了解,没有深入的研究过,对于一些里面的概念和区别也是一知半解.现在一边查资料,并结合自己的理解,来谈一下 ...
- 浅析前端开发中的 MVC/MVP/MVVM 模式
MVC,MVP和MVVM都是常见的软件架构设计模式(Architectural Pattern),它通过分离关注点来改进代码的组织方式.不同于设计模式(Design Pattern),只是为了解决一类 ...
- 前端mvc mvp mvvm 架构介绍(vue重构项目一)
首先 我们为什么重构这个项目 1:我们现有的技术是前后台不分离,页面上采用esayUI+jq构成的单页面,每个所谓的单页面都是从后台胜场的唯一Id 与前端绑定,即使你找到了那个页面元素,也找不到所在的 ...
- Android App的设计架构:MVC,MVP,MVVM与架构AAAAA
1. 架构设计的目的1.1 通过设计使程序模块化,做到模块内部的高聚合和模块之间的低耦合.1.2 这样做的好处是使得程序在开发的过程中,开发人员只需要专注于一点,提高程序开发的效率,并且更容易进行后续 ...
- android MVC && MVP && MVVM分析和对比
相关:http://www.cnblogs.com/wytiger/p/5305087.html 出处http://blog.csdn.net/self_study,对技术感兴趣的同鞋加群544645 ...
- [转]MVVM架构~mvc,mvp,mvvm大话开篇
MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负 责显示.作为一种新的模式,MVP与MVC有着一 ...
- [1] MVC & MVP &MVVM
开发架构之MVC & MVP & MVVM
- 用户界面编程模式 MVC MVP MVVM
用户界面编程模式 MVC MVP MVVM 程序 = 数据 + 算法 数据:就是待处理的东西 算法:就是代码 涉及到人机交互的程序,不可避免涉及到界面和界面上显示的数据原始方式是界面代码和逻辑代码糅合 ...
随机推荐
- [转]Java Web工程目录结构
说明 介绍java web 工程的基本结构目录.记录java web 工程结构的学习. Java web 结构 java web严格来说分为两类工程结构:一个是工程编译目录结构,一个是工程发布目录结构 ...
- H3C 显示OSPF的链路状态数据库
- [转]WebApi 后端文件传输至远程服务器
/* 功能说明:微信退款需要有数字证书,而我们公司是做小程序平台的,会帮商家自动退款,所以会要求商家把微信证书上传至我们服务器,以便 微信退款. 使用HttpPostedFile 接受前端上传的文件, ...
- 移动端遇到的bug (长期更新)
移动端遇到的bug border-radius和transform在一起的bug 当父级设置了border-radius+overflow:hidden的时候,圆角是可以包住子级的,这是个很常见的场景 ...
- HDU 6709“Fishing Master”(贪心+优先级队列)
传送门 •参考资料 [1]:2019CCPC网络选拔赛 H.Fishing Master(思维+贪心) •题意 池塘里有 n 条鱼,捕捉一条鱼需要花费固定的 k 时间: 你有一个锅,每次只能煮一条鱼, ...
- vue组件中data是个函数
当我们const vm = new Vue({ el : '#app', data : { msg:‘hello World’ } })用习惯了,data是一个对象,可到了vue组件 Vue.co ...
- 1119 机器人走方格 V2 (组合数学)
M * N的方格,一个机器人从左上走到右下,只能向右或向下走.有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10^9 + 7的结果. Input 第1行,2个数M,N,中间用空格隔开 ...
- springBoot中使用使用junit测试文件上传,以及文件下载接口编写
本篇文章将介绍如何使junit在springBoot中测试文件的上传,首先先阅读如何在springBoot中进行接口测试. 文件上传操作测试代码 import org.junit.Before; im ...
- Linux 内核存取 I/O 和内存空间
一个 PCI 设备实现直至 6 个 I/O 地址区. 每个区由要么内存要么 I/O 区组成. 大部分 设备实现它们的 I/O 寄存器在内存区中, 因为通常它是一个完善的方法(如同在" I/O ...
- 探讨 java 的三大特性之一:继承
先回顾一下, Java 面向对象的三大特性包括:封装.继承.多态. PS:还有一些说四大特性,加了一个抽象 封装:将属性私有化,对外提供访问属性的方法,也可以不提供方法,这个特性叫做封装. 继承: 子 ...