经典软件架构模式

目录

软件架构模式

架构模式是常见问题的案。
软件架构模式是经过验证的、针对特定场景的,具有良好设计结构的、通用的、可重用的解决方案。更具体地说,架构模式是在实践中归纳总结的一组设计决策,具有明确定义的属性,并可以重复使用。

软件开发有时可以看作是选择,定制和组合架构模式的过程。软件架构师必须决定如何采用哪几种架构模式,如何使这些架构模式与软件系统特定的上下文相适应。

分层架构模式(Layered Architecture Pattern)

分层架构模式是最常见的架构模式,此模式用于可分解为子任务的结构化程序,每个子任务都位于特定的抽象层级,每一层都为上一层提供服务。

分层体系架构模式的每一层在应用程序中都有特定的角色和职责,这意味着所有组件都是互连的,但彼此之间不依赖。分层体系架构模式的强大功能之一是,组件之间职责分离。特定层中的组件仅处理与该层有关的逻辑。

例如,一般信息系统最常见的 4 个层次:

  1. 表示层(也称为 UI 层)
  2. 应用层(也称为服务层)
  3. 业务逻辑层(也称为领域层)
  4. 数据访问层(也称为持久层)

优点:

  • 高可测试性,每一层都可以单独测试。
  • 高度易于开发,因为这种模式众所周知,并且实现起来并不太复杂,而且大多数公司都通过逐层分离技能来开发应用程序,这种模式已经成为大多数业务应用程序开发的自然选择。
  • 可维护性。
  • 易于单独更新某一层。

应用场景:

  • 标准业务线应用程序,其功能不只是 CRUD 操作。
  • 需要快速构建的新应用程序。
  • 适用于经验不足的开发团队。
  • 需要严格的可维护性和可测试性的应用。

基于事件的模式(Event-based Pattern)

用于开发高度可扩展系统、常见于分布式异步架构模式,该架构模式由用于监听并异步处理事件的一系列组件组成。事件驱动的架构模式构建了一个接收所有数据的中央单元,然后将其委托给处理特定类型的单独模块。

这种模式也被称为订阅发布模式,有 4 个主要组件:事件源、事件监听者、通道和事件总线。事件源将消息发布到事件总线上的特定通道,监听者订阅特定的通道,消息发布到监听者之前订阅的通道,监听者将收到消息的通知。

优点:

  • 容易适应复杂,经常混乱的环境。
  • 弹性伸缩。
  • 当出现新的事件类型时,很容易扩展。

应用场景:

  • 具有异步数据流的异步系统。
  • 用户界面交互。
  • 通知服务。
  • 注册中心。

在这里插入图片描述

微内核模式(Microkernel Pattern)

微内核架构模式,也称插件模式,这种模式允许你将其他应用程序功能作为插件添加到核心应用程序,从而提供可扩展性以及功能分离。

微内核架构模式主要由两种组件构成:

  1. 核心系统组件:仅包含使系统运行所需的最小功能。
  2. 插件模块:提供应用程序功能和自定义处理逻辑的可扩展性,灵活性和隔离性。

微内核架构模式的最佳示例是 Eclipse IDE。Eclipse 本身只为你提供一个编辑器功能。但是,一旦开始添加插件,它就会成为高度可定制和功能强大的产品。

优点:

  • 极大的灵活性和可扩展性。
  • 一些插件允许在应用程序运行时添加。
  • 良好的便携性。
  • 易于部署。
  • 能够快速响应不断变化的环境。
  • 插件模块可以单独进行测试。
  • 高性能,因为你可以自定义和简化应用程序以仅包括所需的那些功能。

应用场景:

  • 从不同来源获取数据,转换数据并将其输出到不同地方的应用程序。
  • 工作流应用程序。
  • 任务类应用程序。

微服务模式(Microservices Pattern)

当你采用微服务模式时,实际上就是在编写多个可以协同工作的服务进程。其中每个微服务都有自己的职责,团队可以独立于其他微服务进行开发。这些微服务之间唯一的依赖就是通信。当微服务彼此通信时,你必须确保它们之间发送的消息能够向后兼容。

优点:

  • 可以分别编写,维护和部署每个微服务。
  • 易于扩展,因为你可以仅扩展需要扩展的微服务。
  • 更新迭代应用程序的各个部分比较容易,因为它们较小,并且与其他部分的耦合较少。
  • 团队成员能快速响应且富有成效。
  • 高度可维护和可测试–微服务模式满足快速频繁的开发和部署。
  • 可独立部署,无需与其他团队协调即可部署其服务。

应用场景:

  • 边界明确的企业数据中心。
  • 快速发展的业务。
  • 多部门协作的开发团队。

基于空间的架构模式(Space-based Pattern)

基于空间的架构模式,可以专门用于解决软件系统的伸缩性和并发性问题。

对于用户访问量经常发生变化、偶尔出现高并发的应用程序,这是一种有用的软件架构模式。这种模式,通过消除中央数据库约束,并使用复制基于内存的数据网格来实现伸缩性。

基于空间的架构模式旨在通过在多个服务器之间拆分处理和存储数据,来避免高负载下的软件系统功能崩溃。

优点:

  • 能够快速响应不断变化的环境。
  • 尽管基于空间的架构模式通常不是分布式,但它们是动态的,并且基于云的复杂工具允许将应用程序轻松 “推送” 到服务器,从而简化了部署。
  • 通过内存中的数据访问和此模式中内置的缓存机制可实现高性能。
  • 高可伸缩性来自于对集中式数据库的依赖很小或根本没有依赖的事实,因此提高了可伸缩性。

应用场景:

  • 数据量大的应用程序,例如:用户日志。
  • 低价值数据,偶尔可能丢失而不会造成严重后果。
  • 社交类的应用程序。

CS 模式(Client-server pattern)

这种模式由两部分组成:服务器和多个客户端。服务器将向多个客户端提供服务。客户端从服务器请求服务,服务器向这些客户端提供相关服务。此外,服务器继续侦听客户端请求。

应用场景:

  • 电子邮件、文档共享和银行等在线应用程序。
  • 基于 IPC 的应用程序。

在这里插入图片描述

主从模式(Master-slave pattern)

这种模式由两部分组成:主节点和从节点。主节点将工作分配给相同的从节点,并根据从节点返回的结果计算最终结果。

应用场景:

  • 在数据库复制中,主数据库被视为权威源数据库,从数据库与之同步。
  • 通过总线连接到计算机系统(主驱动器和从驱动器)的外围设备。
  • 进程内的多线程应用。

在这里插入图片描述

管道-过滤器模式(Pipe-filter pattern)

这种模式可用于构造生成和处理数据流的系统,每个处理步骤都包含一个过滤器组件。要处理的数据通过管道传递,这些管道可用于缓冲或同步目的。

应用场景:

  • 编译器。连续过滤器执行词法分析、词法解析、语义分析和代码生成。
  • 生物信息学的工作流。
  • 工具链式的应用程序。
  • 网络数据面处理软件。

在这里插入图片描述

代理模式(Broker pattern)

这种模式通过解耦组件来构造分布式系统,这些组件可以通过远程服务调用彼此交互,代理组件负责协调组件之间的通信。

服务器向代理发布功能(服务和特征),客户端向代理请求服务,然后代理将客户端重定向到合适的服务。

注意:Broker,Agent,Proxy 以及 Delegate 之间的的区别。

应用场景:

  • 消息代理软件,例如:Apache ActiveMQ、Apache Kafka、RabbitMQ 和 JBoss 消息传递。
  • 网络传输中的代理软件。

在这里插入图片描述

P2P 模式(Peer-to-peer pattern)

在这种模式中,每个组件都称为对等节点。对等节点既可以作为客户机(从其他对等节点请求服务),也可以作为服务器(向其他对等节点提供服务)。对等节点可以充当单个客户机或服务器,也可以同时充当客户机和服务器,并且可以随着时间变化动态地更改角色。

使用场景:

  • 文件共享网络,例如:Gnutella 和 G2 等。
  • 多媒体协议,如:P2PTV 和 PDTP。

在这里插入图片描述

MVC 模式(Model-view-controller pattern)

MVC 模式将一个交互应用程序分为三个部分:

  1. 模型:包含核心功能和数据。
  2. 视图:向用户显示信息(可以定义多个视图)。
  3. 控制器:处理来自用户的输入。

这样做是为了将信息的内部表示、信息呈现给用户的方式、接受用户输入的方式分离开来。这种模式解耦组件并允许有效的代码重用。

应用场景:

  • 一般的 Web 应用程序,例如:Django 和 Rails 等框架。
  • 一般的 GUI 应用程序。

在这里插入图片描述

黑板模式(Blackboard pattern)

这种模式对于没有确定解决方案策略的问题非常有用。

黑板图案由三个主要部分组成:

  1. 黑板:一个结构化的全局内存,包含来自解决方案空间的对象。
  2. 知识源:具有自己表示形式的专门化模块。
  3. 控制组件:选择、配置和执行模块。

所有的组件都可以到达黑板。组件可以生成添加到黑板上的新数据对象,组件在黑板上查找特定类型的数据,并通过与现有的知识源进行模式匹配找到这些数据。

应用场景:

  • 语音识别。
  • 车辆识别及追踪。
  • 蛋白质结构识别。
  • 声纳信号的解释。

在这里插入图片描述

解释器模式(Interpreter pattern)

这种模式用于设计一个解释专用语言编写的程序组件,它主要指定如何评估每一行程序,即用特定语言编写的句子或表达式。其基本思想是语言的每个符号都有一个类。

应用场景:

  • 数据库查询语言,如:SQL。
  • 用于描述通信协议的语言。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Jmilk/article/details/108311716
今日推荐