软件架构设计的一个核心问题是能否使用重复的软件架构模式,即能否达到架构级别的 软件重用。
架构风格反映了领域中众多系统所共有的结构和语义特性,并指导如何将各个模块和子系统有效地组织成一个完整的系统。
只要系统是使用常用的、规范的方法来组织,就可使别的设计者很容易地理解系统的架构。
一、软件架构风格分类
架构风格的最关键的四要素内容:
1 | 提供一个词汇表 |
二、数据流风格
批处理序列;管道/过滤器。
这样的架构下,所有的数据按照流的形式在执行过程中前进,不存在结构的反复和重构。
在流动过程中,数据经过序列间的数据处理组件进行处理,然后将处理结果向后传送,最后进行输出。
1. 批处理序列
批处理风格的每一步处理都是独立的,并且每一步是顺序执行的。只有当前一步处理完,后一步处理才能开始。数据传送在步与步之间作为一个整体。(组件为一系列固定顺序的计 算单元,组件间只通过数据传递交互。每个处理步骤是一个独立的程序,每一步必 须在前一步结束后才能开始,数据必须是完整的,以整体的方式传递)
批处理的典型应用:
(1)经典数据处理;
(2)程序开发;
(3)Windows 下的 BAT 程序就是这种应用的典型实例。
2. 管道和过滤器
在管道/过滤器风格的软件架构中,每个构件都有一组输入和输出,构件读输入的数据流,经过内部处理,然后产生输出数据流。这个过程通常通过对输入流的变换及增量计算来 完成,所以在输入被完全消费之前,输出便产生了。
管道/过滤器架构的例子:
(1)以 UNIX shell 编写的程序;
(2)传统的编译器。
优点:
(1)使得软构件具有良好的隐蔽性和高内聚、低耦合的特点;
(2)允许设计者将整个系统的输入/输出行为看成是多个过滤器的行为的简单合成;
(3)支持软件重用
(4)系统维护和增强系统性能简单
(5)允许对一些如吞吐量、死锁等属性的分析;
(6)支持并行执行
缺点
(1)通常导致进程成为批处理的结构
(2)不适合处理交互的应用
(3)因为在数据传输上没有通用的标准,每个过滤器都增加了解析和合成数据的工作, 这样就导致了系统性能下降,并增加了编写过滤器的复杂性。
3.批处理序列风格与管道过滤器风格对比
共同点:把任务分成一系列固定顺序的计算单元(组件)。组件间只通过数据传递交互。
区别:批处理是全部的、高潜伏性的,输入时可随机存取,无合作性、无交互性。而管道过滤器是递增的,数据结果延迟小,输入时处理局部化,有反馈、可交互。批处理强调数据传送在步与步之间作为一个整体,而管理过滤器无此要求。
三、调用/返回风格
主程序/子程序;面向对象风格;层次结构。
利用调用-返回实际上是一种分而治之的策略,其主要思想是将一个复杂的大系统分解为一些子系统,以便降低复杂度,并且增加可修改性。
1. 主程序/子程序
主程序/子程序风格是结构化开发时期的经典架构风格。这种风格一般采用单线程控制,把问题划分为若干处理步骤,构件即为主程序和子程序。
2. 面向对象风格
这种风格建立在数据抽象和面向对象的基础上,数据的表示方法和它们的相应操作封装在一个抽象数据类型或对象中。这种风格的构件是对象,或者说是抽象数据类型的实例。
这种风格的两个重要特征为:
(1)对象负责维护其表示的完整性;
(2)对象的表示对其他对象而言是隐蔽的。
优点
(1)因为对象对其他对象隐藏它的表示,所以可以改变一个对象的表示,而不影响其他的对象;
(2)设计者可将一些数据存取操作的问题分解成一些交互的代理程序的集合。
缺点
(1)为了使一个对象和另一个对象通过过程调用等进行交互,必须知道对象的标识。只要一个对象的标识改变了,就必须修改所有其他明确调用它的对象;
(2)必须修改所有显式调用它的其他对象,并消除由此带来的一些副作用。例如,如果 A 使用了对象 B,C 也使用了对象 B,那么,C 对 B 的使用所造成的对 A 的影响可能是料想不到的。
3. 层次结构风格
层次系统组织成一个层次结构,每一层为上层服务,并作为下层客户。在一些层次系统中,除了一些精心挑选的输出函数外,内部的层只对相邻的层可见。
这种风格支持基于可增加抽象层的设计。允许将一个复杂问题分解成一个增量步 骤序列的实现。由于每一层最多只影响两层,同时只要给相邻层提供相同的接口,允许每层 用不同的方法实现,同样为软件重用提供了强大的支持。
层次系统最广泛的应用是分层通信协议。
优点
(1)支持基于抽象程度递增的系统设计,使设计者可以把一个复杂系统按递增的步骤进行分解;
(2)支持功能增强,因为每一层至多和相邻的上下层交互,因此功能的改变最多影响相邻的上下层;
(3)支持重用。只要提供的服务接口定义不变,同一层的不同实现可以交换使用。这样,就可以定义一组标准的接口,而允许各种不同的实现方法。
缺点
(1)并不是每个系统都可以很容易地划分为分层的模式,甚至即使一个系统的逻辑结构是层次化的,出于对系统性能的考虑,系统设计师不得不把一些低级或高级的功能综合起来;
(2)很难找到一个合适的、正确的层次抽象方法。
四、独立构件风格
进程通信;事件系统。
独立构件风格主要强调系统中的每个构件都是相对独立的个体,它们之间不直接通信,以降低耦合度,提升灵活性。
1. 进程通信架构风格
构件是独立的过程,连接件是消息传递。这 种风格的特点是构件通常是命名过程,消息传递的方式可以是点到点、异步和同步方式及远 过程调用等。
2. 事件系统风格
基于事件的隐式调用风格的思想是构件不直接调用一个过程,而是触 发或广播一个或多个事件。系统中的其他构件中的过程在一个或多个事件中注册,当一个事 件被触发,系统自动调用在这个事件中注册的所有过程。
基于事件的隐式调用风格的主要特点是事件的触发者并不知道哪些构件会被这些事件影响。
优点
(1)为软件重用提供了强大的支持。当需要将一个构件加入现存系统中时,只需将它注册到系统的事件中。
(2)为改进系统带来了方便。当用一个构件代替另一个构件时,不会影响到其他构件的接口。
缺点
(1)构件放弃了对系统计算的控制。一个构件触发一个事件时,不能确定其他构件是否会响应它。而且即使它知道事件注册了哪些构件的过程,它也不能保证这些过程被调用的顺序。
(2)数据交换的问题。有时数据可被一个事件传递,但另一些情况下,基于事件的系统必须依靠一个共享的仓库进行交互。在这些情况下,全局性能和资源管理便成了问题。
(3)既然过程的语义必须依赖于被触发事件的上下文约束,关于正确性的推理存在问题。
五、虚拟机风格
解释器;基于规则的系统。
虚拟机风格的基本思想是人为构建一个运行环境,在这个环境之上,可以解析与运行自定义的一些语言,这样来增加架构的灵活性。
1.解释器
一个解释器通常包括完成解释工作的解释引擎,一个包含将被解释的代码的存储区,一 个记录解释引擎当前工作状态的数据结构,以及一个记录源代码被解释执行进度的数据结构。
解释器通常被用来建立一种虚拟机以弥合程序语义与硬件语义之间的差异。其缺点是执行效率较低。
2. 规则为中心
基于规则的系统包括规则集、规则解释器、规则/数据选择器及工作内存。
六、仓库风格
数据库系统;超文本系统;黑板系统。
1.数据库系统
数据库架构是库风格最常见的形式。构件主要有两大类,一个是中央共享数据源,保存当前系统的数据状态;另一个是多个独立处理元素,处理元素对数据元素进行操作。
2.超文本系统
超文本系统的典型代表,就是早期的静态网页。
3.黑板系统
黑板系统是一种问题求解模型,是组织推理的步骤、控制状态数据和问题求解之领域知识的概念框架,它将问题的解空间组织成一个或多个应用相关的分级结构。分级结构的每一层信息由一个唯一的词汇来描述,它代表了问题的部分解。
黑板系统主要由三部分组成:
(1)知识源。知识源中包含独立的、与应用程序相关的知识,知识源之间不直接进行 通信,它们之间的交互只通过黑板来完成。
(2)黑板数据结构。黑板数据是按照与应用程序相关的层次来组织的解决问题的数据, 知识源通过不断地改变黑板数据来解决问题。
(3)控制。控制完全由黑板的状态驱动,黑板状态的改变决定使用的特定知识。