刚毕业的时候,参与了一个上位机的系统开发。上位机所使用的是.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. [LeetCode] Arithmetic Slices 算数切片

    A sequence of number is called arithmetic if it consists of at least three elements and if the diffe ...

  2. [LeetCode] H-Index II 求H指数之二

    Follow up for H-Index: What if the citations array is sorted in ascending order? Could you optimize ...

  3. 学券制(教育券、school voucher)

    美国「学券制」是怎样的一种制度?它为什么是共和党的执政政策?它在美国及其它地区有实施吗?效果如何?能否在保证公平的同时,通过市场提高教育质量? 作者:冉筱韬链接:https://www.zhihu.c ...

  4. CentOS安装Maven

    现有的一个项目使用了Maven来管理,源代码放到了Subversion中.虽然Maven管理项目很方便,但是部署起来还是很麻烦的.先要在本地生成项目jar包,上传到服务器,然后再重启服务.如果在服务器 ...

  5. SSM集成(一):Mybatis3测试

    Spring4+Mybatis3+SpringMVC(基于注解)整合步聚: 一)Mybatis3测试; 二)Mybatis3+Spring4整合; 三)Mybatis3+Spring4+SpringM ...

  6. 《UNIX环境高级编程》笔记——3.文件IO

    一.引言 说明几个I/O函数:open.read.write.lseek和close,这些函数都是不带缓冲(不带缓冲,只调用内核的一个系统调用),这些函数不输入ISO C,是POSIX的一部分: 多进 ...

  7. 页置换算法FIFO、LRU、OPT

    页置换算法FIFO.LRU.OPT 为什么需要页置换 在地址映射过程中,若在页面中发现所要访问的页面不再内存中,则产生缺页中断.当发生缺页中断时操作系统必须在内存选择一个页面将其移出内存,以便为即将调 ...

  8. JavaScript事件详解-Zepto的事件实现(二)【新增fastclick阅读笔记】

    正文 作者打字速度实在不咋地,源码部分就用图片代替了,都是截图,本文讲解的Zepto版本是1.2.0,在该版本中的event模块与1.1.6基本一致.此文的fastclick理解上在看过博客园各个大神 ...

  9. jQuery实现二级菜单

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  10. 通过维基API实现维基百科查询功能

    通过英文维基的免费API,可以实现对维基百科的搜索查询或者标题全文查询等,尝试了一下通过title实现全文查询,返回的结果是wikitext格式,暂时不知道该如何应用,所以仅实现了查询功能,可以返回最 ...