一、软件架构风格的概念
设计软件架构的核心问题:是否能使用重复的架构模式,达到架构级的软件重用。也就是说,能否在不同的软件系统中,使用同一架构。
1、软件架构风格是描述某一特定应用领域中系统组织方式的惯用模式。
2、软件架构风格定义了一个系统家族,即一个架构定义了一个词汇表和一组约束。其中:词汇表包含了一些构件和连接件类型;约束是描述系统如何将这些构件和连接件组合起来。
3、软件架构风格反映了领域中众多系统所共有的结构和语义特征,并指导如何将各个模块和子系统有效地组织成一个完整的系统。如此理解,软件架构风格定义了用于描述系统的术语表和一组指导构件系统的规则。
4、通用软件架构的分类:数据流风格、调用/返回风格、独立构件风格、虚拟机风格、仓库风格。
二、数据流风格
分为:批处理序列、管道/过滤器(Pipe/Filter)
1、批处理序列
批处理序列风格的每一步处理都是独立的,并且每一步是顺序执行的。只有当前一步处理完成后,后一步才能开始。
数据必须是完整的,以整体的方式传递。
批处理序列风格的典型应用:经典数据处理、程序开发、window下的BAT程序。
2、管道/过滤器
管道/过滤器风格中,过滤器就是构件,每个构件都有一组输入和输出,构件读输入的数据流,经过内部处理,然后产生输出数据流;管道就是连接件,将一个过滤器的输出传到另一个过滤器的输入。
在管道/过滤器风格中,特别重要的过滤器必须是独立的实体,它不能与其他的过滤器共享数据,而且一个过滤器不知道它上游和下游的标识。
管道/过滤器风格的典型应用:unix shell编写的程序(unix的进程就是过滤器,进程运行机制就是管道)、传统的编译器。
管道/过滤器风格的优缺点:
优点:
使构件具有良好的隐藏性和高内聚、低耦合的特点;
允许设计者将整个系统的I/O行为看成多个过滤器的简单合成;
支持软件重用;
系统维护简单,可扩展性好;
允许对一些属性,如吞吐量、死锁等进行分析;
支持并行执行;
缺点:
通常导致进程成为批处理的结构;
不适合处理交互的应用;
因为在数据传输上没有通过的标准,每个过滤器都增加了解析和合成数据的工作,这样就导致了系统性能下降,并增加了编写过滤器的复杂性;
三、调用/返回风格
分为:主程序/子程序、面向对象、层次结构
1、主程序/子程序
主程序/子程序风格是一种经典的编程范型,主要应用于结构化程序设计中。
主程序/子程序风格是各程序之间是数据共享的。
主程序/子程序风格的目的是将程序划分为若干个小片段,从而使程序的更改性大大提高。
主程序/子程序风格是单线程控制的,同一时刻只有一个子节点的子程序可以得到父节点的控制。
主程序/子程序风格的构件类型:各类子程序、过程、函数、模块;连接件类型:条件、循环、查询、中断、共享信息、调用返回。
主程序/子程序风格的基本计算类型:子程序在内部处理数据;基本不变性:主程序有序地调用子程序,单线程控制。
主程序/子程序风格的典型应用:单片机时钟、数控机床。
主程序/子程序的优缺点:
优点:
SA风格的基本形式;
可以被广泛的支持、易于维护;
缺点:
除调用以外,复杂的连接件难以描述;
不易描述大规模的软件;
可复用的层次低;
2、面向对象风格
面向对象风格建立在数据抽象和面向对象的基础上,数据的表示方法和它们的相应操作封装在一个抽象数据类型或对象中。数据抽象使组件和组件之间的操作以黑箱方式进行;
封装性使细节内容对外部环境得以良好的隐藏,对象之间的访问是通过方法调用来实现的;考虑操作和属性的关联性,封装完成了相关功能和属性的包装,并由对象进行管理;
使用某个对象提供的服务并不需要知道服务内部是如何实现的。
特点:封装/继承/多态。
封装:就象一个盒子,你不需要知道里面有什么东西,只知道它有那些用处就行;
继承:就象父子关系,儿子是父亲的继承;
多态:好比一个父亲有多个儿子,各个儿子有不同的特征;
面向对象风格的构件就是对象,连接件就是对象间的消息传递。
面向对象风格的优缺点:
优点:
对象对其他对象隐藏它的表示,所以可以改变一个对象的表示,而不影响其他对象;
设计者可以将一些数据存取操作的问题分解成一些交互的代理程序的集合;
缺点:
为了使一个对象和另一个对象通过过程调用等进行交互,必须知道对象的标识。只要一个对象的标识改变了,就必须修改所有其他明确调用它的对象;
必须修改所有显式调用它的其他对象,并消除由此带来的一些副作用;
例如:A和C都使用了B,那么C对B的使用所造成的对A的影响可能是料想不到的。
3、层次结构
层次结构风格中,每一层为上层服务,并作为下层的客户。
由于每一层最多只影响两层,同时只要给相邻层提供接口,允许每层用不同的方法实现,同样为软件重用提供了强大的支持;
层次结构风格最广泛的应用:分层通信协议(在这一应用领域中,每一层提供一个抽象的功能,作为上层通信的基础);
层次结构风格示意图:
核心层是整个系统的基础,最底层的功能调用由它来实现;
中间层(功能层)在整个模型中处于一个承上启下的位置,它既要访问核心层提供的服务,来实现自身的功能;又要为应用层提供系统可用的功能;
应用层是整个系统对外的一个接口,用户通过最高层来访问整个分层系统所能提供的功能;
层与层之间采用系统设计的协议进行通讯,通讯方式往往采用过程调用;
每个层次内部都可以包含很多的功能组件(各种构件),在实际应用中中间层都不是由一个层次实现的;
三、独立构件风格
四、虚拟机风格
五、仓库风格