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