你怎么知道何时使用设计模式?

时间:2008-09-17 16:53:05

标签: design-patterns oop

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

换句话说,模式是否有模式?

14 个答案:

答案 0 :(得分:38)

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

Head First Design Patterns

我还要补充一点,不要试图设计过多的图案。更多,寻找模式可能有助于解决的“代码味道”。

答案 1 :(得分:36)

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

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

答案 2 :(得分:12)

大多数人都没有理解的基本模式的核心概念。不要将它们视为数据结构或算法。

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

您组织“人员”的方式以及他们用来向对方发​​送消息的模式是模式。

答案 3 :(得分:11)

把问题翻过来:你应该做的模式是“什么模式适合我的问题”。考虑一个非常简单的模式,在数组中查找元素。在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 ;
    }
}

你不看代码并想“我在哪里可以使用它”,你看问题并说“我知道如何在数组中找到一个元素吗?”

更广泛的模式确实以同样的方式工作。您需要拥有许多不经常更改的数据结构副本 - 这会让您想到“Flyweight”。你想要一些生活在网络边界两端的东西,你认为是代理。

当你研究模式,特别是GoF时,问问自己“这种模式需要什么样的情况?我之前看过这种模式吗?我以前的工作中有什么用呢?我在哪里能找到这样的例子?自己的生活?“

答案 4 :(得分:7)

设计模式?你正沉浸其中!

设计模式没什么特别之处,它们只是设计模式。所有开发都使用设计模式。在面向对象的编程中存在一组特定的设计模式,这些模式被认为是通常期望的并且已经成为规范的设计模式。但是也存在许多不受欢迎的或其他无关紧要的设计模式(例如design anti-patterns)以及未发现和/或未记录的模式。

编程时无法避免使用模式。但是你可以更加了解你正在使用的模式,以及某些模式何时有用以及何时不可用。研究GoF book中的规范设计模式将有助于学习code smells and refactoring。对于何时应该使用特定的设计或设计模式,没有一个正确的答案,您需要积累使用和实现它们的经验,以便知道何时何地使用哪种模式。

答案 5 :(得分:6)

体验。了解其用途的模式和实际示例。每当您做出设计决策时,请考虑您知道的模式是否适用于它。随着时间的推移,您会变得更好,并且您会发现将模式应用于更广泛问题的新方法。

答案 6 :(得分:4)

我找到的另一本好书是:

重构模式

通过显示何时,何地以及如何将现有代码更改为模式,它使我对这些概念有了更好的理解,并能够识别它们的使用位置。

答案 7 :(得分:4)

Rian van der Merwe在2012年6月为Smashing Magazine写了一篇excellent article。这里有一些重要的要点。

设计模式有两个原因:

  1. 模式可以节省时间,因为我们不必解决已经解决的问题。
  2. 模式使Web更易于使用,因为随着设计人员的采用增加,用户会习惯于工作方式,这反过来会降低他们在遇到常见设计元素时的认知负担。
  3. van der Merwe建议我们在以下情况下考虑打破模式:

    1. 新方式凭经验提高可用性,或
    2. 既定的方式已经过时了。

答案 8 :(得分:3)

你是如何知道何时使用if语句的?

我把它比作它,因为它是一个更大的结构,你需要知道它的来龙去脉才能有效地使用它。 if语句解决了一类需要分支的问题。桥模式解决了一类问题。我真的不会以不同的方式看待它们。

答案 9 :(得分:3)

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

答案 10 :(得分:2)

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

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

答案 11 :(得分:2)

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

答案 12 :(得分:2)

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

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

答案 13 :(得分:0)

设计模式是关于如何解决 常见问题 通用描述 。我们应该注意两件事:

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

第二,问题是问题是 常见问题: ,这意味着此问题之前已经多次遇到过,并且随着时间的推移,人们开始描述如何理想的解决方案可以应用于这个通常重复的问题。

所以,如果您遇到一个不常见的新问题,请尽量不要使用设计模式来解决它,或者至少不要让设计模式成为您解决问题的工具你遇到的那种问题。