当前位置: 首页 > 编程日记 > 正文

谈 三层结构与MVC模式的区别

谈 三层结构与MVC模式的区别

在CSDN和园子里有朋友谈到三层与MVC的区别,以前也有人抛出这个问题,本人对来公司面试的朋友也偶乐会提这方面的问题。
    那么我也来讲讲我对这两者的理解吧。
    首先对这个题目,本身是存在问题的,“XX结构”与“XX模式”的区别?请问中国社会制度与美国人生活方式有什么区别?
    这两者本身讲的是不同方向与角度的问题,在实际应用中他们的确存在一些相似的特点,在很多书籍中也没有深入讲解,以致于造成困惑,为了更好的理解他们,姑且来说说区别吧。
首先N层结构是一种软件抽象的层次结构,是对复杂软件的一种纵向切分,每一层次中完成同一类型的操作,以便将各种代码以其完成的使命作为依据来分割,以将低软件的复杂度,提高其可维护性。一般来说,层次之间是向下依赖的,下层代码未确定其接口(契约)前,上层代码是无法开发的,下层代码接口(契约)的变化将使上层的代码一起变化。三层结构是N层结构的一种,是人产在长时间使用中得出来的一种应用场合广泛的N层结构,被当作一种典型的软件层次结构而广为流传甚至写入教科书。
    MVC模式是一种复合设计模式,一种在特定场合用于解决某种实际问题来得出的可以反复实践的解决方案。巧合的是他也有三个事物组成,于是乎人们就有了一种想当然的对应关系:展示层-View;业务逻辑层-Control;持久层-Model。首先MVC中的三个事物之间并不存在明显的层次结构,没有明显的向下依赖关系,相反的,View和Model往往是比较独立的,而Control是连接两者的桥梁,他们更像是横向的切分。这样一来就出现一个结果,MVC中每个块都是可以独立测试的,而三层结构中,上层模块的运行测试势必要提供下层代码或者提供相同接口的桩。相对来说,MVC复杂得多,但是结构更清晰,耦合性更低。
    另外,MVC中每一块内部特别是Model内部经常被设计为多层的。在我认为的一个良好的MVC模式构建的结构中,Control是核心,小且较为稳定的,可以作为一个核心框架来提供,有扩展点,但基本上可以简单配置不需要任何代码就可以运行。而View则可能是一套或多种可选择的视图引擎,决定了软件展示给用于的界面,使用时的主要工作量在于扩展点以及根据需要而数量不同的视图模板。Model则是业务提供者,决定了软件提供的功能,其内部可能是一些普通的类或者是实现了某些接口的类,在这一块当中可能根据业务的不同而色彩缤纷,对于复杂的软件可能会分成很多层,如业务逻辑层、业务提供层、系统提供层、数据提供层、数据访问层等。
    我经常用于比喻MVC的例子是小时候玩的那种卡带式游戏机,Control是主机,一般来说我买一个主机就行了,只要他不坏,他就能一直让我玩这一类的游戏。View则是电视机和游戏手柄,电视机可以独立工作,他不管输入的是电视信号、影碟机信号还是游戏机信号,他只管显示,而且他决定了我们看到的效果是怎么样的,如果我想要个尺寸更大的或者彩色的显示效果,我只需要买个相应的电视机就行了,手柄也是可以换的,要遥杆还是带震动的。Model则是游戏卡带,他绝定了我玩的是什么游戏,是魂斗罗还是超级玛莉,而且游戏机主机和电视机生产厂家永远也不知道在上面有可能会运行什么样的游戏。卡带中可能会有游戏代码和存储单元,都根据游戏的需要而设计。

===================4/30补充==================

有朋友提到游戏主机提供的卡带插槽的接口,在设计中,有时也由Control提供一组接口,以用于Model或View的实现,这样就形成了依赖。一般来说这样设计也没有太大的问题,只是会提高模块间的耦合度,也会带来一些侵入性。为了更完美,可以不用接口来提供契约,可以用配置信息(或称元数据信息)+反射来提供契约,那么这个类接口就可以退化到只要符合CLS就可以了,也就是普通的类,就像现在的计算机接口广泛采用USB,无论是U盘、打印机、扫描仪或者是加密狗,他们都是普通的USB设备而已。
  提到USB有一个题外话,模块的可插拔性设计甚至是热插拔设计,系统可以在不停止运行的情况下动态的挂载或移除模块,动态挂载模块需要系统能够自动发现新模块并根据自描述的信息进行自动配置,移除可能情况更复杂一点,需要“安全删除硬件”类似的功能。
  在设计广泛重用的框架时会考虑多种情况以达到更大的适应性,一般项目中应用MVC模式可以较为随意。

posted on 2009-04-29 22:40 钧梓昊逑 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/wisdomqq/archive/2009/04/29/1446579.html

相关文章:

学习自定义组件

React入门介绍-ReactDOM.render() 蚂蚁设计-组件 React入门-ReactDOM.render()介绍 node.js和npm的关系

如何焊接电路板

今天主要想给大家分享一下焊接电路板的经验,作为一个电子工程师,焊接电路板是一个基本活,要不你很多东西都要麻烦到别人,这样就不好了,而今天要分享的是如何焊接贴片,在焊接从多的电路板中,我想…

加入新e时代建站网后,我可以做什么

加入原动力建站网后,您便开始了自由而浪漫的原动力建站网生活。您可以:选择自由的时间学习,跟您的上级交流,请教;选择自由的时间工作;自由的发展,整个互联网任您自由发挥;从实践中学…

[BZOJ2502]清理雪道 有上下界网络流(最小流)

2502: 清理雪道 Time Limit: 10 Sec Memory Limit: 128 MBDescription 滑雪场坐落在FJ省西北部的若干座山上。从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降的方向。你的…

学习API网关遇到的名词

VPC浅谈 VPC全称“虚拟私有云”,是一个公共云计算资源的动态配置池。虚拟私有云在概念上类似于虚拟专用网,需要使用加密协议、隧道协议和其他安全程序,在民营企业和云服务提供商之间传输数据。一个虚拟专用网可以被用来在公共网,…

RXJAVA之变换操作

RXJAVA提供了以下变换操作&#xff0c;对Observable的消息进行变换操作&#xff1a; 1.window 定期将来自Observable的数据分拆成一些Observable窗口&#xff0c;然后发射这些窗口&#xff0c;而不是每次发射一项。 Observable<String> observable Observable.just(&quo…

java中xxe漏洞修复方法

java中禁止外部实体引用的设置方法不止一种&#xff0c;这样就导致有些开发者修复的时候采用的错误的方法 之所以写这篇文章是有原因的&#xff01;最早是有朋友在群里发了如下一个pdf&#xff0c; 而当时已经是2019年1月末了&#xff0c;应该不是2018年7月份那个引起较大轰动的…

模式6--ReadWriteLock

来至《java多线程设计模式》 自己提供一个逻辑锁代替JDK的物理锁synchronized 优点&#xff1a;1.对read操作不进行共享互斥&#xff0c;可以进行多个read操作&#xff0c;提高系统性能 2.适合read》write的情况 package Sample;public final class ReadWriteLock {private int…

使用 XSL 样式表无法查看 XML 输入。请更正错误然后单击 刷新按钮,或以后重试。...

使用 XSL 样式表无法查看 XML 输入。请更正错误然后单击 刷新按钮&#xff0c;或以后重试。 无法显示 XML 页。 使用 XSL 样式表无法查看 XML 输入。请更正错误然后单击 刷新按钮&#xff0c;或以后重试。 ----------------------------------------------------------------…

JDK的安装与系统环境变量的配置

一、下载JDK 用户进入到Java SE的下载网页后&#xff0c;根据自己所用的操作系统&#xff08;Windows、Linux&#xff09;和位数&#xff08;32位、64位&#xff09;选择不同的链接进行下载。本例是在Windows系统的32位机器上开发的&#xff0c;所以下载的是jdk-8u161-windows-…

docker redis 多个实例

Docker运维笔记-Docker端口映射 - 恶性佛 - CSDN博客https://blog.csdn.net/qq_29994609/article/details/51730640 利用 Docker 在一台机器上部署多个 Redis 实例 - HeatDeath的博客 - CSDN博客https://blog.csdn.net/HeatDeath/article/details/80364340 Docker命令详解 - iV…

Dojo QuickStart 快速入门教程 (1) Why Dojo

Dojo 是一个用来构建 Web 应用的 JavaScript 工具包&#xff0c;当然是开源的。它的目标是通过提供一组特别构造的 API 和一系列辅助工具&#xff0c;使你能在较短的时间里把想法变为实现&#xff0c;同时改善你的日常 Web 开发体验。它是快速的(lightning fast)、健壮的(light…

css3-transform

转载于:https://www.cnblogs.com/cyany/p/7594143.html

C#操作注册表

using Microsoft.Win32 ;以下从‘读’‘写’‘删除’‘判断’四个事例实现对注册表的简单操作 1.读取指定名称的注册表的值 private string GetRegistData(string name) { string registData; RegistryKey hkml Registry.LocalMachine; RegistryKey software hkml.OpenSubKey…

Red Hat Linux 安装教程

一、下载链接 链接&#xff1a;https://pan.baidu.com/s/1JShQmOrgGG5_uaqPUuaHLg 提取码&#xff1a;ture 二、安装步骤 1、打开虚拟机&#xff0c;单击“创建新的虚拟机”&#xff1b; 2、在出现的“新建虚拟机向导”窗口中&#xff0c;选择默认的“典型&#xff08;推荐&…

Spring中利用applicationContext.xml文件实例化对象和调用方法

Spring中实例化对象和调用方法入门 1.jar包和xml的准备 已上传至百度云盘&#xff0c;链接: https://pan.baidu.com/s/1CY0xQq3GLK06iX7tVLnp3Q  提取码: shjd &#xff1b; 2.在eclipse中创建javaweb项目 1.第一次创建javaWEB项目操作步骤 1&#xff09;eclipse中运行javaWE…

图形文件元数据管理工具exiv2

图形文件元数据管理工具exiv2图形文件通常都包含多种元数据&#xff0c;如Exif、IPTC、XMP。这些信息往往是渗透人员收集的目标。为了便于管理这些信息&#xff0c;Kali Linux内置了专用工具exiv2。该工具支持24种文件格式&#xff0c;包括JPEG、TIFF、PNG、GIF、PSD、TGA、BMP…

什么是LAN(局域网)

一、局域网 局域网&#xff08;Local Area Network&#xff09;&#xff0c;简称LAN&#xff0c;是指在某一区域内由多台计算机互联成的计算机组。“某一区域”指的是同一办公室、同一建筑物、同一公司和同一学校等&#xff0c;一般是方圆几千米以内。局域网可以实现文件管理、…

网络编程-粘包

粘包问题的产生 TCP流式协议 基于数据流的协议 接收方产生粘包问题 1.接收方不清楚数据有多长只接收了数据的一部分 2.接收方多读取了数据 发送方产生的粘包问题 操作系统没有及时发送前一次的数据&#xff0c;导致两次数据粘在一起 粘包问题的根本原因是接收方不清楚数据的长度…

Linq基础知识小记二

书写Linq查询有两种方法,第一种是通过方法语法(也就是扩展方法),第二种是查询表达式语法. 1、方法语法 方法语法就是通过扩展方法和Lambda表达式来创建查询 (1)、链式查询 这种查询方式很多语言都支持,通过一段实例,介绍Linq的链式查询.需求如下:找出字符串数组中含有字母e的字…

Linux查看文件内容的5种方式

目录 1. more指令 —— 分页显示文件内容 2. less指令 —— 可以向前或向后查看文件内容 3. head指令 —— 查看文件开头的内容 4. tail指令 —— 显示文件尾部的内容 5. cat指令 —— 显示文件内容 1. more指令 —— 分页显示文件内容 more指令会以一页一页的形式显示文…

通过病毒名称识病毒

很多时候大家已经用杀毒软件查出了自己的机子中了例如Backdoor. RmtBomb.12 、Trojan.Win32.SendIP.15 等等这些一串英文还带数字的病毒名&#xff0c;这时有些人就懵了&#xff0c;那么长一串的名字&#xff0c;我怎么知道是什么病毒啊&#xff1f; 其实只要我们掌握一些病…

MySQL相关命令

目录 1、MySQL登录命令 2、MySQL查看系统中有哪些数据库 3、查看当前使用的数据库 4、 更换&#xff08;或者使用&#xff09;指定的数据库 5、查看当前数据库中已经存在的表格 6、查看表结构 7、查看MySQL版本信息 8、创建数据库 9、删除数据库 10、选择数据库 11、…

[Linux] 010 权限管理命令 chmod

1. 权限管理命令&#xff1a;chmod 命令名称&#xff1a;chmod命令英文原意&#xff1a;change the permissions mode of a file命令所在路径&#xff1a;/bin/chmod执行权限&#xff1a;所有用户语法&#xff1a; chmod [{ugoa} {-} {rwx}] [文件或目录] [mode421] [文件或目录…

bzoj 1787 紧急集合

题目大意&#xff1a; 一棵树上&#xff0c;两个相邻点之间距离为1&#xff0c;每次询问三个点&#xff0c; 求到这三个点距离和最小的点&#xff0c;以及这个距离和 思路&#xff1a; 几乎是lca裸题 lca&#xff1a;倍增即可 然后求出每两个点之间的lca 画画图可知必有两个lca…

一些权限管理方面的文章

http://www.cnblogs.com/yukaizhao/archive/2007/04/15/user_role_action_permission.html 六种不同需求的权限设计数据库关系图&#xff08;从易到难&#xff09; 金色海洋的自然框架系列 http://www.cnblogs.com/jyk/archive/2009/06/06/1497616.html 吉日嘎啦的 简单操作权…

editplus 3 注册码

editplus 3 注册码注册信息:kariryo5387D-12450-BCZ8B-D6W0B-85TE1

15.linux-LCD层次分析(详解)

如果我们的系统要用GUI&#xff08;图形界面接口&#xff09;&#xff0c;这时LCD设备驱动程序就应该编写成frambuffer接口&#xff0c;而不是像之前那样只编写操作底层的LCD控制器接口。 什么是frambuffer设备&#xff1f; frambuffer设备层是对图像设备的一种抽象&#xff0c…

【牛客网】最长对称子串

给定一个字符串&#xff08;数字或大小写字母&#xff09;, 找出最长的对称的子串&#xff08;如有多个&#xff0c;输出任意一个&#xff09;。例如&#xff1a;输入&#xff1a;“abbaad”输出&#xff1a;“abba”#include <iostream> #include <cstring> #incl…

利用JS中window.showModalDialog()详解

window.showModalDialog()方法用来创建一个显示HTML内容的模态对话框。 window.showModelessDialog()方法用来创建一个显示HTML内容的非模态对话框。 使用方法&#xff1a; vReturnValue window.showModalDialog(sURL [, vArguments] [,sFeatures]) vReturnValue window.show…