在1994年,Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides所著的《Design Patterns: Elements of Reusable Object-Oriented Software》一书,成为了软体工程领域的里程碑。该书不仅介绍了软体设计模式的主要概念,还深入讨论了物件导向程式设计的优势与挑战,并且为软体开发者提供了23种经典的设计模式作为参考。
「程式要依赖介面,而非实作。」
在这本书中,作者强调了介面的重要性,指出设计者应优先考量介面而不是具体的实作。他们认为这样可扩展性更高,使得客户端能够使用不同的实作,只要它们遵循相同的介面。这种方法促进了动态绑定和多态性,并且是物件导向程式设计的核心特征之一。
除了介面之外,作者也提到继承与聚合的概念,提出「白箱重用」与「黑箱重用」的区别。白箱重用指的是子类别能够访问父类别的详细资讯,这可能会损害封装的完整性,反之,黑箱重用则透过清晰的介面来隐藏实作细节,增加了模组之间的独立性。
「继承使得子类别暴露于父类别的实作细节中,因此常被指责为打破了封装。」
这本书同时也是四位作者在1990年于OOPSLA会议上的一次想法交流中开始酝酿的。随着时间的推移,这个想法逐渐演变成为我们如今所熟知的设计模式,并且在全球销售超过500,000本,证明了其对软体工程的巨大影响。
根据功能不同,这23种设计模式可以被归类为创建型、结构型和行为型三大类型。
创建型模式主要负责对象的创建,能使程式在确定具体类别之前,保持更大的弹性。这些模式包括:抽象工厂模式、建造者模式、工厂方法模式、原型模式和单例模式。
结构型模式主要关注类别和对象的组合,这些模式定义了如何组合对象以获得新的功能。包括:适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式和代理模式。
行为型模式则关注对象之间的通信与协作。这些模式包括:责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式和访问者模式。
「设计模式是为了解决在面对复杂软体时可能遇到的共同问题。」
自出版以来,这本书对于软体开发社群的影响不容忽视,使得许多开发者在进行软体设计时能参考这些模式以提升程式的可读性和可维护性。然而,它们也受到一些批评,认为这些模式只是弥补C++等语言缺失特性的权宜之计,并且会使得程式码变得更加冗长。
例如,知名程式设计师Paul Graham曾表示,看到程式中的模式会让他感到困扰,因为他认为程式的结构应该只反映解决问题的需求,而不应包含任何额外的规律性。相对的,Peter Norvig则指出,许多设计模式在其他编程语言中可以通过语言自身的特性得到简化或完全消除。
即便存在争议,设计模式仍然是当今软体设计的重要凭借。不少开发者在设计软体架构时持续参考这些理论,寻求更有效率的解决方案。这本书也为许多后续的研究和书籍打开了思路。
在2005年,这四位作者获得了ACM SIGPLAN颁发的年度程式语言成就奖,以表彰他们的工作对程式设计和程式语言设计的深远影响。他们也于2005年进行过讨论,评估如果重新编排此书会有何改变,这使得设计模式的后续发展更加受到广泛关注。
设计模式的出现对于今日的软体开发有多大的影响?