5.1 软件体系结构风格概述
多年来,人们在开发某些类型软件过程中积累起来的组织规则和结构,形成了软件体系结构风格。
软件体系结构风格,是总结人们设计经验而形成结构较为巩固、组织较为统一的形式,是一种适合于多种场合的相似结构的抽象。
软件体系结构设计的一个核心问题是,能否使用重复的体系结构模式,即能否达到体系结构级的软件重用。
5.2 基本风格解析
5.2.1 管道-过滤器
管道-过滤器模式下,每个功能模块都有一组输入和输出。
功能模块从输入集合读入数据流,并在输出集合产生输出数据流,即功能模块对输入数据流进行增量计算得到输出数据流。
管道-过滤器模式下,功能模块称作过滤器(Filter)。
功能模块间的连接可以看作输入、输出数据流之间的通路,所以称作管道(Pipe)。
如果要建立一个必须处理或转换输入数据流的系统,用单个组件实现会过于臃肿,需求不容易变动,故选用管道过滤器风格。
管道-过滤器体系结构模式,把系统任务分成几个序贯的处理步骤。这些步骤,通过系统的数据流连接,一个步骤的输出,是下一个步骤的输入。每个处理步骤由一个过滤器组件实现。过滤器消耗和转发增长的数据,在产生任何输出之前,消耗所有输入,以达到低延迟并能够真正地并行处理。系统的输入,由诸如文本文件等数据源提供。输出流入数据汇点,如文件、终端。数据源、过滤器和数据汇点由管道顺序连接起来。实现相连处理步骤间的数据流动。通过管道联合的过滤器序列叫做处理流水线。
过滤器必须是独立的实体,不了解信息流从哪个过滤器流出,也不需要知道信息将流入哪个过滤器。可以指定输入的格式,可以确保输出的结果,但是可能不知道在管道之后将会是什么样子。过滤器之间,也不共享状态。
5.2.2 数据抽象和面向对象风格
必须修改所有显式调用它的其他对象,并消除由此带来的一些副作用。例如,如果A使用了对象B,C也使用了对象B,那么C对B的使用所造成的对A的影响,可能是预想不到的。
在这种体系结构中,数据表示和相关原语操作都被封装在抽象数据类型中。在这种风格中,对象是构件,也成为抽象数据类型的实例。对象与对象之间,通过函数调用和过程调用来进行交互。
5.2.3 基于事件的隐式调用风格
系统中的其它构件中的过程,在一个或多个事件中注册,当一个事件被触发,系统自动调用在这个事件中注册的所有过程,这样,一个事件的触发,就导致了另一模块中的过程的调用。
5.2.4 分层系统风格
其中,每一层软件,建立在低一层的软件层上。 位于同一层的软件系统或子系统,具有同等的通用性,在下一层的软件比在上一层的软件通用性更强。一个层次可视为同等通用档次的一组(子)系统