关于体系结构模式
软件系统的开发过程涉及到三种模式:
- 体系结构模式
- 设计模式
- 惯用法
体系结构模式关于软件系统的整体结构. 而设计模式是比体系结构模式规模小的中等规模的模式, 它主要关注 API 的协作. 模型-视图-控制器(MVC)模式是最著名的体系结构模式.
层
层(Layer)是一种体系结构模式, 它将系统水平分割为多个抽象的层次. TCP/IP 网络是层模式的最著名例子.
层通信
通信可以分为两种模式: 推模式和拉模式. 下面我们以一个5层结构的系统分析层通信的主要模式.
1. 层直接调用(API)的拉模式
read read read read Layer 1 ------> Layer 2 ------> Layer 3 ------> Layer 4 ------> Layer 5
在这种通信模式中, 层直接调用相邻层的 API 完成通信. 活动从 Layer 1 开始, 它调用 Layer 2 的 read 方法获取数据, Layer 2 再调用 Layer 3 的 read 方法, 如此. 在代码中, 这种模式的最重要表现是某一层包含了另一层的一个引用.
2. 层直接调用(API)的推模式
write write write write Layer 1 <------ Layer 2 <------ Layer 3 <------ Layer 4 <------ Layer 5
这种通信模式和上一种很相似. 但活动从 Layer 5 开始, 它将数据压入 Layer 4, 并等待 Layer 4 处理完该数据再返回.
3. 层是一个独立的处理机(stand-alone)
___ Layer 1 ===[___]=== Layer 2 ...
在这种通信模式中, 层作为一个独立运行的进程或者线程. 层通信通过一个管道(通道), 层从管道中读取数据, 将数据定义管道. 管道中一般有缓冲区. 层与层之间是完全分离的, 不存在相互调用的问题. 管道既可以通过 API 来实现(在线程中), 也可以使用操作系统的管道, Socket 通信等方式.
在上面的三种层通信模式中, 前两种通过 API 调用来通信, 所以导致层之间耦合度太大, 不利于测试. 即使使用编程语言的接口特性(如 Java 中的 interface)也无法解决这些问题. 而且, 一个层不再被调用时, 它就不会执行.
第三种通信模式是最典型, 一个例子是 TCP/IP 网络. 每一层作为一个独立的处理机, 就可以独立编写和测试每一个层, 而且层的运行不再受其它层的影响, 只受到管道的影响.
参考文献
面向模式的软件体系结构-卷1:模式系统, Frank Buschmann 等著, 机械工业出版社.