数据流系统
概念:以算法和数据结构为中心, 像管道和过滤器般处理数据,每个组件都有相对独立的数据处理功能,数据依次经过各个组件,最后形成完整的数据处理系统。
优点:各个组件都是独立的, 可以放方便的组合、重用和扩展,流水线式的执行,支持大规模并行处理。
缺点:流水线式的处理, 所以一般要求数据有比较统一的输入和输出格式;各个组件都是独立的, 因此的很难提取共性;批处理方式,所以不适合和用户交互。
应用:一个最著名的实例是unix的shell编程,多个对数据进行处理的程序(组件)通过管道联结起来,产生总和的效果。
还有传统的编译器,源代码经过词法分析、语法分析、中间代码生成、目标代码生成等步骤生成输出的目标代码。
还有其他经过多步才能生成结果的程序,比如图像处理,数值解题等。
层次系统
概念:将系统功能和组件分成不同的功能层次,一般而言,只有最上层的组件和功能可以被系统外的使用者访问,只有相邻的层次之间才能够有函数调用。
优点:把复杂的问题逐层分解,使整体设计非常清晰;每层只依赖相连的里层,耦合性较弱。
缺点:有些划分清晰的层次比较困难;层次太多会使性能下降。
应用:层次系统是我们最常见的方式, 一般软件都有它的影子,比如程序典型的三层架构分为表示层(界面层)、业务逻辑层、数据访问层。
操作系统一般分为内核层,API层, 应用层, 我在
理解 Windows API 调用过程中有相关介绍。
各层之间的交互方式也值得我们探讨下, 一般调用方式有直接接口调用和消息发送二种方式,究竟什么时候该用哪种方式,可以参考我这篇
消息耦合还是接口耦合. 总的来说如果很强调弱耦合和可扩展性,可以用消息方式,我们看到Windows上在调用API进入内核时用的是中断消息的方式。
面向对象的系统
概念:数据和数据上的操作被封装成抽象数据类型或者对象。系统由大量的对象组成,在物理上,对象之间通过函数或者过程调用相互作用;在逻辑上,对象之间通过集成、复合等方式实现设计的复用。
优点:符合人们认识事物的方式,支持封装,继承,多态。
缺点:通过函数调用,并且需要知道处理的对象,耦合性比较紧密,我这篇
范型编程杂谈中也有谈及。
应用:面向对象设计和开发基本上已经是每个程序员的必修课,各种流行的编程语言都有对它的支持,COM组件技术也是以此为基础。
基于事件的系统
概念:这是面向对象和数据抽象体系的一种变形,系统同样是由大量的对象组成的,但是对象之间的交互不是通过明确指明对象的函数或者过程调用进行的,相反,系统提供事件的创建和发布的机制,对象产生事件,一个或者多个对象通过向系统注册关注这个事件并由此触发出相应的行为或者产生新的事件。
优点:用于函数和过程的调用调用不需要指明特定的对象,所以系统具有非常好的灵活性和扩展性,新的组件只需要向系统的事件处理部分注册就可以立刻加入系统中,同样,老的组件也可以方便的从系统中删除。
缺点:由于函数调用是通过事件发送进行的,所以,发出事件的对象不能确认是否有对象处理了这个事件、是否是期望的对象处理了这个事件、是否获得期望的结果,同样也无法控制事件发生的次序,系统的逻辑和时序的正确性必须通过复杂的时序逻辑和前后条件的断言加以保证。
应用:Windows的鼠标键盘消息,窗口消息等都是基这种方式。该方式与面向对象方式的比较我在
消息耦合还是接口耦合这篇中也有提及。
知识库系统
概念:使用一个中心数据结构表示系统的当前状态,一组相互独立的组件在中心数据库上进行操作。如果组件负责对中心数据进行选择、处理,这种体系就是传统的数据库模型;如果中心数据结构自主的引发一系列的行为,则这种体系可以看成一个黑板模型。
优点:以数据为中心的体系结构,可以自然的表示大量的数据和事务处理的逻辑,适合表达以数据为中心的应用程序。
缺点:只有很少一部分简单的数据库存储应用可以完全采用这种体系结构表示。
应用:传统的数据库。
解释器系统
概念:如果应用程序的逻辑非常复杂,一个较好的体系就是提供面向领域的一组指令(语言),系统解释这种语言,产生相应的行为,用户使用这种指令(语言)完成复杂的操作。
优点:非常好的扩展性,用户可以实现对软件系统的二次开发。
缺点:软件开发复杂,特别是这种指令集的设计非常困难。
应用:Java虚拟机, .Net的CLR(Common Language Runtime), 脚本语言的解释器等。
在实际开发中,我们很少会只使用一种体系结构,很多时候是以一种体系结构为主, 其他体系结构为辅。比如我们一个网络客户端软件总体上是层次系统,可能分为通讯层、业务逻辑层、界面层, 但每层内部又会用面向对象的方式实现。
总之, 软件系统的分析和设计的基本任务是:确立系统中的基本元素(完成系统的功能所必不可少的成分);确定这些元素之间相互作用的方式(这就是系统的体系结构)。 参考资料:百度百科
体系结构
本文链接