一、分层设计的基本概念
在分解复杂的软件系统时,软件设计者用的最多的技术之一就是分层。在计算机体系机构中,可以看到,到处都有分层的例子,最为典型的,就是存储器的层次结构,如图所示:
图1:计算机存储器的层次模型
可以看到,存储器的层次结构是按访问速度、存储容量等参数划分的,不同的层次有不同的职责。CPU内部的寄存器组是访问速度最快的存储设备,用于存储CPU运算过程中的指令和数据;主存中存储的的则是执行中程序(进程)需要的代码和数据。由于CPU访问主存的速度很慢,因此引入了高速缓存处理器(高速缓存),用于缓解CPU访问寄存器和主存的速度差异。同样,计算机网络中的TCP/IP协议栈也把层次性的设计思维体现的淋漓尽致:
图2:TCP/IP协议栈的五层模型
在层次结构中,上层模块依赖于下层模块,下层模块为上层模块提供服务,在代码中体现,就是上层可以调用下层提供的公共方法。比如应用层协议FTP架构在传输层TCP之上、TCP架构在互联网层协议IP之上。
当用分层的观点来考虑系统时,可以将各个子系统想象成“多层蛋糕”的形式,每一次都依托在其下层之上。在这种组织方式下,上层使用了下层定义的各种服务,而下层对上层一无所知。另外,每一层都对自己的上层隐藏其下层的细节。因此,第3层使用第2层提供的服务,第2层使用第1层提供的服务,第3层无需知道第1层的细节(当然,并非所有的分层架构都这么隔绝)。
将系统按照层次分解有很多好处:
①在无需了解其他层次的基础上,可以将某一层作为一个整体来理解
②可以很容易替换某层的实现,只要其前后提供的服务(接口)相同即可
③可以将层次间的依赖性减到最低
④一旦构建好了某一层,就可以用它为很多上层服务提供支持。比如,TCP可以同时被telnet、FTP和HTTP使用
分层式一种重要的技术,但也有缺陷
①层次有时会带来级联修改
②层次提供了一种间接性,因此过多的层次会影响性能
当人们讨论分层时,常常不容易区分layer和tier。这两个词汇经常被用作同义词,但是很多人还是认为tier意味着物理上的分离。客户/服务器系统常常被称为“two-tier system”,其分离是物理上的分离:客户端是一台台式机,而服务器端则运行在在另一个地方的服务器。layer强调无需把不同的层次放在不同的计算机上运行。
二、三个基本层次
层次 | 职责 |
表现层 | 与用户交互的接口 |
领域层(业务层) | 业务逻辑,系统的核心 |
数据源层 | 与数据库、消息系统及其他软件包通讯 |
表现层:处理用户与软件的交互
领域层:也称为业务层,它完成领域相关的工作:包括根据输入数据或已有数据进行计算、对从表现层输入的数据进行验证,以及根据从表现层接受到的命令来确定应该调度哪个数据源逻辑。
数据源层:主要关注与其他系统的交互。比如数据库、消息系统等。
在某些小型系统中,表现层跨过了领域层而直接去和数据源层交互,实践证明这样也可以工作很好,不过这样的系统的业务逻辑都很简单。
三、参考资料
1、企业架构模式 Martin Flower
[附:Android平台架构图、金山卫士产品架构图]