67

任何人都可以阅读 GoF 书籍来了解什么是设计模式以及如何使用它们,但是确定设计模式何时解决问题的过程是什么?模式知识是否推动了设计,或者有没有办法弄清楚如何使用模式来改变设计?

换句话说,模式有模式吗?

4

14 回答 14

46

我强烈推荐阅读O'Reilly 的Head First Design Patterns。这解释了如何在现实世界中使用这些模式。

头部优先设计模式

我还要补充一点,不要在设计时考虑太多模式。此外,寻找模式可能有助于解决的“代码异味”。

于 2008-09-17T16:53:59.153 回答
46

设计模式应该提供一种可以解决问题的结构在解决实际问题时,您必须考虑对该问题的解决方案的许多微小变化,以查看是否符合设计模式。特别是,您可能需要概括您的问题或其解决方案,以使设计模式适合。

答案是,这是一门艺术。 了解设计模式无疑是重要的一步。习惯这种事情的一种方法是研究设计模式的应用,而不仅仅是模式。随着时间的推移,了解一种模式的许多不同应用程序可以帮助您更好地将任务映射到模式上。

于 2008-09-17T16:57:54.713 回答
14

大多数人不理解的模式背后有一个核心概念。不要将它们视为数据结构或算法。

相反,请将您的代码视为人们相互发送消息,例如传递笔记​​或发送信件。每个对象都是一个“人”。

您组织“人员”的方式以及他们用来相互发送消息的模式就是模式。

于 2010-02-27T08:08:47.500 回答
13

把问题翻过来:你应该制作的模式是“什么模式适合我的问题”。考虑一个非常简单的模式,在数组中查找元素。在 C 中,它类似于

TYPE_t ary[SIZE] = // ... gets initialized somehow
size_t ix ;        // Your index variable

for(ix=0; ix < SIZE; ix++){
    if (ary[ix] == item) {
       return ix ;
    }
}

您不会查看代码并思考“我可以在哪里使用它”,而是查看问题并说“我知道如何在数组中查找元素吗?”

使用更广泛的模式确实以相同的方式工作。您需要拥有许多不经常更改的数据结构的副本 --- 这让您认为是“享元”。你想要一些存在于网络边界两侧的东西,你认为是代理。

当你研究模式,尤其是 GoF 时,问问自己“什么情况下需要这种模式?我以前见过这种模式吗?我在以前的工作中可以用它做什么?在我自己的生活中哪里可以找到这样的例子? "

于 2008-11-11T02:19:40.050 回答
8

设计模式?你沉浸在它们之中!

设计模式没有什么特别之处,它们只是设计模式。所有的开发都使用设计模式。面向对象编程中有一组设计模式被普遍认为是可取的,并已成为规范的设计模式。但也有许多不受欢迎或无关紧要的设计模式(例如设计反模式)以及未发现和/或未记录的模式。

编程时无法避免使用模式。但是您可以更加了解您正在使用的模式,以及某些模式何时有用,何时无用。学习GoF 书中的规范设计模式会有所帮助,学习代码异味和重构也会有所帮助。对于何时应该使用特定设计或设计模式,没有一个正确的答案,您需要积累使用和实施它们的经验,以便知道何时何地使用哪种模式。

于 2008-10-29T19:23:58.837 回答
6

经验。了解它们的使用模式和实际示例。每次你要做出设计决定时,想想你知道的模式是否适用于它。随着时间的推移,你会变得更好,你会发现将模式应用于更广泛的问题的新方法。

于 2008-09-17T16:55:20.337 回答
6

我发现的另一本好书是:

重构为模式

通过展示何时、何地以及如何将现有代码更改为模式,它让我更好地理解了这些概念,并能够确定它们可以在哪里使用。

于 2008-09-17T16:55:35.360 回答
4

您是如何学会何时使用 if 语句的?

我把它比作是因为它是一个更大的结构,你需要了解它的来龙去脉,然后才能有效地使用它。if 语句解决了一类需要分支的问题。桥接模式解决了一类问题。我真的没有任何不同的看法。

于 2008-09-17T16:56:11.460 回答
4

如果您知道这些模式,那么它们就会成为您工具箱中的工具。当您查看一项任务时,您可以从您的工具中进行选择。此时,您应该非常清楚哪种工具最适合给定问题。这是公式停止工作的地方,您实际上是在做工程工作。

于 2008-09-17T17:20:34.567 回答
4

Rian van der Merwe 在 2012 年 6 月为 Smashing Magazine 写了一篇关于此的优秀文章。这里有一些要点。

设计模式之所以有用有两个原因:

  1. 模式可以节省时间,因为我们不必解决已经解决的问题。
  2. 模式使 Web 更易于使用,因为随着设计师采用的增加,用户习惯了事物的工作方式,这反过来又减少了他们在遇到常见设计元素时的认知负担。

van der Merwe 建议我们在以下情况下考虑打破模式:

  1. 新方法凭经验提高可用性,或
  2. 既定的方式变得过时了。
于 2012-10-02T05:24:58.690 回答
3

与软件工程中的许多实践一样,设计模式的概念取自结构工程。如果您考虑构建一个结构,则需要就如何构建该结构以实现设定的目标做出决定。在做出这些决定时,您将有一组工作要求。它可能很简单,例如桥梁必须能够一次支撑 X 吨,或者具有特定的抗拉强度以允许在风中进行足够的运动等。建筑师将使用其他构建的先验知识来做出这些设计选择。他/她不太可能尝试从头开始解决问题。

软件工程和设计模式完全相同。它们只是常见问题的常见解决方案。如果您知道设计模式,那么当您完成设计时,系统的特定部分需要符合您拥有的设计模式的东西,然后使用它。不要试图让系统适应设计模式,让设计模式适应你的系统(它们适合的地方)。试着将它们视为一组解决方案,以减少您需要做的设计工作量,并小心过度设计您的解决方案以尽可能多地填充设计模式。这只会使您的解决方案无法维护并且可能非常有问题。

于 2011-05-08T06:47:57.590 回答
2

我同意仅仅学习模式是不够的。大多数书籍的问题在于它们没有提供真实世界的例子。我听说 Head First Design Patterns,正如前面一些人所建议的那样,是一个很好的模式。

另一件事是,大多数书籍故意不是特定语言的,这对您来说可能是好事也可能是坏事。总体上理解一个模式无论多么重要,知道如何很好地实现它也同样重要。我遇到过一本名为C# 3.0 Design Patterns的书,它在这两个不可分割的方面投入了几乎相同的墨水。

于 2008-09-17T17:30:59.363 回答
2

当我第一次遇到设计模式时,我也有同样的问题。我很欣赏这些概念,但不知道何时或如何应用它们。我最初的方法是在设计阶段寻找适用性。一旦你有一个框图和每个块的半明确职责,承担职责并用一本像样的参考书交叉引用它们并不难。这里提到了几个不错的,但 GoF 应该在您的列表中。下一步是根据您在模式中看到的内容来寻找设计改进。

于 2008-09-17T17:42:10.600 回答
0

设计模式是关于如何解决常见问题的通用描述。有2点我们需要注意:

首先,它是一个通用描述;它不是具体的解决方案,也不是完整的配方,它只是描述解决方案的外观,以解决常见问题。

其次,问题是问题是一个常见问题:,这意味着这个问题以前已经遇到过很多次,并且随着时间的推移,人们对如何将理想的解决方案应用于这个经常重复的问题进行了描述。

因此,如果您遇到一个不常见的新问题,请尽量不要使用设计模式来解决它,或者至少不要将设计模式作为解决您面临的任何类型问题的工具。

于 2017-10-09T20:10:27.047 回答