程序员必知的几种软件架构模式

架构模式是对给定上下文的软件架构中常见问题的一种通用的可复用的解决方案 。

一种模式就是特定上下文的问题的一种解决方案 。
然而,很多开发者至今还对各种软件架构模式之间的差别搞不清,甚至对其所知甚少 。
大体上,主要有下面这几种架构模式:
  • 分层架构
  • 管道 - 过滤器架构
  • 客户端 - 服务器架构
  • 模型 - 视图 - 控制器架构
  • 事件驱动架构
  • 微服务架构
程序员必知的几种软件架构模式
分层架构模式最常见的架构模式就是分层架构或者称为 n 层架构 。
大部分软件架构师、设计师和开发者都对这个架构模式非常熟悉 。尽管对于层的数量和类型没有具体限制,但大部分分层架构主要由四层组成:展现层、业务层、持久层和数据库层,如下图所示 。
程序员必知的几种软件架构模式

文章插图
一个很流行的 n 层架构示例
上下文
所有复杂的系统都会经历独立地发展和衍化系统各个部分的需要 。出于这个原因,系统开发者需要对关注点进行清晰且条理分明的分离,以便系统的各个模块可以独立地开发和维护 。
问题
软件需要以这样一种方式分割:各个模块可以独自开发和衍化,各自部分之间的交互非常少,支持可移植性、可修改性和复用性 。
方案
为了实现关注点分离,分层模式将软件分割成各个单元(称为“层”) 。每一层都是一组模块,提供了一组高内聚的服务 。其使用必须是单向的 。层将一组软件作为一个完整的分区,每个分区暴露一个公开接口 。
  • 第一个概念是,每一层都有特定的角色和职责 。例如,展现层负责处理所有的用户界面 。分层架构的这种关注点分离,让构建高效的角色和职责非常简单 。
  • 第二个概念是,分层架构模式是一个技术性的分区架构,而非一个领域性的分区架构 。它们是由组件组成的,而不是领域 。
  • 最后一个概念是,分层架构中的每一层都被标记为封闭或者开放 。封闭层意味着请求从一层移到另一层,它必须通过它正下面的这一层才能达到下面这一层的再下一层 。请求不能跳过任何层 。

程序员必知的几种软件架构模式

文章插图
封闭层和请求访问
弱点
分层会导致性能下降 。这种模式不适合高性能应用程序,因为经过架构中的多层来实现一个业务请求的效率是不高的 。
分层还会增加系统的前期成本和复杂性 。
用途
我们应该将这种方式应用于小型简单的应用程序或网站 。对于预算和时间非常紧张的场景,这是一个不错的选择 。
多层模式方案
程序员必知的几种软件架构模式

文章插图
一个多层模式示例:消费者网站 J2EE
许多系统的执行结构被组织成一系列逻辑组件分组 。每个分组被称为一个层 。
上下文:在一个分布式部署中,通常需要将系统的基础设施分到不同的子集中 。
问题:我们如何将系统分割到多个计算上独立的执行结构:由一些通信媒介连接的软件和硬件组?
弱点:大量前期成本和复杂性 。
用途:用在分布式系统中 。
管道 - 过滤器架构软件架构中反复出现的一种模式是管道 - 过滤器(pipe-filter)模式 。
程序员必知的几种软件架构模式

文章插图
管道过滤器模式
上下文
许多系统需要转换从输入到输出的离散数据流 。许多类型转换在实践中重复出现,因此将其创建成独立的可复用的部分,这是比较理想的 。
问题
这些系统需要被分割成可复用的松耦合的组件,组件之间拥有简单通用的交互机制 。这样它们就可以灵活地相互结合 。这些通用松耦合的组件就很容易复用 。那些独立的组件可以并行执行 。
方案
这种架构中的管道构成了过滤器之间的通信通道 。第一个概念是,由于性能原因,每个管道都是非定向的和点对点的,接受来自一个源的输入并经常直接输出到另外一个源 。
在这种模式中,有如下四种过滤器 。
  • producer(source):一个过程的起点 。
  • transformer (map):对一些或所有数据进行转换 。
  • tester (reduce):测试一个或多个条件 。
  • consumer (sink):终点 。
弱点
不太适合交互性的系统,因为它们的转换特性 。


推荐阅读