一切都源自於 Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides("Gang of Four", GOF, 四人帮)於 1994 年出版的书:「Design Patterns: Elements of Reusable Object-Oriented Software」,书中讨论:
描述对特定问题精简优雅的解决方案,关於追求更高的软件再利用性与弹性,以简明易用的形式表达。
短短几行到尽 Design Patterns 的功能。
在书中,作者提及受到建筑家 Christopher Alexander 的 A Pattern Language 启发,想要捕抓既有系统运用的模式,将其抽丝剥茧後,将每个情境下需要的模式记录下来。透过学习这些模式,人们可以更容易地在设计复杂的程序时,避免让系统走向不容易维护、扩充的局面,毕竟,在软件的世界里「变动」才是常态,不易扩充将耗费更多的时间好同时满足新、旧需求。
我个人的理解,学习模式後理解在不同情境下,如何设计出具有着优点的程序,同时,能够缩小缺点的影响,换句话说,试着从大局观思考程序在完成时的「样貌」,什麽才是好的结果?试着将这套想法运用在建筑学,那冷气发明前,各地区的房子因为气候的不同在设计上有不同的巧思,就是因应不同情境下完成的样貌。
书中的范例主要使用 C++
,部分段落使用 Smalltalk
。这时我产生了一个疑惑,为什麽要使用 Smalltalk
?以现在的眼光来看,使用 Java
或是 C#
来学习物件导向会是更舒服的选择。
所以有必要了解书本出版时,目前主流语言的情况。
C++
Java
Java
诞生於1995年5月23日。C#
C#
诞生於2000年。JavaScript
Java
诞生於1995年12月4日。Python
Ruby
Ruby
诞生於1995年12月。从上面的清单,可以明白当时最稳定、具有生产力的物件导向语言,非 C++
莫属。
随着时代演进,部分模式的概念、实作将会出现在语言的新标准内,当人们需要使用相关模式时,不用自己制作轮子,直接使用内建的函式或类别即可。最经典的便是 Iterator 模式,Java
已经有相似概念的内建类别(Collection
与 Iterator
)。
另一点是语言会发布新的标准,修补当下语言的缺陷。 C++
已经经历六次的改版,与 1994 年的 C++
差很多,有些作法肯定与当时 C++
的缺陷有关。最新版本的语言是否要完全运用呢?个人持保留态度。
启发自一篇优文:设计模式其实是程序语言的缺陷?。
不要僵化地使用 Design Patterns 固有的解法,而是理解需求,在使用设计模式时,一并考虑程序语言的特性因事制宜。
对於这段深感认同,1994 年出版的书籍,肯定有一些语言限制导致开发上必须要使用特定的解来避开。假如使用不同的语言,一定要好好理解语言的特性,了解差异後,再试着将 Design Patterns 的精神表现出来。
拿网路游戏的经验,不同的武器有专属的熟练度,该武器熟练度不够的话,攻击、使用招式时可能出现失误。唯有提高熟练度才能百分之百地使用该招式。
对於特定的系统,开发出应对各种情况的处理手段。例如 Concurrency pattern 便是用来处理多执行绪的各种情况。
三大类、共 23 种模式:
之後将依序介绍各种模式。
<<: 从 IT 技术面细说 Search Console 的 27 组数字 KPI (18) :结构化资料(其他)
写在前面 placeholder for test placeholder for test pla...
去年宝哥在 Modern WEB 中介绍过 Angular 有时会发生版本不相容的 issue , ...
教材网址 https://coding104.blogspot.com/2021/06/java-o...
这次想要介绍的部分是 Audio message,它跟 Image message 一样可以透过li...
前言 大部分介绍Reactive Programming都一定会提到Backpressure,可能放...