一、数据流风格
- 批处理:每一步都是独立的,并且每一步都是顺序执行的,只有当前一步处理完毕后,后一步处理才开始。数据必须是完整的,作为一个整体进行传递。如日志分析、计费程序等。
- 管道/过滤器:每个构件都有一组输入输出,构件读输入的数据流,经过内部处理,然后产生输出数据流。这个过程通常通过对输入流的变换及增量计算来完成,所以在输入被完全消费之前,输出便产生了。如传统的编译器、UNIX管道等。
(数据流风格)批处理风格与管道过滤器风格的区别:
共同点:把任务分成一系列固定顺序的计算单元。组件间只通过数据交互传递。
区别:(1)批处理强调是全部的,输入时可随机存取,无合作性无交互性。而管道过滤器是递增的,有反馈,可交互。(2)批处理强调数据传送在步与步之间作为一个整体,而管道过滤器无此要求。批处理的数据是完整的,管道过滤器的数据是增量的(3)批处理数据以整体的形式传输,数据总量有限。管道过滤器用数据流的形式传输,数据量无限制。
二、调用/返回风格
- 主程序/子程序属于结构化设计,关注功能的实现,使用自顶向下的功能划分的设计方法。把问题分为若干步骤处理。构件即为主程序和子程序。系统中的每个构件都是一个函数或者过程,每个函数形成一个调用链。产生程序结构图。每个函数可修改全局数据。如开发语言。
- 面向对象体系关注数据与功能的封装,采用面向对象的设计方法。构件是对象,即抽象数据类型的实例,每个对象都包含数据和方法。各个对象通过相互调用的方式来实现,通过相互调用,实现整个系统的全部功能。没有可供修改的全局数据。产生设计类图。如面向对象开发语言。
- 层次架构风格:每层为上一层提供服务,修改某一层,最多影响其相邻的上下层(通常只能影响上层)。上层必须知道下层的身份,不能调整层次之间的顺序。如TCP/IP协议。
三、独立构件风格
独立构件风格主要强调每个构件都是相对独立的个体,它们之间不直接通信,以降低耦合度,提高灵活性。构件之间相互独立,不存在显示的调用关系。
- 进程通信:进程间消息传递的方式可以是点对点、异步或同步方式,以及远程过程调用等。
- 事件驱动(隐式调用):当某个事件被触发时,系统自动调用在这个事件中注册的所有过程。如断点调试、公众号等的订阅信息。
四、虚拟机风格
人构建一个运行环境,在这个环境上,可以解析与运行定义的一些语言增加架构的灵活性。
- 解释器适用于“自定义规则的场合”,无需人的介入,逐行逐字翻译执行。如JVM。
- 规则系统是在解释器的基础上增加经验规则,适用于专家系统,一个规则对应一个处理流程。一般用在人工智能领域和决策支持系统中。
五、仓库风格(数据共享风格)
以数据为中心,所有的操作都是围绕建立的数据中心进行的。数据库系统和黑板系统共同点是共享数据。若输入流中某类事件触发系统相应的进程执行,则仓库是传统型数据库。
若中央数据结构的当前状态触发系统相应的进程执行,则仓库是黑板系统。数据库系统是构件控制中央共享流程,而黑板系统是构件被动响应中央共享数据的变化。黑板系统包括知识源、黑板和控制三个部分。知识源包括若干独立计算的不同单元,提供解决问题的知识。知识源之间不直接通信,他们之间的交互通过黑板来完成,知识源响应黑板的变化,也只修改黑板;黑板是一个全局数据库,包含问题域解空间的全部状态,是知识源相互作用的唯一媒介,知识源通过不断地改变黑板数据来解决问题;控制:控制完全由黑板的状态驱动,知识源响应是通过黑板的状态变化来控制的。黑板系统通常应用在对于解决问题没有确定性算法的软件中。如语音识别,信号处理。
六、闭环风格(过程控制)
闭环风格(过程控制):适用于嵌入式系统,用于解决简单闭环控制问题,如空调温控、定速巡航。
各架构风格的优缺点:
- 管道/过滤器风格
优点:
模块化:系统可以被拆分成多个独立的组件,易于开发和维护。
可重用性:过滤器可以在不同的管道中重复使用,提高代码的可重用性。
可扩展性:可以通过添加新的过滤器来扩展系统的功能。
缺点:
过多的过滤器可能导致性能下降,增加系统的复杂性。
数据流在过滤器之间传递,可能导致数据转换和传输的开销。 - 面向对象风格
优点:
模块化:系统可以被组织成多个对象,易于理解、扩展和维护。
可重用性:面向对象的设计鼓励代码的重用,通过继承和多态性实现代码的灵活性和可扩展性。
封装性:对象可以封装数据和功能,提供更好的安全性和抽象性。
缺点:
复杂性:面向对象的设计可能导致较高的复杂性,特别是对于大型系统。
性能开销:面向对象的设计可能引入一些额外的性能开销,如动态绑定和消息传递。 - 事件驱动风格
优点:
松耦合:组件之间通过事件进行通信,彼此之间解耦,易于维护和扩展。
响应性:系统可以及时响应事件,适用于实时和交互式应用。
并发性:事件驱动的系统可以支持并发处理多个事件。
缺点:
(1)构件放弃了对计算的控制权,完全由系统来决定
(2)存在数据传输问题 - 分层体系结构风格
优点:
模块化:系统按层次结构组织,易于理解和维护。
可重用性:每个层级可以独立开发和测试,提高代码的可重用性。
松耦合:各个层级之间通过定义明确定义的接口进行通信,实现松耦合的架构。
可扩展性:分层架构允许在需要扩展系统功能或引入新的技术时,只需对特定的层进行修改或扩展,而无需对整个系统进行重构。这种可扩展性使得系统能够适应变化的需求和技术演进。
缺点:
性能损失:分层架构可能引入一定的性能损失,因为在不同层之间可能需要进行额外的数据传递和转换。这种开销在某些性能敏感的系统中可能会成为限制因素。
增加复杂性:分层架构引入了多个层次和层间的依赖关系,增加了系统的复杂性和理解难度。在设计和维护分层架构时,需要仔细考虑和管理各个层次之间的交互和依赖关系。
跨层调试困难:当系统出现问题时,跨越多个层次进行调试可能会比较困难。因为问题可能涉及多个层次之间的交互和数据流,需要进行跨层的追踪和排查。 - C2体系结构风格
优点:
分布式:C2体系结构支持分布式部署,可以在多个计算节点上运行不同的组件。
可伸缩性:可以通过添加更多的计算节点来扩展系统的处理能力。
高可用性:C2体系结构具有冗余和容错机制,提高系统的可靠性和可用性。
缺点:
复杂性:C2体系结构的设计和实现比较复杂,需要考虑分布式通信、一致性和容错等方面。
开发和调试困难:分布式系统的开发和调试相对更加复杂,需要处理网络 - 仓库风格
优点:
数据中心:集中式数据仓库提供了数据的一致性和可管理性。
数据共享:多个组件可以共享数据仓库中的数据,提高数据的可访问性和共享性。
缺点:
性能瓶颈:集中式数据仓库可能成为系统的性能瓶颈,特别是在高并发场景下。
数据一致性:多个组件同时对数据仓库进行操作可能导致数据一致性问题。 - 解释器风格:
优点:
灵活性:解释器风格允许在运行时解释和执行代码,提供了系统的灵活性和动态性。
可扩展性:可以通过添加新的解释器或修改现有解释器来扩展系统的行为。
缺点:
性能开销:解释器的执行通常比编译后的代码执行更慢,因为需要解析和解释每一条指令。
复杂性:解释器的设计和实现可能比较复杂,需要处理语法解析、语义解释等方面的问题。