# 浅谈10个通用的软件架构模式

原文链接：[10 Common Software Architectural Patterns in a nutshell](https://towardsdatascience.com/10-common-software-architectural-patterns-in-a-nutshell-a0b47a1e9013?from=hackcv&hmsr=hackcv.com)

有没有想过如何设计大型的企业级系统？在大型软件开发开始之前，我们必须选择一个合适的架构，为我们提供所需的功能和质量属性。因此，在将架构应用到我们的设计之前，我们应该了解不同的架构。


![img](https://cdn-images-1.medium.com/max/800/1*M22DR3WPqbWXWidYIq2GwA.png)

### 什么是架构模式？

根据维基百科的定义，

可重用的解决方案软件架构的一个常见的问题在一个给定的上下文

> **架构模式** 是一个通用的、可重用的解决方案，用于在给定上下文中的软件体系结构中常见的问题。 架构模式与软件设计模式类似，但范围更广。

在本文中，我将简要介绍以下10种常见的架构模式及其用法和对应的优缺点。

1. **分层模式**（**Layered pattern** ）
2. **客户端 - 服务器模式**（**Client-server pattern**）
3. **主从模式**（**Master-slave pattern**）
4. **管道过滤器模式**（**Pipe-filter pattern**）
5. **代理模式**（**Broker pattern**）
6. **点对点模式**（**Peer-to-peer pattern**）
7. **事件总线模式**（**Event-bus pattern**）
8. **模型 - 视图 - 控制器模式**（**Model-view-controller pattern**）
9. **黑板图案**（**Blackboard pattern**）
10. **解释器模式**（**Interpreter pattern**）


### 1. **分层模式**

该模式可用于构造分解为子任务组的程序，每个子任务都处于特定的抽象级别。每层为下一个更高层提供服务。

最常见的4层通用信息系统如下。

- **表示层**（也称为**UI层**）
- **应用层**（也称为**服务层**）
- **业务逻辑层**（也称为**域层**）
- **数据访问层**（也称为**持久层**）

#### 使用

- 一般桌面应用程序
- 电子商务Web应用程序。

![img](https://cdn-images-1.medium.com/max/800/1*jMWk_JqqyyloVPhTs_Zd1A.png)

<center>分层模式</center>

### 2. 客户端-服务器模式

这种模式由两方组成; 一个**服务器**和多个**客户端**。服务器组件将为多个客户端组件提供服务。客户端从服务器请求服务，服务器向这些客户端提供相关服务。而且，服务器继续监听客户端请求。

#### 使用

- 在线应用程序，如电子邮件，共享文档和银行。


![img](https://cdn-images-1.medium.com/max/800/1*4xX_WQQuD2u0PMK5bcWFkQ.png)

<center>客户端-服务器模式</center>

### 3. 主从模式

这种模式由两方组成; **主人**和**从件**（slave）。主组件在相同的从组件之间分配工作，并根据从组件返回的结果计算最终结果。

#### 使用

- 在数据库复制中，主数据库被视为权威源，从属数据库与其同步。
- 外围设备连接到计算机系统中的总线（主驱动器和从驱动器）。

![img](https://cdn-images-1.medium.com/max/800/1*lsK9QntZl2d5oLojwRGXDg.png)

<center>主从模式</center>

### 4. 管道过滤器模式

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

#### 使用

- 编译器。连续过滤器执行词法分析，解析，语义分析和代码生成。
- 生物信息学的工作流程。



![img](https://cdn-images-1.medium.com/max/800/1*qikehZcDhhl_wWsqeI_nvg.png)

<center>管道过滤器模式</center>

### 5. 代理模式

此模式用于构建具有分离组件的分布式系统。这些组件可以通过远程服务调用来相互作用。一个**代理**组件负责协调**组件**之间的通信。

服务器将其功能（服务和特征）发布到代理。客户端从代理请求服务，然后代理将客户端从其注册表重定向到合适的服务。

#### 使用

- 消息代理软件，如[**Apache ActiveMQ**](https://en.wikipedia.org/wiki/Apache_ActiveMQ)，[**Apache Kafka**](https://en.wikipedia.org/wiki/Apache_Kafka)，[**RabbitMQ**](https://en.wikipedia.org/wiki/RabbitMQ)和[**JBoss Messaging**](https://en.wikipedia.org/wiki/JBoss_Messaging)。



![img](https://cdn-images-1.medium.com/max/800/1*1qRQZjLRAd0yY_T9p2OgBw.png)

<center>代理模式</center>

### 6. 点对点模式

在这种模式中，各个组件称为**对等**组件。对等组件既可以作为**客户端**，从其他对等组件请求服务，也可以作为**服务器**，为其他对等组件提供服务。对等组件可以充当客户端或服务器，也可以充当两者，并且可以动态地改变其角色。

#### 使用

- 共享文件网络，如[**Gnutella**](https://en.wikipedia.org/wiki/Gnutella) 和[**G2**](https://en.wikipedia.org/wiki/Gnutella2)
- 多媒体协议，如[**P2PTV**](https://en.wikipedia.org/wiki/P2PTV) 和[**PDTP**](https://en.wikipedia.org/wiki/Peer_Distributed_Transfer_Protocol)。



![img](https://cdn-images-1.medium.com/max/800/1*ROvkckSTw1UncrbQSmUJUQ.png)

<center>点对点模式</center>

### 7. 事件总线模式

这种模式主要处理事件，有4个主要组成部分; **事件源**，**事件监听器**，**通道**和**事件总线**。源将事件发布到事件总线上的特定通道。监听器订阅特定频道。监听器会收到发布到他们之前订阅频道的消息通知。

#### 使用

- Android开发
- 通知服务



![img](https://cdn-images-1.medium.com/max/800/1*DOZ4nVR9zkJm-EnXT3KOGQ.png)

<center>事件总线模式</center>

### 8. 模型 - 视图 - 控制器模式

这种模式，也称为MVC模式，将交互式应用程序划分为3个部分，

1. **model**  - 包含核心功能和数据
2. **view**  - 向用户显示信息（可以定义多个视图）
3. **controller**  - 处理来自用户的输入

这样做是为了将信息的内部表示与向用户呈现和接受信息的方式分开。它解耦组件并允许有效的代码重用。

#### 使用

- 主要编程语言中的万维网应用程序架构。
- Web框架，如[**Django**](https://en.wikipedia.org/wiki/Django_%28web_framework%29)和[**Rails**](https://en.wikipedia.org/wiki/Ruby_on_Rails)。



![img](https://cdn-images-1.medium.com/max/800/1*OP0CS6O5Sb66jpc-H-IuRQ.png)

<center>模型 - 视图 - 控制器模式</center>

### 9. 黑板模式

这种模式对于不确定性解决方案策略的问题很有用的。黑板模式由3个主要部分组成。

- **blackboard**  - 包含解决方案空间中对象的结构化全局内存
- **知识来源**  - 具有自己代表性的专业模块
- **控制组件**  - 选择，配置和执行模块。

所有组件都可以访问黑板。组件可能会生成添加到黑板的新数据对象。组件在黑板上查找特定类型的数据，并且可以通过与现有知识源的模式匹配来找到它们。

#### 使用

- 语音识别
- 车辆识别和跟踪
- 蛋白质结构鉴定
- 声纳信号解释。



![img](https://cdn-images-1.medium.com/max/800/1*ArbMx7A21I47llvwUTiSDg.png)

<center>黑板模式</center>

### **10. 解释器模式**

此模式用于设计解释一个专用语言编写的程序的组件。它主要指定如何评估程序行，一些被称为用特定语言编写的句子或表达式。基本思想是为语言的每个符号设置一个类。

#### 使用

- 数据库查询语言，如SQL。
- 用于描述通信协议的语言。



![img](https://cdn-images-1.medium.com/max/800/1*DrC3T5R4SsdcQY6aXLCRZA.png)

<center>解释器模式</center>

### 架构模式比较

下面的表格总结了每种架构模式的优缺点。



![img](https://cdn-images-1.medium.com/max/1000/1*Z9dKeyf6yi0nFMaUZF1P3Q.png)

<center>架构模式比较</center>

希望您发现这篇文章有用。我很想听听你的想法。😇

谢谢阅读。😊

干杯!😃

下方表格来源：https://www.cnblogs.com/IcanFixIt/p/7518146.html

| 名称                 | 优点                                                         | 缺点                                                         |
| -------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
| 分层模式             | 一个较低的层可以被不同的层所使用。层使标准化更容易，因为我们可以清楚地定义级别。可以在层内进行更改，而不会影响其他层。 | 不是普遍适用的。在某些情况下，某些层可能会被跳过。           |
| 客户端-服务器模式    | 很好地建立一组服务，用户可以请求他们的服务。                 | 请求通常在服务器上的单独线程中处理。由于不同的客户端具有不同的表示，进程间通信会导致额外开销。 |
| 主从设备模式         | 准确性——将服务的执行委托给不同的从设备，具有不同的实现。     | 从设备是孤立的：没有共享的状态。主-从通信中的延迟可能是一个问题，例如在实时系统中。这种模式只能应用于可以分解的问题。 |
| 管道-过滤器模式      | 展示并发处理。当输入和输出由流组成时，过滤器在接收数据时开始计算。轻松添加过滤器，系统可以轻松扩展。过滤器可重复使用。 可以通过重新组合一组给定的过滤器来构建不同的管道。 | 效率受到最慢的过滤过程的限制。从一个过滤器移动到另一个过滤器时的数据转换开销。 |
| 代理模式             | 允许动态更改、添加、删除和重新定位对象，这使开发人员的发布变得透明。 | 要求对服务描述进行标准化。                                   |
| 点对点模式           | 支持分散式计算。对任何给定节点的故障处理具有强大的健壮性。在资源和计算能力方面具有很高的可扩展性。 | 服务质量没有保证，因为节点是自愿合作的。安全是很难得到保证的。性能取决于节点的数量。 |
| 事件总线模式         | 新的发布者、订阅者和连接可以很容易地添加。对高度分布式的应用程序有效。 | 可伸缩性可能是一个问题，因为所有消息都是通过同一事件总线进行的。 |
| 模型-视图-控制器模式 | 可以轻松地拥有同一个模型的多个视图，这些视图可以在运行时连接和断开。 | 增加复杂性。可能导致许多不必要的用户操作更新。               |
| 黑板模式             | 很容易添加新的应用程序。扩展数据空间的结构很简单。           | 修改数据空间的结构非常困难，因为所有应用程序都受到了影响。可能需要同步和访问控制。 |
| 解释器模式           | 高度动态的行为是可行的。对终端用户编程性提供好处。提高灵活性，因为替换一个解释程序很容易。 | 由于解释语言通常比编译后的语言慢，因此性能可能是一个问题。   |

