架构风格、架构模式和设计模式的区别
许多软件专业人士认为架构风格和模式是相同的。可悲的是,一些软件开发人员不了解架构模式和设计模式之间的区别。在本文中,我们将总结它们之间的差异。
根据 MSDN,架构风格和模式是一回事。但怎么可能呢?风格一词的意思是:“做某事的方式”,而图案的意思是:“重复的装饰设计”。然而,这些定义显示了两个不同的东西。在软件工程中,术语必须更加清晰并描述特定的东西。那么,这些术语之间有什么区别,我们如何区分它们呢?
架构风格
架构风格展示了我们如何组织我们的代码,或者从 10000 英尺的直升机视图中系统看起来如何,以展示我们系统设计的最高抽象级别。此外,在构建我们系统的架构风格时,我们关注层和模块以及它们如何相互通信。
有不同类型的架构风格,此外,我们可以混合它们并产生一种混合风格,由两种甚至更多架构风格的混合组成。以下是每个类别的架构风格和示例列表:
- 结构架构风格:例如分层、管道和过滤器以及基于组件的风格。
- 消息方式:如隐式调用、异步消息和发布-订阅方式。
- 分布式系统:如面向服务、点对点风格、对象请求代理和云计算风格。
- 共享内存风格:如基于角色、黑板、以数据库为中心的风格。
- 自适应系统风格:如微内核风格、反射、特定领域的语言风格。
架构模式
架构模式展示了如何使用解决方案来解决重复出现的问题。换句话说,它反映了代码或组件如何相互交互。此外,架构模式描述了我们系统的架构风格,并为我们的架构风格中的问题提供了解决方案。就个人而言,我更喜欢将架构模式定义为实现我们的架构风格的一种方式。比如:我们的架构风格中如何分离数据模块的UI?如何将第三方组件与我们的系统集成?我们的客户端-服务器架构将有多少个轮胎?架构模式的示例包括微服务、消息总线、服务请求者/消费者、MVC、MVVM、微内核、n 层、领域驱动设计和表示抽象控制。
设计模式
设计模式是软件专业人员多年来通过反复试验来解决软件开发过程中遇到的一般问题所积累的最佳实践和经验。四人帮(GOF,指 Eric Gamma、Richard Helm、Ralf Johnson 和 John Vlissides)在 1994 年写了一本书,题为“设计模式——可重用的面向对象软件的元素”,其中他们建议设计模式是基于 面向对象设计的两个主要原则:
- 开发到接口,而不是实现。
- 优先考虑对象组合而不是继承。
此外,他们提出设计模式集包含 23 种模式并分为三个主要集:
1. 创造性的设计模式:
提供一种在隐藏创建逻辑的同时创建对象的方法。因此,无需使用“New”关键字直接实例化对象即可完成对象创建,从而可以灵活地决定需要为给定用例创建哪些对象。创建设计模式是:
- 抽象工厂模式:提供一个接口来创建对象而不指定类。
- 单例模式:只提供单个实例的调用和对该实例的全局访问。
- 建造者模式:将构造与表示分离,并允许相同的构造创建多个表示。
- 原型模式:创建副本而不影响性能和内存。因此,复制对象是从现有对象的骨架构建的。
2. 结构模式:
关注类和对象的组合。结构设计模式是:
- 适配器模式:它充当两个不兼容的接口之间的桥梁,并结合了它们的功能。
- 桥接模式:提供一种将抽象与其实现分离的方法。
- 过滤器模式:也称为标准模式,它提供了一种使用不同标准过滤一组对象并通过逻辑操作以解耦方式链接它们的方法。
- 复合模式:提供一种以类似方式将一组对象视为单个对象的方法。它以树结构的形式组合对象以表示部分以及整个层次结构
- 装饰者模式:允许在不改变其结构的情况下向现有对象添加新功能。
- 外观模式:为一组接口提供统一的接口。它隐藏了系统的复杂性,并为客户端提供了一个接口,客户端可以使用该接口访问系统。
- 享元模式:减少创建的对象数量并减少内存占用并提高性能。它通过存储已经存在的类似对象来帮助重用它们,并在找不到匹配对象时创建一个新对象。
- 代理模式:为另一个对象提供一个占位符以控制对其的访问。该对象具有一个原始对象,用于将其功能与外部世界接口。
3.行为模式:
行为模式与对象之间的通信有关。以下是行为模式列表:
- 责任模式:为请求创建一个接收者对象链。此模式根据请求的类型将请求的发送者和接收者解耦。
- 命令模式:它是一种数据驱动的模式,其中一个请求作为命令包装在一个对象下并传递给一个调用者对象。
- 解释器模式:提供一种评估语言语法或表达式的方法。它涉及实现一个表达式接口,该接口告诉解释特定的上下文。此模式用于 SQL 解析、符号处理引擎等。
- 迭代器模式:提供了一种以顺序方式访问集合对象元素的方法,而无需知道其底层表示。
- 中介者模式:用于降低多个对象或类之间的通信复杂度。它提供了一个中介类,通常处理不同类之间的所有通信,并通过松散耦合支持轻松维护代码。
- 备忘录模式:用于将对象的状态恢复到以前的状态。
- 观察者模式:当对象之间存在一对多关系时使用,例如如果一个对象被修改,它的依赖对象将被自动通知。
- 状态模式:用于根据其状态改变类行为。
- 空对象模式:通过使用默认对象来帮助避免空引用。
- 策略模式:提供一种在运行时更改类行为或其算法的方法。
- 模板模式:抽象类公开定义的方式/模板来执行其方法。它的子类可以根据需要覆盖方法实现,但调用方式与抽象类定义的方式相同。
- 访问者模式:用于改变元素类的执行算法。
在 3 类设计模式中可以添加另外两个设计模式子集:
- J2EE 模式:模式特别关注表示层。这些模式由 Sun Java Center 确定。
- 并发模式:如:balking、join、lock 和 Thread pool 模式
总结:
架构风格是系统的 10000 架直升机视图。它显示了最高抽象级别的系统设计。它还显示了应用程序的高级模块以及这些模块如何交互。另一方面,架构模式对横向和纵向的系统实现有着巨大的影响。最后,设计模式用于解决软件实施过程中的本地化问题。此外,与架构模式相比,它对代码的影响较小,因为设计模式更关注代码实现的特定部分,例如初始化对象和对象之间的通信。