第三章软件体系结构风格本章内容3.1软件体系结构风格概述3.2常用的软件体系结构风格3.3管道/过滤器体系结构风格3.4面向对象体系结构风格3.5事件驱动体系结构风格3.6分层体系结构风格3.7C2体系结构风格3.8数据共享体系结构风格本章内容3.9解释器体系结构风格3.10反馈控制环体系结构风格3.11客户机/服务器体系结构风格3.12浏览器/服务器体系结构风格3.13公共对象请求代理体系结构风格3.14正交体系结构风格3.15基于层次消息总线的体系结构风格3.16MVC体系结构风格3.17异构体系结构集成3.1软件体系结构风格概述软件体系结构表示系统的框架结构,用于从较高的层次上来描述各部分之间的关系和接口,主要包括:构件、构件性质和构件之间的关系软件框架设计的核心问题是:能否复用已经成型的体系结构方案不同系统的设计方案存在着许多共性问题,把这些共性部分抽取出来,就形成了具有代表性的和可广泛接受的体系结构风格3.1软件体系结构风格概述软件体系结构风格也称为软件体系结构惯用模式,是指不同系统所拥有的共同组织结构和语义特征软件体系结构是构件和连接件之间相互作用的形式化说明,用以指导将多个模块组织成一个完整的应用程序软件体系结构风格定义了用于系统描述的术语表和一组用于指导系统构建的规则3.1软件体系结构风格概述软件体系结构风格包括构件、连接件和一组将它们结合在一起的约束限制,诸如:拓扑限制和语义限制等对于高质量的软件产品而言,首先要为其选择合适的体系结构风格,这样就能够更好地重用已有的设计方案和实现方案利用软件体系结构风格中的不变部分,可以使系统大粒度地重用已有的实现代码3.2常用的软件体系结构风格数据流风格:批处理和管道/过滤器调用/返回风格:主程序/子程序、层次结构和客户机/服务器面向对象风格独立部件风格:进程通讯和事件驱动虚拟机风格:解释器和基于规则的系统数据共享风格:数据库系统和黑板系统3.3管道/过滤器体系结构风格管道/过滤器结构主要包括过滤器和管道两种元素构件被称为过滤器,负责对数据进行加工处理每个过滤器都有一组输入端口和输出端口,从输入端口接收数据,经过内部加工处理之后,传送到输出端口上数据通过相邻过滤器之间的连接件进行传输,连接件可以看作输入数据流和输出数据流之间的通路,这就是所谓的管道3.3管道/过滤器体系结构风格管道/过滤器结构将数据流处理分为几个顺序的步骤来进行,一个步骤的输出是下一个步骤的输入,每个处理步骤由一个过滤器来实现每个过滤器独立完成自己的任务,不同过滤器之间不需要进行交互在管道/过滤器结构中,数据输出的最终结果与各个过滤器执行的顺序无关3.3管道/过滤器体系结构风格每个过滤器都是一个独立的个体元素,各个过滤器的状态互不相关,非邻近过滤器不共享任何信息运行结果的正确性与各个过滤器运行的先后顺序无关过滤器过滤器过滤器过滤器过滤器过滤器管道输入数据输出数据3.3管道/过滤器体系结构风格管道/过滤器风格具有以下优点:简单性,允许将系统的输入和输出看作是各个过滤器行为的简单组合,独立的过滤器能够减小构件之间的耦合程度系统具有可扩展性和可进化性,各个过滤器是相互独立的,因此可以很容易地将新过滤器添加到现有的系统之中,以扩展系统的业务处理能力,原有过滤器可以很方便地被改进的过滤器所替代3.3管道/过滤器体系结构风格支持复用,如果一个过滤器的输出数据格式与另一个过滤器的输入数据格式是一致的,就可以将这两个过滤器连接在一起系统并发性,各个过滤器能够独立运行,因此,不同子任务可以并行执行,提高了系统运行效率便于系统分析,由于系统是独立构件的组合,具有清晰的拓扑结构,因而有利于对数据吞吐量、死锁和计算准确性进行分析3.3管道/过滤器体系结构风格管道/过滤器风格也存在着一定的问题:系统处理过程是批处理方式,过滤器具有很强的独立性,对于每一个过滤器,设计者必须考虑从输入到输出的转换过程,这种方式会造成过滤器对输入数据的批量转换处理不适合用来设计交互式应用系统由于没有通用的数据传输标准,因此每个过滤器都需要解析输入数据和合成数据,添加和去除标记需要花费一定的时间,从而导致了系统性能下降,增加了过滤器设计的复杂性3.3管道/过滤器体系结构风格难以进行错误处理,管道/过滤器结构的固有特性,决定了很难制定错误处理的一般性策略传统的编译器是管道/过滤器体系结构风格的一个实例中间代码生成中间代码优化目标代码生成语义分析语法分析词法分析源程序目标程序3.4面向对象体系结构风格在这种体系结构中,数据表示和相关原语操作都被封装在抽象数据类型中对象是构件,也称为抽象数据类型的实例对象是一种被称为管理器的构件,负责保持资源的完整性在对象和对象之间,通过函数调用和过程调用来进行交互3.4面向对象体系结构风格面向对象风格具有以下优点:一个对象对外界隐藏了自己的详细信息,改变一个对象的表示,不会影响系统的其它部分继承和封装方法为对象复用提供了技术支持对象对象对象对象对象管理器过程调用函数调用3.4面向对象体系结构风格对象将数据和操作封装在一起,提高了系统内聚性,减小了模块之间的耦合程度,使系统更容易分解为既相互作用又相互独立的对象集合面向对象体系结构风格也存在着一些问题:如果一个对象要调用另一个对象,则必须知道它的标识和名称会产生连锁反应,如果一个对象的标识发生改变,那么必须修改所有显式调用它的其它对象,并消除由此引发的副作用3.5事件驱动体系结构风格事件驱动就是在当前系统的基础之上,根据事件声明和发展状况来驱动整个应用程序运行系统对外部的行为表现可以通过它对事件的处理来实现构件不再直接调用过程,而是声明事件系统其它构件的过程可以在这些事件中进行注册,当触发一个事件时,系统会自动调用在这个事件中注册的所有过程3.5事件驱动体系结构风格事件驱动系统的构件提供了一个过程集合和一组事件过程可以使用显示方法进行调用,同时,也可以由构件在系统事件中注册在消息机制的控制下,系统作为一个整体与外界环境进行交互事件驱动体系结构风格具有以下优点:3.5事件驱动体系结构风格事件声明者不需要知道哪些构件会响应事件,因此,不能确定构件处理的先后顺序,甚至不能确定事件会引发哪些过程调用提高了软件复用能力,只要在系统事件中注册构件的过程,就可以将该构件集成到系统中便于系统升级,只要构件名和事件中所注册的过程名保持不变,原有构件就可以被新构件所替代事件驱动体系结构风格也存在着一些问题:3.5事件驱动体系结构风格构件放弃了对计算的控制权,完全由系统来决定,当构件触发一个事件时,它不知道其余构件是如何对其进行处理的存在数据传输问题,数据可以通过事件来进行传输,但是,在大多数情况下,系统本身需要维护一定的存储空间,这将对系统的逻辑功能和资源管理有一定影响3.6分层体系结构风格在分层风格中,系统将划分为一个层次结构每一层都具有高度的内聚性,包含抽象程度一致的各种构件,支持信息隐藏分层有助于将复杂系统划分为独立的模块,从而简化程序的设计和实现通过分解,可以将系统功能划分为一些具有明确定义的层,较高层是面向特定应用问题的,较低层更具有一般性3.6分层体系结构风格每层都为上层提供服务,同时又利用了下层的逻辑功能每层只对相邻层可见,层次之间的连接件是协议和过程调用,用以实现各层之间的交互上层通过下层提供的接口来使用下层的功能,而下层却不能使用上层的功能良好的层次结构将有助于对逻辑功能实施灵活的增加、删除和修改3.6分层体系结构风格利用接口,可以将下层实现细节隐藏起来,从而有助于抽象设计,形成松散耦合的结构模型协议应用层功能层核心层各种构件过程调用3.6分层体系结构风格分层体系结构风格具有以下优点:设计者可以将系统分解为一个增量的步骤序列,从而完成复杂的业务逻辑每一层至多和相邻的上下两层进行交互,每一层的功能变化最多只影响相邻两层,便于实现系统功能的扩展只要给相邻层提供相同的接口,就可以使用不同的方法来实现每一层,支持软件资源的复用分层体系结构风格也存在着一些问题:3.6分层体系结构风格并非所有系统都能够按照层次来进行划分,即使一个系统的逻辑结构是层次化的,但是出于对系统性能的考虑,需要把不同抽象程度的功能合并到一层,破坏了逻辑独立性很难找到一种合适和正确的层次划分方法,其应用范围受到限制在传输数据时,需要经过多个层次,导致了系统性能下降多层结构难以调试,往往需要通过一系列的跨层次调用来实现3.6分层体系结构风格分层体系结构应用实例:开放系统互联国际标准组织(OpenSystemsInterconnection-InternationalStandardsOrganization,OSI-ISO)所指定的分层通信协议、计算机网络协议TCP/IP、操作系统和数据库系统引文管理系统是采用分层体系结构来进行设计的主要包括3种类型的构件:用户界面构件、引文格式化构件以及引文存储和检索构件3.7C2体系结构风格C2结构是一个层次网络,包括构件和连接件两种软件元素构件和连接件都是包含顶部和底部的软件元素构件与构件之间只能通过连接件进行连接,连接件之间则可以直接进行连接构件的顶部、底部分别与连接件的底部、顶部相连,连接件的顶部、底部也分别与连接件的底部、顶部相连3.7C2体系结构风格构件之间的所有通讯必须使用消息传递机制来实现,构件之间所传递的消息可以分为两种:一种是向上层构件发出服务请求的请求消息,一种是向下层构件发送指示状态变化的通知消息连接件负责消息的过滤、路由、广播、通信和相关处理构件只能使用其上层构件所提供的服务,而不能感知下层构件的存在3.7C2体系结构风格上下层的含义与一般情况相反,最下层构件是用户界面和I/O设备,上层构件则是比较低级的逻辑操作CCCCCCCCC构件连接件3.7C2体系结构风格C2体系结构风格具有以下优点:可以使用任何编程语言来开发构件,构件重用和替换比较容易实现具有一定的扩展能力,可以有多种不同粒度的构件,构件之间相对独立,且依赖性较小,构件可以在分布式和异构坏境中运行,利用构件来实现应用需求,对任意复杂的逻辑功能进行封装构件不需要共享地址空间,避免了共享全局变量所造成的复杂关系,构件可以有自己的控制线程,即构件可以是多线程的3.7C2体系结构风格具有良好的适应性,可以实现多个用户和多个系统之间的交互,能够同时激活多个对话并使用不同的形式来进行表示可以使用多个工具集和多种媒体类型,能够动态地更新系统的框架结构在构件和连接件之间,存在着以下关系:构件顶部与连接件底部相连,构件底部与连接件顶部相连,构件与构件之间不允许直接相连与某一个连接件相关联的构件和连接件的数目没有限制3.8数据共享体系结构风格数据共享风格也称为仓库风格,有两种不同类型的软件元素:一种是中央数据单元,也称为资源库,用于表示系统的当前状态,另一种是相互依赖的构件组中央数据单元和构件之间可以进行信息交换,这是数据共享体系结构的技术实现基础根据所使用的控制策略不同,数据共享体系结构可以分为两种类型:一种是传统的数据库,另一种是黑板3.8数据共享体系结构风格如果由输入流中的事件来驱动系统进行信息处理,把执行结果存储到中央数据单元中,则这个系统就是数据库应用系统如果由中央数据单元的当前状态来驱动系统运行,则这个系统就是黑板应用系统黑板是数据共享体系结构的一个特例,用以解决状态冲突并处理可能存在的不确定性知识源3.8数据共享体系结构风格黑板经常被用于信号处理,例如:语音和模式识别,同时,在自然语言处理领域中也有广泛的应用,诸如:机器翻译和句法分析中央数据单元(黑板数据结构)知识源知识源知识源知识源知识源知识源知识源知识源计算存储器直接存取控制单元3.8数据共享体系结构风格黑板系统主要包括3部分:知识源是主要的信息来源,知识源在逻辑上和物理上都是独立的