分层体系架构模式模式也称为多层体系架构模式。它可以用来构造可以分解为子任务组的程序,每个子任务都处于一个特定的抽象级别。每个层都为下一个提供更高层次服务。在分层架构中的组件被划分成几个层,每个层代表应用的一个功能.分层架构本身没有规定要分成多少层,大部分的应用会分成表现层,业务层,持久层和数据库层.小的应用有时候会将业务层和持久层合在一起,更大规模的应用可能会划分更多的层,比如调用外部服务的层.分层架构的一个特性就是关注分离(separation of concerns).在层中的组件只负责本层的逻辑.组件的划分很容易让它们实现自己的角色和职责,也比较容易地开发,测试管理和维护.
一般信息系统中最常见的是如下所列的4层。
- 表示层(也称为UI层):用户界面,负责视觉与用户互动
- 应用层(也称为服务层)
- 业务逻辑层(也称为领域层):实现业务逻辑
- 数据访问层(也称为持久化层):提供数据,SQL语句就放在此层
使用场景:
- 一般的桌面应用程序
- 电子商务Web应用程序
关键概念
注意每一层都是封闭的.这意味着Request必须经过每一层才能到达最底下一层.
![](http://colobu.com/2015/04/08/software-architecture-patterns/Closed-layers-and-request-access.png)
为什么不允许展示层直接访问数据库层呢,这样不是更快吗?这就是分层架构的另一个特征:层隔离(layers of isolation).
层隔离的概念意味着你对任何一层的改变都不会影响其它层,这很好理解.层隔离也意味着一个层的组件并不会了解其它层的实现,或者知道很少. 比如业务层不需知道你持久层是由hibernate还是mybatis实现的.
分层架构也很容易增加新的层. 比如你想将一些通用的服务重构成一个服务层,比如通用图片处理,远程账户审计等,可以在业务层下增加一个服务层.它不会对展示层造成影响,也不会改变持久层的代码.
上面的这个例子带来一个问题,因为每一层是封闭的,业务层不得不通过服务层访问持久层. 所以有时候可以创建一个开放的层.这意味着上一层可以绕过这一层直接访问下一层。
![](http://colobu.com/2015/04/08/software-architecture-patterns/Open-layers-and-request-flow.png)
模式分析
- 总体灵活性: 低
- 发布易用性:低
- 可测试性: 高
- 性能:低
- 规模扩展性: 低
- 开发容易度: 高
优点
- 结构简单,容易理解和开发
- 不同技能的程序员可以分工,负责不同的层,天然适合大多数软件公司的组织架构
- 每一层都可以独立测试,其他层的接口通过模拟解决
- 一个较低的层可以被不同的层所使用。层使标准化更容易,因为我们可以清楚地定义级别。可以在层内进行更改,而不会影响其他层
- 一旦环境变化,需要代码调整或增加功能时,通常比较麻烦和费时
- 部署比较麻烦,即使只修改一个小地方,往往需要整个软件重新部署,不容易做持续发布
- 软件升级时,可能需要整个服务暂停
- 扩展性差.用户请求大量增加时,必须依次扩展每一层,由于每一层内部是耦合的,扩展会很困难
- 不是普通适用的。在某些情况下,某些层可能会被跳过