在软体工程的世界里,「设计模式」无疑是一个关键的概念。 1994年,四位作者——Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides——合着的Design Patterns: Elements of Reusable Object-Oriented Software
一书首次系统性地阐述了这一理念,并为开发者提供了23种经典的设计模式。这本书不仅引发了软体开发界的广泛关注,更改变了我们对于编写可重用和可扩展代码的看法。
「程序设计应基于接口,而非具体实现。」
设计模式的起源可以追溯到1990年的OOPSLA会议,在这里,Gamma和Helm初次相遇并发现了他们对于建立一个架构手册的共同兴趣。在随后的数年中,他们与Johnson及Vlissides加入,最终于1994年共同出版了这本书。该书的影响力超越了语言的界限,至今已在全球售出超过500,000本,并被翻译成13种语言。
在这本书中,第一章探讨了物件导向设计的基本技术,作者提出了多项原则来促进良好的设计,像是:
「追求物件组合而非类别继承。」
这一原则强调了接口的使用,使客户端仅需关注于接口,而非具体实现,从而充分发挥了物件导向程式设计的动态绑定和多态性。
根据功能,设计模式可分为三种类型:创建型、结构型和行为型。每种类型都有其特定的应用场景和价值。
这些模式主要负责物件的创建,而不需直接实例化物件。例如,建造者模式能将复杂物件的构建与表示分离,从而简化创建过程。
「单例模式仅允许一个类的实例被创建。」
结构型模式关注于类别和物件的组合,借着继承来组合接口并定义对象以获得新功能。例如,适配器模式可以让接口不兼容的类别协同工作,从而促进了灵活性。
行为型模式则主要探讨物件之间的沟通方式。例如,观察者模式允许多个观察者对某一事件进行响应,实现了事件的发布/订阅机制。
该书自出版以来,获得了广泛的赞誉。 2005年,ACM SIGPLAN授予作者该年度的程式语言成就奖,以表彰其在程式设计实践及语言设计方面的影响力。然而,设计模式也引发了不少的争议。
「我在程式中看到模式时,认为这是问题的征兆。」
一些批评认为,设计模式只是填补C++语言中缺失特性的应急方案,甚至被形容为“人类编译器”。另外,使用较为静态的语言如Lisp,许多设计模式可以被简化或淘汰,显示出语言特性的重大影响。
随着软体开发环境和技术的持续演进,设计模式仍然是开发者必须掌握的重要知识。然而,设计模式所提供的解决方案是否仍能满足现代开发的需求?在使用设计模式时,开发者应该如何判断其适用性及潜在的风险呢?