MVC架构模式(2)

简介:

       MVC最初是在Smaltalk_80中被用来构建用户界面的。M代表模型Model,V代表视图View,C代表控制器Controller。

       Model模型层,可以简单理解就是数据层,用于提供数据。在项目中,(简单理解)一般把数据访问和操作,比如将对象关系映射这样的代码作为Model层,也就是对数据库的操作这一些列的代码作为Model层。比如代码中我们会写DAO类型的代码,这个DAO可以理解为是属于Model层的代码。

       View视图层,就是UI界面,功能是与用户进行交互。一般所有的JSP、Html等页面就是View层。

       Controller控制层,Controller层的功能就是将Model和View层进行关联。比如View主要是显示数据的,但是数据又需要Model去访问,这样的话,View会先告诉Controller,然后Controller再告诉Model,Model请求完数据之后,再告诉View。

 

      

 

  MVC重要特点就是两种分离:

  视图和数据模型的分离:使用不同的视图对相同的数据进行展示;分离可视和不可视的组件,能够对模型进行独立测试。因为分离了可视组件减少了外部依赖利于测试。(数据库也是一种外部组件)

  视图和表现逻辑(Controller)的分离:Controller是一个表现逻辑的组件,并非一个业务逻辑组件。MVC可以作为表现模式也可以作为建构模式,意味这Controller也可以是业务逻辑。分离逻辑和具体展示,能够对逻辑进行独立测试。

  优点:耦合性低;重用性高;生命周期成本低;部署块;可维护性高;有利软件工程化管理。

  缺点:没有明确的定义;不适合小型,中等规模的应用程序;增加系统结构和实现的复用性;视图与控制器间的过于紧密的连接;视图对模型数据的低效率访问;一般高级的界面工具或构造器不支持模式。

 

适用场景:

       MVC 可以说是最经典的架构模式,它适用于大部分的开发场景,如果对架构不怎么了解,在MVC架构基础上进行封装与优化可以满足绝大部分的需求

 

解决的问题:

       实现一种动态的程序设计,是后序对程序的修改和扩展简化,并且使程序某一部分的重复利用称为可能。

  通过对复杂度的简化,使程序结构更加直观。

  将信息的内部表示与信息的呈现方式分离开来,并接受用户的请求。它分离了组件,并允许有效的代码重用。即,将模型和视图的实现代码分离,从而使同一个程序可以使用不同的表现形式。比如一批统计数据你可以分别用柱状图、饼图来表示。C存在的目的则是确保模型和视图的同步,一旦模型改变,视图应该同步更新。

       增加代码的重用率,减少数据表达、数据描述和应用操作的耦合度。同时也使得软件可维护性、可修复性、可扩展性,灵活性以及封装性大大提高

 

解决方案:

  通过把职责、性质相近的成分归结在一起,不相近的进行隔离,MVC将系统分解为模型、视图、控制器三部分,每一部分都相对独立,职责单一,在实现过程中可以专注于自身的核心逻辑。MVC是对系统复杂性的一种合理的梳理与切分,它的思想实质就是“关注点分离”。

 

实例:

       应用于基于MVC架构模式的框架,常见的服务器端MVC框架有:Struts、Spring MVC、ASP.NET MVC、Zend Framework、JSF;常见前端MVC框架:angularjs、reactjs、backbone;由MVC演化出了另外一些模式如:MVP、MVVM。

       其实 Android 开发本身默认的就是一套 MVC 实现。

       View 层:Android 开发中的 xml 布局就是我们的 View 层,默认情况下也建议 View 都尽量用 xml 实现,当然对于一些复杂的就需要我们自定义 View 了,自定义 View 同样也是属于 View 层,只不过大多数时候还是 xml 布局用的最多。

       Controller 层:毫无疑问,Android 默认也给我们提供了 Controller,就是 Activity & Fragment,仔细想想,是不是用户的交互事件,如输入、点击、滑动等都是在 Activity、Fragment 中处理的?关于这点有人认为 Activity & Fragment 属于 View 层,这个我是不认可的,View 应该专注界面的显示,Controller 处理用户的交互,提供给 View 需要的数据,从而让 View 正确的显示出来,而这都是 Activity & Fragment 的工作。

       Model 层:Android 中对 View 与 Controller 有了定义,其实没有对 Model 层做定义,而大部分架构都不会对 Model 层做定义,因为 Model 本身是跟业务相关,针对不同的业务模型,定义需要的数据模型与实体类,以及相关的业务逻辑处理,虽然 Android 没有明确定义 Model 层,但是我们在开发中都会定义一个专门的 model  package 用来统一管理所有的 model 文件,如 User、Order、Chat 等。

       下面举几个简单的例子:

  例如①,小时候玩的那种卡带式游戏机,Control是主机,一般来说我买一个主机就行了,只要他不坏,他就能一直让我玩这一类的游戏。View则是电视机和游戏手柄,电视机可以独立工作,他不管输入的是电视信号、影碟机信号还是游戏机信号,他只管显示,而且他决定了我们看到的效果是怎么样的,如果我想要个尺寸更大的或者彩色的显示效果,我只需要买个相应的电视机就行了,手柄也是可以换的,遥杆还是带震动的。Model则是游戏卡带,他决定了我玩的是什么游戏,是魂斗罗还是超级玛莉,而且游戏机主机和电视机生产厂家永远也不知道在上面有可能会运行什么样的游戏。卡带中可能会有游戏代码和存储单元,都根据游戏的需要而设计。

  例如②,一个采用比例表示的用于政治选举的一个简单信息系统,它提供了一个输入数据的电子数据表和表示当前结果的几种图标。用户可以通过图形接口与系统交互。所有信息显示必须立即反应出选举数据的变化。(引用自《面向模式的软件体系结构-卷1 模式系统》)

  即,一旦模型的数据发生了变化,模型要通报所有的视图。

 

MVC和三层架构的区别与联系:

       很多人都很容易把MVC和三层架构模式混淆,但其实两者有很大的区别。

       三层架构(3-tier application) 通常意义上的三层架构就是将整个业务应用划分为:

       表现层(UI):展现给用户的界面

       业务逻辑层(BLL):针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理

       数据访问层(DAL)::该层所做事务直接操作数据库,针对数据的增添、删除、修改、更新、查找等

       严格来说MVC(Model-View-Controller)三个加起来以后才是三层架构中的UI层,也就是说,MVC把三层架构中的UI层再度进行了分化,分成了控制器、视图、实体三个部分,控制器完成页面逻辑,通过实体来与界面层完成通话;而C层直接与三层中的BLL进行对话。

 

  MVC是表现层的架构,MVC的Model实际上是ViewModel,即供View进行展示的数据。 ViewModel不包含业务逻辑,也不包含数据读取。 而在N层架构中,一般还会有一个Model层,用来与数据库的表相对应,也就是所谓ORM中的O。这个Model可能是POCO,也可能是包含一些验证逻辑的实体类,一般也不包含数据读取。进行数据读取的是数据访问层。而作为UI层的MVC一般不直接操作数据访问层,中间会有一个业务逻辑层封装业务逻辑、调用数据访问层。UI层(Controller)通过业务逻辑层来得到数据(Model),并进行封装(ViewModel),然后选择相应的View

 

转载于:https://www.cnblogs.com/ghs1065248758/p/9099093.html

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

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

相关文章

ios学习之旅---指针也不难

1、认识指针#include <stdio.h> //基本数据类型作为函数參数传递是值传递 //void moveFront(int x ,int y) //{ // x x 2; //} void test() {// 确定当前坐标int x 20;int y 150;printf("%p\n",&x);printf("%lu\n",&x);*((int *)(0…

符合skyline的3dml网络发布服务

技术交流群&#xff1a;665060698使用java web实现&#xff1b;接口符合skyline的3dml模型形式&#xff1b;通过简单的发布界面&#xff0c;直接发布3dml模型&#xff1b;实现te pro在客户端读取数据&#xff1b;实现在te pro客户端的对应查询功能&#xff1b;负载可以达到skyl…

51NOD 1125(交换机器最小代价) (贪心) 思想 !思想!

题目链接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId1125 1125 交换机器的最小代价基准时间限制&#xff1a;1 秒 空间限制&#xff1a;131072 KB 分值: 80 难度&#xff1a;5级算法题收藏关注有N台机器重量各不相等&#xff0c;现在要求把这些机器按照…

《Python从小白到大牛》简介

《Python从小白到大牛》已经上市&#xff01; 本书是一部系统论述Python编程语言、OOP编程思想以及函数式编程思想的立体化教程&#xff08;含纸质图书、电子书、教学课件、源代码与视频教程&#xff09;。为便于读者高效学习&#xff0c;快速掌握Python编程方法。本书作者精心…

webpack学习

全局安装安装webapck npm i webpack -g 现在我们就可以全局的使用webpack命令了 webpack中基础的命令&#xff1a; webpack enter.js output.js --watch 这个命令是将enter.js打包成output.js&#xff0c;然后html只需要引用该文件就可以了看如下entry.js,这是简单的js代码。 /…

从ORA-27300,ORA-27301到ORA-00064

近期因为session数量添加&#xff0c;须要调整session&#xff0c;也就是要调整process參数。看是比較简单的一个问题&#xff0c;却遭遇了ORA-27300&#xff0c;ORA-27301。因为这个涉及到了有关内核參数kernel.sem的改动。以下是其详细描写叙述。1、故障现象OS版本号&#xf…

Halcon|读取3D相机点云数据

Halcon|读取3D相机点云数据 最近发现很多小伙伴在使用Halcon处理3D工业相机扫描结果的时候遇到了“如何读取”的问题。一般的3D工业相机储存数据的格式有txt格式、tif格式、csv格式、ply格式、ptx格式、bin格式、obj格式等。 txt格式 读取txt文件生成3D模型一般需要分析txt文件…

药片粘连物体的分割

药片粘连物体的分割要求&#xff1a;图片&#xff1a;处理程序&#xff1a;处理结果&#xff1a;要求&#xff1a; 将药片分割&#xff0c;统计药片数量。不能使用模板匹配。 图片&#xff1a; 先看一下要处理的原图&#xff1a; 处理程序&#xff1a; read_image (Image…

BZOJ 1026 [SCOI2009]windy数

1026: [SCOI2009]windy数 Description windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道&#xff0c;在A和B之间&#xff0c;包括A和B&#xff0c;总共有多少个windy数&#xff1f; Input 包含两个整数&#xff0c;A B。 Outp…

不连续区域的拟合

如下图&#xff0c;需要把图中4个半圆分别连接起来 我试过closing 和 dilation&#xff0c;下图中后三个还可以连接起来&#xff0c; 但是第一个因为不连续地方较长&#xff0c;如果增大closing的值&#xff0c;会导致其它点 出现过度畸形。 有没有能连接相邻选区的方法&#…

SPSS输出的结果都要写到文章中吗

SPSS输出的结果都要写到文章中吗 经常有人问到&#xff0c;SPSS输出的结果都要写到文章中吗&#xff1f;文章中应该写什么呢&#xff1f;比如&#xff0c;均值、中位数、众数、标准差、百分位数、最小值、最大值等等&#xff0c;都要出现在文章中吗&#xff1f;洋洋洒洒那么多&…

php Closure 类型

2019独角兽企业重金招聘Python工程师标准>>> <?php /*** Closure 理解* 匿名函数&#xff08;Anonymous functions&#xff09;&#xff0c;* 也叫闭包函数&#xff08;closures&#xff09;* Closure 是匿名函数的php中的称呼*/// 创建一个Closure$func funct…

ftk学习记(label篇)

【 声明&#xff1a;版权全部&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】还是接着上面的一篇博文。之前以前答应过大家&#xff0c;让大家看一下最简单的ftk程序是怎么执行的。所以&#xff0c;这里我们上传一下图片。由于…

扇形特征点提取

处理要求 分别找出扇形左上角&#xff0c;左下角&#xff0c;右上角&#xff0c;右下角&#xff0c;最高点&#xff0c;下面弓形最高点 原图 halcon 处理程序 read_image (Image14208259e49d7b1cf7c544, 544.bmp) rgb1_to_gray (Image14208259e49d7b1cf7c544, GrayImage) t…

Android Studio maven-metadata.xml 卡着不动原因和解决方法

头一天好好的&#xff0c;第二天就卡着了。 一直在这个地方不动&#xff0c;如果停止就会报 Error:Could not run build action using Gradle distribution ‘https://services.gradle.org/distributions/gradle-4.1-all.zip‘. 所以直接就去看了下链接&#xff1a;https://dl.…

halcon 圆环类缺陷检测的一种方法(极坐标变换法)

目录简介极坐标变换定义原理Halcon中的极坐标变换1、polar_trans_image_ext算子用法与参数剖析2、polar_trans_region_inv算子用法与参数剖析圆环类缺陷检测思路与步骤Halcon实例实例简介程序解读思路剖析应用实例1项目介绍处理程序处理效果应用实例2项目介绍处理程序处理效果简…

Halcon图像滤波方法与原理概述

目录简介Halcon算子与算法原理基础滤波a、均值滤波b、中值滤波c、高斯滤波d、导向滤波简介 图像滤波&#xff0c;即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制&#xff0c;是图像预处理中不可缺少的操作&#xff0c;其处理效果的好坏将直接影响到后续图像处理和…

Halcon深度学习环境搭建(win下)全网最全教程

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 本文链接&#xff1a;https://blog.csdn.net/cashmood/article/details/105042928 文章目录halcon深度学习介绍系统与环境搭建1、对电脑系统与硬件…

第二周进度及工作量统计

项目&#xff1a;词频统计修改 项目类型&#xff1a;个人项目 项目完成情况&#xff1a;已完成 项目改进&#xff1a;第二次改进 项目日期&#xff1a;2016.9.14----2.16.9.14 CCSEIT分析需求&#xff0c;设计15:2015:30010编码实现15:3016:20050文档程序说明&#xff0c;随笔2…

Dalsa线扫相机SDK开发-小试牛刀(1)

拿到了dalsa相机&#xff0c;可以用Sapera软件配置相机&#xff0c;进行图像采集。但是自己开发的话就得撸起袖子写代码了&#xff0c;查了两篇不错的博文&#xff0c;作为指导。 Sapera帮助文档 - 《好好先生》专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/liubing8609/a…