刚毕业的时候,参与了一个上位机的系统开发。上位机所使用的是.net Windows Form技术。

当时,和一个北理的姑娘在一个项目组里。因为她来公司时间比较长,而且经验比较丰富,所以,上位机的架构由她来做。

在项目开始,她设计了整个项目的脚手架。这个脚手架大概是这样设计的:

1. 采用“三层架构”搭建整个系统

2. 该“三层架构”分为:UI层,业务逻辑层,实体层

  • UI层包含了所有的Windows窗口、控件
  • 业务逻辑层包含了所有的业务逻辑、数据库访问等
  • 实体层包含了所有的业务实体,其实类似与Java Bean

3. 每一个业务模块都对应的有一个.net动态链接库项目,每一个业务模块按照上述第二点的“三层架构”进行分层

这个项目终究是“上线”了。后来想来,这个项目架构存在一些问题点。

1. 因为模块的业务量很小,但是模块很多,每一个模块对应一个DLL项目,而模块之前存在不同程度的依赖,例如:实体与实体之间的依赖,所以整个模块的依赖关系非常混乱。

2. 对“三层架构”的理解不到位。按理应当先分成主要的三层,UI层、业务逻辑层、数据访问层,数据访问层是比较稳定的,产生了非常多的、混乱的代码

3. UI层没有组件化,很多Form都是通过拖拉拽.net的控件拼凑而来,造成了很多的UI控件重复,无法复用。。

4. UI层的代码与业务逻辑代码紧紧联系在一起,一个复杂的Form文件甚至超过了2000行的代码

以这个我亲身经历的案例作为引子,来谈一谈我对三层架构、以及MVC的理解。

三层架构

现在可能听到“三层架构”的机会少了。在我毕业那会,三层架构是非常流行的。三层架构主要分为:界面层、业务逻辑层、数据访问层。这种分层架构是一种基本的模型,我们很多时候会分出来更多的层。例如:实体层、服务层。这里,我们来分别谈谈每一层的职责。

界面层:界面层就是我们经常说的UI,可以是Form、可以是Control、可以是HTML/CSS/JS。这一层主要是用来提供给客户的界面接口的。

业务逻辑层:业务逻辑层包含了所有对系统业务功能的操作。例如:生成一个订单、提交订单到生产部门等等。

数据访问层:对数据库的访问。

相信大家都很了解这几个层的职责,但它们之间是怎么交互的呢?

1. UI层与业务逻辑层的交互往往都是以事件驱动来调用业务逻辑层,因为业务逻辑层返回给UI层的往往是一些业务实体,所以,UI层同时依赖与业务实体

2. 业务逻辑层依赖于数据访问层。业务逻辑层会组装各类数据访问操作,从而给UI层提供服务

3. 数据访问层直接操作数据库,执行各种SQL操作。

这三层都会依赖于业务实体,所以,往往我们都会在项目里添加实体这一层。

接下来,我们再看看MVC

MVC

MVC大家都很熟悉。分别是Model层、View层、Controller层。

1. Model层一般会分为Service层、DAO层、Entity层

2. View层主要为视图,就是用来提供给用户操作界面的接口

3. Controller层是与三层架构的一个重要区别,它像夹心饼干中间的那一层。Controller层把Model和View层连接到一起。

它们之间的交互关系如下:

1. View调用Controller中的接口,进行数据操作,Controller执行完后更新View。

2. Controller依赖与于Model层,接受到用户的操作后,Controller根据客户的不同请求执行不同的服务。

3. Model层,Model层包含了主要业务逻辑、数据存取等操作。之前的Structs,View层会依赖Model中的实体,直接将实体按照固定的模式展现到视图。

最后,我们回过头来看看三层架构与MVC。

在网上看别人的帖子,很多人说三层架构与MVC没有任何关系。我觉得这个说法有点不太妥当。其实,它们的本质都是分层。只是对层次的划分有一些区别。

1. 因为三层架构中没有Controller层,所以UI层是比较胖的。往往在UI层中包含了大量的业务逻辑代码

2. 三层架构中业务逻辑层和事情数据访问层其实就是MVC中的Model层。对应Service和DAO

可以说,MVC是三层架构的升级版,现在的很多架构其实就是分出来更多的层,分层的目的也比较明确,就是要解耦和。每一层单一职责,某一层做一件事情。其实,这些思想都是相同的,如果我们再细分到面向对象设计。我们也提倡SRP,其实与我们的架构要解决的问题是类似的。

另外,有不少人认为三层架构是一种架构、而MVC是一种设计模式。我觉得这是在咬文嚼字了。那我叫做“三层模型”好吗?他们就是一类东西,都是在分层,都在解耦。

这样一想,我觉得清晰多了。

关于三层架构与MVC的一些理解的更多相关文章

  1. 三层架构 与 MVC那点事儿

    以下为转载内容: 地址 MVC与三层架构的异同点 首先先解释一下MVC. V即View.是视图的意思. C即Controler.是控制器的意思. M即Model,是模型的意思. 这三个里.最不容易理解 ...

  2. 三层架构与MVC的区别

    我们平时总是将混为一谈,殊不知它俩并不是一个概念.下面我来为大家揭晓我所知道的一些真相. 首先,它俩根本不是一个概念. 三层架构是一个分层式的软件体系架构设计,它可适用于任何一个项目. MVC是一个设 ...

  3. 三层架构和MVC

    注:本文章内所有内容都来自互联网,本人主要是起了一个收集的作用 http://www.cnblogs.com/zhhh/archive/2011/06/10/2077519.html 又看到有人在问三 ...

  4. Web项目的三层架构和MVC架构异同

    http://www.cnblogs.com/zhhh/archive/2011/06/10/2077519.html 又看到有人在问三层架构和MVC的关系,感觉这种问题有点教条化了.因为它们都在逻辑 ...

  5. [1] [转]软件架构之三层架构和MVC的关系

    注:本文章内所有内容都来自互联网,本人主要是起了一个收集的作用 又看到有人在问三层架构和MVC的关系,感觉这种问题有点教条化了.因为它们都在逻辑上将应用程序划为三块,凑了一个数字3,就有人非要把它们联 ...

  6. Django——WEB三层架构与MVC

    而我发此文的目的有二:一者,让初学者能够听到一家之言,是为解惑:二者,更希望抛砖引玉,得到专家的批判. 许多学生经常问我,MVC到底和WEB三层架构有啥关系? 开始时,我也只能给他们一些模糊的回答.时 ...

  7. JavaEE三层架构与MVC

    JavaEE三层架构与MVC 摘要与总结 等下总结下 MVC模式 Model1 ​ 说到设计模式,不得不提一下之前的的Model1.据说早期对于java企业项目的开发,用的是Jsp+JavaBean的 ...

  8. 三层架构与MVC之间的区别

    文章转发自:http://www.admin10000.com/document/535.html 我们平时总是将三层架构与MVC混为一谈,殊不知它俩并不是一个概念.下面我来为大家揭晓我所知道的一些真 ...

  9. 三层架构与MVC & 设计模式的较量

    刚刚学习了三层架构,并且正在实际应用中,但随着学习的深入,又了解到了一个叫MVC的东西,(早在设计模式中就听到过MVC,仅仅是简单查了一下什么意思.)如今正好把这三个东西放在一起聊聊. 三层 是一个分 ...

随机推荐

  1. codevs 1164 统计数字

    时间限制: 1 s  空间限制: 128000 KB  题目等级 : 白银 Silver 题目描述 Description [问题描述]某次科研调查时得到了n个自然数,每个数均不超过150000000 ...

  2. Openjudge 1.13-23:区间内的真素数(每日一水)

    总时间限制:  1000ms 内存限制:  65536kB 描述 找出正整数 M 和 N 之间(N 不小于 M)的所有真素数.真素数的定义:如果一个正整数 P 为素数,且其反序也为素数,那么 P 就为 ...

  3. 用libcurl 登录网站

    libcurl 可以发送和接收HTTP消息,因此可以发送用户名.密码和验证码来登录网站,网上有不少这方面的内容,但不甚完整,我摸索了两天,将其中要点记录下来. 基本步骤 正常访问登录页面,访问时,设置 ...

  4. Web App 压力测试

    建议您可以在本地压测来进行评估 具体的压测方法请参考下面的链接:https://www.visualstudio.com/zh-cn/docs/test/performance-testing/run ...

  5. OC与JavaScript的交互

    stringByEvaluatingJavaScriptFromString的用法,它的功能非常的强大,用起来非常简单,通过它我们可以很方便的操作uiwebview中的页面元素. UIWebView是 ...

  6. jquery实现input输入框实时输入触发事件代码(点击历史记录也会触发)

    $("#email").bind('input propertychange', function() { if(/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0 ...

  7. 【原创】自己动手写工具----签到器[Beta 2.0]

    一.前面的话 上一篇中基本实现了简单的签到任务,但是不够灵活.在上一篇自己动手写工具----签到器的结尾中,我设想了几个新增功能来提高工具的灵活程度,下面把新增功能点列出来看看: (1)新增其他的进程 ...

  8. AnjularJS系列2 —— 表单控件功能相关指令

    第二篇,表单控件功能相关指令. ng-checked控制radio和checkbox的选中状态 ng-selected控制下拉框的选中状态 ng-disabled控制失效状态 ng-multiple控 ...

  9. spring与hessian整合例

    spring与hessian的简单应用实现例: 开发环境:window7 64,jdk8,tomcat8,spring4.2.5,hessian4.0 开发语言:java hessianServer端 ...

  10. Day12-mysql&&redis

    1. 数据库介绍 什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据.我们也可以将数 ...