建筑模式
每个模式是有三部分组成的规则,表达了特定环境、问题和解决方案之间的关系。
软件体系结构的构建模式
软件体系结构的特点之一就是抽象出了很多常见的系统构建模式,这些模式(或者说结构风格)是系统设计人员多年工作经验的总结。
软件体系结构风格和模式的概念
☆风格:解决某一类型问题的一种方案。
☆模式:对某个具体环境下问题具体的解决方案。
管道-过滤器风格
概述
在管道-过滤器风格下,每个功能模块都有一组输入和输出,功能模块称作过滤器(filters);功能模块间的连接可以看作输入、输出数据流之间的通路,所以称作管道(pipes)。
[^]: 这种风格的链接就像是数据流传输的管道,将一个过滤器的输出传到另一过滤器的输入。
管道-过滤器风格的特性之一在于过滤器的相对独立性,即过 滤器独立完成自身功能,相互之间无需进行状态交互。
管道过滤器风格特性
过滤器是独立运行的构件
· 非临近的过滤器之间不共享状态
· 过滤器自身无状态
过滤器对其处理上下连接的过滤器“无知”
· 对相邻的过滤器不施加任何限制
实例
DOS 中的管道命令
DOS允许在命令中出现用竖线字符“|”分开的多个命令,将 符号“|”之前的命令的输出,作为“|”之后命令的输入,这就 是“管道功能”,竖线字符“|”是管道操作符。
例如,命令dir | more使得当前目录列表在屏幕上逐屏显示。dir的输出是整个目录列表,它不出现在屏幕上而是由于符号“|”的规定,成为下一个命令more的输入,more命令则将 其输入,more命令则将其输入一屏一屏地显示,成为命令行的输出。
优点
· 设计者可以将整个系统的输入、输出特性简单的理解 为各个过滤器功能的合成。
· 管道-过滤器风格支持功能模块的复用。
[^]: 任何两个过滤器,只要它们之间传送的数据遵守共同的规约 ,就可以相连接。
· 具有较强的可维护性和可扩展性。
· 支持一些特定的分析,如吞吐量计算和死锁检测等。
· 管道-过滤器风格具有并发性(并行过滤器)。
不足
· 过滤器之间的数据交换需要大量的处理空间,数据执行占用较多运行时间。
· 设计者也许不得不花费精力协调两个相对独立但又存在某种关系的数据流之间的关系,例如多过滤器并发 执行时数据流之间的同步问题等。
· 根据实际设计的需要,设计者也需要对数据传输进行 特定的处理(如为了防止数据泄漏而采取加密等 手段),导致过滤器必须对输入、输出管道中的数据 流进行解析或反解析,增加了过滤器具体实现的复杂性。
面向对象风格特征
概述
接近人类的思维方式看待世界,现实中的个体看成对象,对象交互完成目标任务。使软件工程公认的模块化、信息隐藏 、抽象、重用性等原则在面向对象风格下得以充分实现。
特点
抽象、继承(is-a)、封装、多态
不足
面向对象风格最大的不足在于如果一个对象需要调 用另一个对象,它就必须知道那个对象的标识(对象 名或对象引用)、这样就无形之中增强了对象之间的依赖关系。如果一个对象改变了自己的标识,就必须 通知系统中所有和它有调用关系的对象,否则系统就 无法正常运行
事件驱动风格
特征
事件驱动系统的基本观点是一个系统对外部的表现 可以从它对事件的处理表征出来
特点
· 系统是由若干子系统或元素所组成的一个整体
· 系统有一定的目标,各子系统在某一种消息机制的控制下,为了这个目标而协调行动
· 在某一种消息机制的控制下,系统作为一个整体与环境相适 应和协调
· 在一个系统的若干子系统中,必定有一个子系统起着主导作用,而其他子系统则处于从属地位
· 任一系统和系统内的任一元素,都有1个事件收集机制和1个事件处理机制,通过这种机制与周围环境发生作用和联系
事件驱动风格系统设计时有下述几条基本原则
· 从系统论的角度来看待描述的对象,合理分解子系统,保证各个子系统的独立性和社会性
· 无论系统多么复杂,子系统性质的差异多么大,任何子系统都可以按照有无子系统这一性质分为2类:管理系统和执行系统
· 为了达到系统的目标,系统内的各个子系统通过传递消息和执行消息来协同操作
· 在一个完整系统中,必须有这样一个子系统,它没有上级, 必须收集系统外的事件及下级发出的事件
· 管理类型的子系统一般不执行具体操作,它的主要功能是按照自己的职能指挥下级完成任务,功能性操作一般由执行类型的子系统完成
· 在一般情况下,除最高级管理子系统外,子系统一般是“有 问才答” ,即使在必要的情况下需要积极寻找事件时,也必须征得上级系统得许可,保证了系统的控制流不会分散
优点
· 事件驱动风格非常适合于描述系统族,在属于同一族 的任何系统中,系统的高级管理子系统的描述是完全类似的,便于重用;
· 由于最高管理子系统牢牢的掌握着控制权,又因为各同级子系统一般不直接发生关系,因此容易实现并发处理和多任务操作;
· 基于事件驱动风格的系统具有良好的可扩展性,设计者只需为某个对象注册一个事件处理接口就可以将该对象引入整个系统,同时并不影响其它的系统对象;
· 定义了包含执行子系统和管理子系统的类层次结构;
· 简化客户代码;
· 使整个系统的设计更具有一般化。
不足
· 事件驱动风格最大的不足在于构件削弱了自身对系统计算的控制能力
· 事件驱动风格中存在的另一个问题在于数据共享
· 系统中各个对象的逻辑关系变得更加复杂