翻译转帖
这篇文章是软件架构编年史的一部分, 这是一系列关于软件架构的文章。在它们中,我写了我在软件架构方面学到的东西,我如何看待它,以及我如何使用这些知识。如果您阅读本系列之前的文章,这篇文章的内容可能会更有意义。
在上一篇文章中,我写了编程语言是如何演变的,以及它告诉我们什么:它们总是朝着提供更多模块化和封装性的方向发展。
在下面的帖子中,我将写关于架构风格和架构模式的演变,所以今天我将写什么是架构风格,什么是架构模式。
与软件开发中的许多术语一样,这些术语并不明确,不同的人赋予它不同的含义。MSDN 说架构风格和架构模式是相同的东西,但就我个人而言,我更喜欢按照George Fairbanks 和 Michael Keeling 的解释,this stack overflow answer中所说的内容以及维基百科如何 将两者分开来思考这些 : 主要区别在于范围。
同样重要的是要强调架构风格、架构模式和设计模式不是相互排斥的,它们是互补的,它们都可以教给我们一些东西,尽管像往常一样,它们应该只在需要时使用。
架构风格
架构风格非常广泛地告诉我们如何组织我们的代码。它是最高级别的粒度,它指定应用程序的层、高级模块以及这些模块和层如何相互交互,它们之间的关系。架构风格的例子:
- 基于组件
- 单体应用
- 分层架构
- 管道和过滤器
- 事件驱动
- 发布订阅
- 插件化
- 客户端服务器
- 面向服务
架构风格可以通过多种方式实现,具有特定的技术环境、特定的策略、框架或实践。
架构模式
模式是重复出现的问题的重复解决方案。在架构模式的情况下,他们解决与架构风格相关的问题。例如,“我们将拥有哪些类以及它们将如何交互,以实现具有一组特定层的系统” ,或者“我们的面向服务的架构中将具有哪些高级模块以及它们将如何通信” ,或 “我们的客户端-服务器架构将有多少层”。
架构模式对代码库有广泛的影响,最常影响整个应用程序的水平(即如何在层内构建代码)或垂直(即如何将请求从外层处理到内层和背部)。架构模式示例:
- 三层
- 微内核
- 模型-视图-控制器(MVC)
- 模型-视图-视图模型(MVVM)
设计模式
设计模式在其范围上不同于架构模式,它们更加本地化,它们对代码库的影响较小,它们影响代码库的特定部分,例如:
- 当我们只知道在运行时需要实例化的类型(可能是工厂类?)时,如何实例化一个对象;
- 如何使对象根据其状态(可能是状态机或策略模式?)表现出不同的行为。
结论
正如我在这篇文章的开头提到的,这都是关于范围的:
- 架构风格是最高抽象级别的应用程序设计;
- 架构模式是实现架构风格的一种方式;
- 设计模式是一种解决局部问题的方法。
此外,模式可能既可以用作架构模式,也可以用作设计模式,这同样取决于我们在特定项目中使用它的范围。
来源
2004 年 - 微软 - 理解面向服务的架构
2009 年 – 微软 – 微软应用架构指南
2010 – Stack Overflow – Arch 之间的区别是什么。图案和拱。风格?
2014 年 – George Fairbanks – 架构模式与架构风格
2017 – 维基百科 – 软件架构风格和模式列表