刚毕业的时候,参与了一个上位机的系统开发。上位机所使用的是.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. AndroidStudio中make Project、clean Project、Rebuild Project的区别

    1.Make Project:编译Project下所有Module,一般是自上次编译后Project下有更新的文件,不生成apk. 2.Make Selected Modules:编译指定的Modul ...

  2. [LeetCode] Count and Say 计数和读法

    The count-and-say sequence is the sequence of integers beginning as follows:1, 11, 21, 1211, 111221, ...

  3. [个人翻译]Redis 集群教程(上)

    官方原文地址:https://redis.io/topics/cluster-tutorial  水平有限,如果您在阅读过程中发现有翻译的不合理的地方,请留言,我会尽快修改,谢谢.        这是 ...

  4. 一个简单oop的changeTab

    好多地方都会用到这样一个效果“点击tab切换内容页”,根据自己的想法实现了一下,写了个简单的插件.以前写代码都是标准的函数式编程,现在觉得面向对象编程看起来比较爽,并且更容易维护,于是就用oop的思想 ...

  5. CentOS利用nginx和php-fpm搭建owncloud私有云

    1.安装owncloud CentOS下有一键安装命令 yum install owncloud 默认配置目录: /etc/owncloud 默认内容目录: /usr/share/owncloud 2 ...

  6. JavaEE学习文章汇总-ssm框架

    Spring-SpringMVC-Mybatis 1:Maven创建webapp项目 Maven 下的spring框架(一创建项目) 2:mybatis3 入门教程 mybatis实战教程(mybat ...

  7. iOS中使用正则

    一.什么是正则表达式 正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式.正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分.它可以迅速地用极简单的方式 ...

  8. BZOJ1192 [HNOI2006]鬼谷子的钱袋

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  9. C#设计模式

    自从上次记录完“重构之道”以后,查询设计模式挺麻烦的.就打算把原先写的设计模式系列合并一下. 设计原则 使用设计模式的根本原因就是适应需求变化,提高代码的复用率,使程序更具有扩展性和可维护性. SOL ...

  10. struts-validate.xml配置详解demo

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE validators PUBLIC &quo ...