第一章: 什么是设计模式

“号外,号外!阅读所有关于它的内容!”

“害怕新人。深受建筑师喜爱。阅读有关设计模式的内幕故事。真相可能会让你大吃一惊!”

请问你知道设计模式可以使你成为更好的开发人员吗? “当然,”你说——毕竟你正在读这本书!

你知道设计模式可以帮助你赚更多的钱吗?这是真的。通过正确使用设计模式,您可以节省时间、减少工作量并最终创造出更多伟大的东西。

你知道设计模式可以帮助你对抗吸血鬼吗?好吧,毕竟也许不是设计模式不是灵丹妙药。

然而,设计模式非常有用,无论你为哪种语言或平台开发,每个开发人员都应该绝对了解它们。他们还应该知道如何以及何时应用它们。这就是你将在本书中学到的东西!

一个真实的例子

简介告诉你设计模式是可重用的,模板解决了常见的开发问题。设计模式不是具体的实现,而是作为编写代码的起点。它们描述了经验丰富的开发人员以前多次遇到的问题的通用解决方案。

这究竟是什么意思……?考虑一下这个非开发的真实世界场景:

你自豪地拥有一家园艺公司,而你的业务确实,呃,正在蓬勃发展。到目前为止,你只做了几个小项目——这里种了一棵树,那里种了几朵花。然而,你刚刚找到了一个大客户,他想在他们的土地上种植几十棵树和花。

你的标准程序 一直让你的员工将每朵花或树苗单独搬运到位。一旦每个都被临时放置,你的客户会在你将所有东西种植在地下之前检查并批准安排。

你担心为这个大型项目将每一朵花和一棵树安装到位需要很长时间。你甚至需要几个人来搬运一些更大的树。虽然你可以雇佣很多临时雇员,但你不会从这份工作中获利。一定有更好的办法!

你决定问其他园丁他们是做什么的,你发现他们使用手推车和手推车。真是个好主意!你告诉你的员工使用手推车同时搬运多朵鲜花,并让手推车搬运沉重的树木。与此同时,你用躺椅看着你的工人去那里……管理不是很好吗?

所以现在你知道所有关于设计模式的知识了!等等,你需要更多细节吗?好吧,让我们分解一下……

示例说明

这里的“设计模式”是使用独轮车和手推车。这些是园艺中常见的最佳实践工具。同样,软件设计模式形成了一组开发中的最佳实践。你可以选择不使用手推车和手推车,但类似于避免使用软件设计模式,你会通过使项目更加耗时和劳动密集来承担更多风险。

回到“询问其他园丁的工作”这一点。大多数设计模式已经存在了很长时间——从 1970 年代和 1980 年代开始——并且它们一直运行良好直到今天。

这种长寿部分是由于几十年来它们的使用已经在许多项目中得到验证,但也因为它们不是具体的解决方案。

在园艺场景中,你决定使用手推车搬运鲜花,使用独轮车搬运树木。这些是实施细节:你可以使用手推车来移动鲜花和树木,只使用独轮车,或任何其他使工作更容易的组合。

设计模式是解决常见问题的通用解决方案,例如使用独轮车和手推车。它们是具体实施的起点,例如使用手推车种植鲜花和使用手推车种植树木。

有道理?伟大的!现在是时候离开花园,回到软件设计模式的世界了。

设计模式的类型

设计模式主要分为三种类型:

  1. 结构设计模式:描述对象如何组合和组合以形成更大的结构。结构设计模式的示例包括 ModelView-Controller (MVC)、Model-View-ViewModel (MVVM) 和 Facade。

  2. 行为设计模式:描述对象如何相互通信。行为设计模式的例子有委托、策略和观察者。

  3. 创建设计模式:描述如何创建或实例化对象。创建模式的示例有 Builder、Singleton 和 Prototype。

你可能想知道了解设计模式的类型是否真的很重要。嗯,是的……也不是。

按类型记住所有模式是没有用的。大多数开发人员不这样做。但是,如果你不确定某个特定模式是否有效,那么考虑其他相同类型的模式有时会很有用。你可能会找到一个更适合您的特定问题的解决方案。

注意:关于某些模式(包括 MVVM 和 MVC)是否实际上是跨越整个应用程序或子系统架构的架构模式,一直存在争议。因此,它们的范围比设计模式更广泛,设计模式只跨越应用程序的组件或片段。架构模式甚至可以使用或包含多种设计模式。

出于本书的目的,对架构模式的全面讨论超出了范围。我们选择将 MVVM 和 MVC 标记为结构设计模式,因为它们可以以组件方式与其他设计模式一起使用。它们在 iOS 项目中也很常用,我们希望确保覆盖它们。

如果有人说这些实际上是架构模式,我们不一定不同意,因为它们也可以这样使用。

对设计模式的批评

如前所述,“软件开发没有灵丹妙药”,设计模式也不例外。这意味着仅仅了解和使用设计模式并不能保证你将创建一个架构良好的软件。有几十种设计模式,因此了解何时以及如何使用每一种非常重要。

对设计模式有哪些常见的批评?

如果你过度使用设计模式,你的项目会变得过于复杂。

你需要小心过度使用任何工具,包括设计模式。在为项目添加设计模式之前,你可以通过明确和正确地定义要解决的问题来减少这个问题。

许多设计模式被现代编程语言所取代。

诚然,像Swift这样的现代编程语言使一些设计模式变得无关紧要或不容易实现。然而,仅仅因为一些模式是通过编程语言提供的,并不意味着所有模式都会如此。

设计模式是对学习面向对象原则的一种懒惰的替代。

为什么不同时学习呢?对面向对象原则的深刻理解肯定会有助于你的开发。

然而,如果你已经知道一个设计模式对某个特定的问题很有效,为什么还要从头开始重新发明解决方案呢?

但是,但是......看看Twitter上的这个话题,它明确地表明设计模式是毫无价值的!

不管有什么特别的批评,设计模式已经存在了很长时间,而且它们已经被用于许多应用程序中。所以在某些时候,你会遇到它们。

我们认为最好是在遇到它们之前就对它们有一个了解,而不是临时抱佛脚,根据我们的经验,临时抱佛脚通常是在星期天的深夜,在发布期限的前一天,在发现了一个关键的错误之后。

设计模式的好处

我们已经提到了设计模式的许多好处,但还有一些好处。

设计模式创造了一种通用语言。

你可以简单地说明你认为哪种设计模式最有效,而不是详细地描述一个特定的解决方案。这简化了开发人员之间的交流。

设计模式快速跟踪开发人员的入职。

在一个使用设计模式的项目中加入一个新的开发人员,要比在一个完全自定义逻辑的项目中容易得多。

设计模式使你成为一个更好的人。

嗯,这一点可能还有待商榷。但是,一定程度的自我完善是不会被浪费的。然而,这也有一定的道理,因为下一个维护你的项目的开发者肯定会认为你是一个更好的人,因为你给他们留下了一个漂亮的、充满设计模式的项目,而不是一个乱七八糟的编码。

了解设计模式可以让你发现代码之间的相似性。

一旦你知道并理解了不同的设计模式,你就会开始注意它们在代码中的使用。这给了你一个机会,因为你至少对如何使用这些代码有了一定的了解。例如,iOS和Mac编程大量使用了委托模式。如果你转到另一个同样使用Delegation的平台,你会很容易发现这种模式,并立即熟悉代码的组织方式。

关键点

在本章中,你了解了什么是设计模式,以及为什么你应该关心它们。以下是需要记住的关键点。


上一章 目录 下一章