什么是设计模式?:又一篇文章
在积累了一定的经验并在行业中摸爬滚打了一段时间后,我意识到设计/架构系统和软件的重要性。于是我开始研究系统/软件设计,并了解到没有什么比设计模式更好的入门方法了。我做的第一件事就是在谷歌上搜索“什么是设计模式?”,于是就有了写这篇文章的想法。
但作为一个没有计算机科学背景的人(我是电子学背景),学习这些模式真是费劲。每一份资料、文章、解释或书籍都充斥着各种术语,让我费解。有些术语我至今仍不太理解。我几乎不知道享元模式和经典访问者模式是怎么运作的,任何说知道的人都是骗子。
所以,在参加了在线课程、YouTube 视频、大量谷歌搜索、大量整理和间隔重复学习之后,我学到了一些东西,也学到了一些东西。以下是我目前为止的收获。
什么是设计模式?
来自维基百科:
- 在软件工程中,软件设计模式是针对软件设计中特定情境下常见问题的通用、可复用解决方案。-
它并非可以直接转换为源代码或机器码的最终设计。它是一种解决问题的描述或模板,可用于多种不同情况。-
设计模式是形式化的最佳实践,程序员在设计应用程序或系统时可以使用它来解决常见问题。
- 设计模式为常见问题建立了解决方案,有助于保持代码的可维护性、可扩展性和松散耦合性。
- 开发人员为解决特定类型问题的解决方案赋予了名称。这就是一切的开始。
- 人们对它们了解得越多,就越容易解决我们面临的所有问题。
- 它是由四人帮(1994)的书推广的。
什么不是设计模式?
- 这不是代码重用,因为它通常不指定代码。实际的实现取决于编程语言,甚至取决于编写它的人。
- 设计模式和原则(SOLID)是两件不同的事情。
- 设计模式既不是静态的解决方案,也不是算法,也没有编码标准的硬性规定。
- 软件架构并非设计模式。软件架构规定了要实现什么以及将功能放置在哪里。而设计模式则阐明了应该如何实现。
- 设计模式并非直接用于编码解决方案,它们更像是对解决方案的描述。你应该从设计模式中汲取的教训是,问题和解决方案是紧密相关的。学习它们同样重要。
为什么我们需要设计模式?
作为软件开发人员,我们经常通过一些属性来评估代码,例如代码的简洁性、表达能力、内存占用少以及运行速度。但我们经常忽略的一个最重要的问题是,代码应该能够轻松地进行后续修改。你今天做出的决定明天可能就变得无关紧要了。而且,你的代码应该足够灵活,这样修改起来成本就不会太高。因此,设计模式是涵盖这些属性的最佳实践。对我来说,设计模式的核心包含以下 6 条规则:
它们是经过验证的解决方案
- 由于设计模式经常被许多开发人员使用,因此您可以确信它们有效。不仅如此,您还可以确信它们经过多次修改,并且可能进行了优化。
它们很容易重复使用
- 设计模式记录了可重复使用的解决方案,该解决方案可以修改以解决多个特定问题。因为它们不局限于某个特定问题。
- 例如,考虑迭代器设计模式,尽管容器和算法有所不同,但它在整个 STL 中都是可重用的。迭代器就像容器和算法之间的粘合剂。
他们富有表现力
- 设计模式可以非常优雅地解释一个大型解决方案。例如,访问者模式用于对一组/多个类执行新的操作。因此,标准库采用了这种单一功能(即
std::visit
算法)的模式。同样如此boost::flyweight<>
。
它们简化了沟通
- 当开发人员熟悉设计模式时,他们可以更轻松地相互沟通特定问题的潜在解决方案。
- 如果您与多位开发人员组成的团队中的同事合作,请与他们就设计模式达成共识,因为它们可以帮助您更好地解决问题。同样,在软件维护方面,您也应该遵循这些流程,因为这样可以使维护操作更快、更高效。
它们避免了重构代码的需要
- 如果在编写应用程序时考虑了设计模式,那么通常情况下,您以后不需要重构代码,因为将正确的设计模式应用于给定的问题已经是最佳解决方案。
- 如果此类解决方案得到更新,任何优秀的软件开发人员都可以无缝地应用它们,并且不会造成任何问题。
它们降低了代码库的大小
- 由于设计模式通常是优雅且最优的解决方案,因此它们通常比其他解决方案所需的代码更少。但情况并非总是如此,因为许多开发人员会编写更多代码来加深理解。
为什么要学习设计模式?
- 如果将面向对象设计的定义简化,它就是将数据及其操作组合成一个上下文绑定的实体(即类/结构体)。这在设计单个对象时也同样适用。
- 但是当你设计完整的软件时,你需要考虑
- 创建型设计模式:这些对象将如何被实例化/创建?
- 结构设计模式:这些对象如何与其他对象结合并形式化更大的实体?这在未来也应该是可扩展的。
- 行为设计模式:您还需要考虑那些可以轻松预测未来变化且副作用更少的对象之间的通信。
- 你明白这是什么意思了吗?你需要处处以对象为中心,兼顾可维护性、可扩展性、表达力和稳定性。简而言之,这就是优秀编程的思维模式。我敢肯定,如果你有 C 语言背景,你肯定不具备这种思维模式和思路。
深入研究设计模式之前
但是,在深入研究设计模式之前,你应该学习一些称为 SOLID 的基本设计原则。SOLID 是面向对象软件开发中最流行的设计原则之一,由罗伯特·C·马丁(Robert C. Martin,俗称“ 鲍勃大叔” )提出。SOLID 原则包含以下五项原则:
- Dev 也将这个 SOLID 设计原则称为“面向对象设计的前 5 个原则”。
- 这些原则还使开发人员能够轻松避免代码异味,轻松重构代码,并且也是敏捷或自适应软件开发的一部分。
SOLID不是“需要采用的原则”,而是“需要使用的框架”
设计模式的类型
创建型设计模式
结构设计模式
行为设计模式
设计模式的好处
- 轻松预见并纠正未来的问题。
- 有助于保持与后续版本的二进制兼容性。
- 只要遵循SOLID 原则,就能极大地帮助敏捷或自适应软件开发。
- 该解决方案有助于开发高内聚、耦合度最低的模块,从而提高可扩展性和可重用性。
- 有一些模式,例如 Facade、Proxy 等,它们将复杂性封装在自身中,从而为客户端提供简单直观的界面。从而使整个系统更易于理解,并降低学习曲线。
- 设计模式使设计师和开发人员之间的沟通更加清晰精准。当开发人员在讨论软件设计时提到用于解决特定问题的模式名称时,他们能够立即在脑海中勾勒出该模式的高层设计。
下一步是什么?
我并非提倡把所有东西都死记硬背,但你应该尽可能多地理解这些概念,因为你在工作中会经常遇到它们。通过实践,你将更好地理解它们的用例及其背后的原因。
我希望在本系列中涵盖大多数经典的“四人帮”设计模式。我在学习这些模式时,很难找到适合初学者的资料,希望这些资料能帮助其他人避免同样的命运。顺便说一句,我将使用现代 C++来编写所有模式。因此,你也可以从思维过程和一些定义中感受到 C++ 的韵味(这句话我很难用语言表达)。这并不意味着你不能将这些模式应用于其他语言。
常见问题解答
你一直都需要设计模式吗?
一开始,你不应该考虑设计模式。简洁且富有表现力的代码始终是第一道防线。你不应该让解决方案变得复杂,因为问题本身就带来了复杂性。
为什么你应该学习设计模式?如果你是一位自学成才的开发人员,并且没有接触过行业项目,那么你可能缺乏使用面向对象设计的思维方式。你不可能从对象的角度来思考设计的每个方面。在这种情况下,设计模式将为你提供一种全新的思维方式,让你从对象的角度思考一切。如果你严格遵循它,你会发现你的类和软件代表了领域特定语言(Domain Specific Language)。
有任何建议、疑问或想说的话Hi
吗?只需点击一下,即可轻松解决。🖱️