新的设计模式/设计策略

6

我已经学习并实践设计模式几年了,我想知道有哪些新的设计模式(自GOF以来)?此外,像我这样的人应该学习什么(关于软件设计方面)?

注意:我已经使用TDD和UML一段时间了。我对新的范式转变或新的设计模式很感兴趣。

6个回答

4
有大约无限数量的设计模式。设计模式就是程序员用来完成任务的技巧的重复。GoF模式最有用的一点是它们的知名度非常高。因此,它们已经成为了一种语言——这正是GoF所希望实现的目标。
你会在网上和文献中发现许多其他的模式,它们只是“有用的技巧”,并不像GoF模式那样成为你与其他程序员交流时可以使用的一种语言。尽管如此,在过去的十年左右,特别是在Web开发领域,出现了许多模式。请参见Martin Fowler的模式书中列出的模式。

我不会说设计模式只是“技巧的重复”。我认为其中涉及的远不止这些。创建一个好的设计需要前瞻性思考和对系统如何运作、如何发展、哪里需要灵活性以及哪里不需要的理解。程序员使用许多技巧来简化他们的工作,但这些技巧并不一定是对系统设计的前瞻性思考。其他人可能有不同看法,但当我听到“技巧”时,我想到的是“捷径”,而不是坚实的软件设计。 - JasCav
@Jason 这与设计模式有什么关系?当你解决一个设计问题,然后使用相同的解决方案思路来解决其他相同的问题时,你就使用了设计模式。这不是在推广计划,而是对解决设计问题的一种思路的重复利用。使用设计模式需要经验,如果出于宗教观点而使用设计模式,你将会失败。你不必使用设计模式来做正确的事情,很多时候你甚至没有注意到自己在使用设计模式。 - wilhelmtell
我之所以说出我的话,是因为你表述回答的方式。说设计模式只是“技巧”,而GoF之所以有用仅仅是因为他们变得出名了,这完全忽略了一个好的设计需要规划和理解如何建立设计,并理解为什么要使用设计的事实。当然,我可以意外地偶然发现一个好的设计,就像建筑师可以意外地发现一个适合建筑物的良好结构一样。但这并不意味着软件或建筑物被很好地设计了。设计模式不仅仅是“技巧”。 - JasCav

2
我是PCMEF(现在是PCBMER)框架的忠实追随者和支持者。
这里有一个更简单的概述(点击查看)
该框架将多个设计模式(Presentation、Control、Mediator、Entity 和 Resource)组合在一起,以便更好地理解和管理庞大而复杂的企业系统。即使是最复杂的系统,也能变得易于理解和管理。

有趣..我得去看看它。 - monksy

2

我发现特别有用的新技术之一是领域驱动设计(Domain Driven Design)。它不仅是一种模式,更是一种思维方式——集中关注领域对象,即你建模并构建应用程序的事物。

我发现它赋予了我们之前都知道但懒得处理的原则以意义,例如单一职责原则和关注点分离。尤其是对这两个原则,我现在更加认真对待。

另一个提高我的方面是测试驱动开发(TDD)和依赖注入。我发现通过大量接口和实现类来释放只定义一次的恐惧。这并不意味着与DRY(不要重复自己)相冲突。如果两个类的目的不同,则拥有相同属性也是可以的。封装和单一职责原则比只定义一次属性更为重要。


这就是我一直在看的东西。从OMG得出的东西中,我发现与GOF相比没有太多变化。 - monksy
DDD不是一种设计模式。它是一种与客户管理风格相结合的架构风格。 - George Mauer

2

嗯...人们提到的所有东西都不是设计模式。

GOF书是隐含着Java的思想写的,它很好地探索了这个领域。然而,一旦你进入其他语言,有些模式就不再必要了(在支持事件的语言如C#中,Observer几乎不使用),并且会出现一些新模式。拿起Pro JavaScript Design PatternsDesign Patterns In Ruby这些书,看看这些非常不同的范例中所使用的基本模式发生了什么变化吧。

我最近最喜欢的是依赖于现代语言的函数漂移。我非常喜欢嵌套闭包和用函数式方法解决GoF处理的问题的方式(再次参见Ruby书的优秀示例)。我还深深爱上了内部领域特定语言的概念,这开启了一系列自己的设计模式(包括嵌套闭包)。此外,事件聚合似乎即将在.Net世界中大放异彩。

还有一些其他重要的模式出现了,但在GOF中没有被讨论,可能是因为它们比那些家伙所追求的更高级,比如控制反转容器、消息总线、面向方面的编程、模型-视图-控制器、模型-视图-展示器、模型-视图-视图模型等等。

顺便说一句,这些不是设计模式,但如果你想超越TDD,请开始研究行为驱动开发和上下文/规范。


1
+1:GoF模式就像是面向Java的,不同的语言有不同的习惯用法。 - Paul Nathan
1
我对你关于在C#中Observer很少使用的评论感到惊讶。它已经被纳入语言中(“event”类型),并且具有使用+=运算符向事件添加多个订阅者的能力。.NET框架提供了属性和集合更改通知的接口定义;这些对于WPF和Silverlight中的数据绑定至关重要。如果“Observer”模式没有被频繁提及,那是因为它已经成为核心概念。 - Cylon Cat
@Cyclon 这正是我的观点。需要使用可观察对象,但 GoF 中提出的实现方式很少被使用(我还没有看过 IObservableCollection,但它可能会做类似的事情),已经被语言特性所取代。 - George Mauer

2
我很惊讶地发现还没有人提到马丁·福勒的书 《企业应用架构模式》。这是一本非常优秀的书,其中介绍了几十个模式,其中许多被用于现代 ORM 设计(仓储库、活动记录),以及一些 UI 层模式。强烈推荐。

再次强调,这些并不是真正的设计模式,它们是架构模式。类似,但更高层次。 - George Mauer

1

从维护方面来看,DVCS的使用是一个巨大的变化。如果你不知道什么是DVCS或者没有使用过,我强烈建议阅读以下这两个主流工具:

Mercurial (hg): https://www.mercurial-scm.org/
git : http://git-scm.com/

它们已经在改变常见编程环境的工作流程。虽然不是一种模式/设计,但我认为TDD或UML在某种程度上也不是技术模式/设计。也许更像是围绕编程的常见实践。


1
我不认为VC相关技术会对工作流程产生很大的改变。但我确实考虑过TDD和UML,因为它们可以改变你解决问题和设计的方法。 - monksy
2
-1,与设计模式无关。 - harto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接