白话“设计模式”

作者:木羊同学

来源:华章计算机(hzbook_jsj)

设计模式是学不懂的玄学?

设计模式给人的第一感觉,总是很高冷。我还清楚记得,十几年前第一次上设计模式的课,老师一脸讳莫如深地站上讲台,环视了遍坐在下面满脸期待的我们,说:今天开始我们学设计模式。设计模式非常重要,也很特别,和其他专业课不太一样,刚开始大家可能不知道这门课在讲什么,别担心,这很正常。到了期末,大家可能照样不知道这门课在讲什么。末了老师还意犹未尽,来了一句总结:设计模式,学了也不会懂,懂了也不会知道有啥用。

这句话是我对设计模式的第一印象,相信也是很多人对设计模式的第一印象。老师当然并不是故意打击我们的学习积极性,或者搞神秘主义,他一再解释说,只有积累了一定的项目经验,才能真正明白什么是设计模式。所以,在老师看来,在座的各位连新手上路都算不上,自然不可能学明白设计模式。

我一直在思考老师说的话,想要真正精通设计模式,项目经验当然多多益善,不过,设计模式真的是一门讲求缘分的学问?非得练习时长突破某一个临界点,才像天灵盖突然被打开一样,发现说:哇,设计模式真的很有用?

设计模式真的这么玄学?我的答案是:未必,这里面可能有什么误会。要解开这个误会,就要从什么是设计模式说起了。

1

《设计模式》与GoF

提到设计模式,就不能不提GoF。世上本没有设计模式,GoF写了一本书,这才有了设计模式。GoF不是人名,是Gang of Four的首字母缩写,没什么其他的深意,就表示这是四个人的团体组合,和F4是一个意思。

GoF可能知道的人不算太多,是一个软件工程研究小组,只有学过设计模式才会有所了解。那么,这四人男团干了什么够得上考点的事呢?前面说了,写了一本书,书名叫《设计模式:可复用面向对象软件的基础》。书名太长,下面我就简称《设计模式》。

这本书不得了,非常厉害,厉害到什么程度?你去查设计模式有多少种,无论你查的是什么书、什么版本,答案一定是23种。设计模式只有23种吗?当然不是,所以很多新出的书提到设计模式,都会加一句“除了23种设计模式以外还有其他模式”。那为什么非定“23”这个在篮球历史具有非凡意义的数字呢?就是因为这本《设计模式》,书里就列了23种设计模式,所以设计模式的标准答案就是“23”。

现在很多书都爱自称是XX领域的圣经,在我来看,绝大部分名不符实,但将《设计模式》称为设计模式领域的圣经,倒是恰到好处。几乎所有设计模式的教材书籍,内容都是源自《设计模式》,而目前在设计模式领域,《设计模式》仍然是最为经典的一本书。

我本来想写,GoF的《设计模式》一举开创了“设计模式”这个新的软件工程研究领域,很多介绍设计模式的文献也确实采用了这种说法。但是,GoF很谦虚,在书的第六部分专门介绍了设计模式的发展史,说除了GoF以外,还有不少研究小组进行类似的课题,也早在《设计模式》出版以前,就发表了一些有用的成果。但是,GoF的《设计模式》毫无疑问是一本具有里程碑意义的书,在此之前,人们不是完全不知道设计模式,而是都把它当作是其他什么工作的一个子环节,正是《设计模式》这本书,设计模式才真正成为了一个独立而完整的研究领域。也正是《设计模式》,世上从此多了“设计模式”这个专有名词。

2

什么是设计模式

设计模式的背景就介绍到这里,“什么是设计模式”这个问题,才是本文,以及想要学习设计模式的第一块硬骨头。

这个问题不好回答。照一般的说法是,《设计模式》书里以“XX模式”为名,一共列举了23种设计模式。教授设计模式的课程和书本,最常见的方式就是逐一介绍这23种设计模式。你要问设计模式是什么?就是这23种设计模式。

好像说了挺多,但是,回答了问题没有呢?好像又没有。我问的是什么是设计模式,你告诉我这23种模式就是设计模式,有一种循环论证的感觉在里面。

如果再问得细一点,究竟设计模式有什么特别的地方,值得我们花时间去学校呢?你可以说,设计模式是从很多很多的软件设计经验中提取的精华。

当然,这个回答也可以更专业一点。

听到开发软件,大多数人的第一反应也许就是撸代码,其实,撸代码前面有一个更重要的环节,叫软件设计,和盖房子之前要先设计蓝图一个意思。房子好不好,谁住谁知道。同样,软件设计也是有一个好坏的衡量标准的,可复用(Reusable)就是软件设计中一条很重要的标准。

那么,怎么设计出可复用的软件呢?大家一定已经猜到了答案:按照设计模式来设计

第二个回答比第一个好很多,基本上设计模式的教材,包括《设计模式》,都是按第二种来回答“什么是设计模式”这个问题。看完这个回答以后,大家应该也已经有了一种“我好像快想通一点什么”的感觉,但是,又总感觉差了点什么。

差了点什么呢?我想,问题还是出在答案身上。第二个答案还是回避了什么是设计模式这个根本问题,只是说明白了设计模式在软件开发中所扮演的角色十分重要。这就有点像你问这是什么药,我说这是好药,吃完包好。对于病人来说,这个答案的信息量足够了,但对于医生或者药理研究者来说,最根本的问题还是没有回答。所以,设计模式总给人一种懂了就都懂,不懂就都不懂的印象,原因我想就在于此。

说了这么多,那设计模式究竟是什么呢?

教材都有偶像包袱,怕说得不对,就算对了也怕显得没有深度被人笑话。教材都不愿说,那好,这里我和大家分享我自己的理解。我的回答很简单,就两个字:套路。23种设计模式,说白了就是23种设计套路,遇到相关设计需求,只要使用对应的设计套路,就能得到最佳的设计效果。这就是设计模式。

千万别小看套路,套路很重要。哲人有云:自古深情留不住,总是套路得人心。这句话说了什么?说了一个很残酷的现实。我们总是单纯地以为,自己很努力很用心,就能得到很好的回报,同样,想要得到很好的回报,就得首先很努力很用心。但现实是不是这样呢?往往不是,现实很残酷,只看结果,只要结果对了回报就会好,并不在乎这个结果你是靠努力达到的,还是纯粹的运气好。

那套路有什么优点呢?那就是解决问题的效率极高。玩游戏的同学应该有过类似的经历,有一些关卡自己可能花了好长时间尝试了各种方法也没法通过,都有一种走投无路的感觉了,但上网查了攻略以后,几分钟就解决了问题,又觉得简单得难以置信。

这个教训在软件设计上尤为深刻,我们三天三夜不眠不休掉了很多头发想出来的一套原创方案,最终效果可能远不如一套早就摆在眼前的现成方案。既然是这样,那为什么我们不总结经验,把前人实践效果好的设计方法都收集到一起,整理成一本字典,然后我们随用随查,不但简单方便,而且效果还好?

没错,这就是设计模式的初衷。GoF对软件设计的大量优先案例进行了分析研究,将好的做法浓缩成精华,就是这23种设计模式。为什么《设计模式》这么经典?不单只是因为GoF真的把这件事做成了,而且《设计模式》出版于1994年,经过16年的实战检验,这23种设计模式表现始终非常优秀。我们作为后来者完全可以站在巨人的肩膀上,只需要按图索骥即可以交出优秀的软件设计方案,软件设计这份工作对睡眠和头发也就友好多了。

3

怎样学习设计模式

讲清楚了什么是设计模式,怎样学习设计模式思路就清晰多了。还记得我们老师的那句话吗,说设计模式,学了也不会懂,懂了也不会知道有啥用。现在回头看,这话说得对不对呢?不完全错,当然也不完全对。

首先,设计模式并不难学。设计模式不是抽象的思想,而是非常具体的实施方案,不需要额外掌握太多艰涩的术语,反而更像是我们前面所说游戏过关攻略,只要当作说明书按照着做就可以了。要知道,知道为什么这样做,以及知道要怎么做,是两个完全不同的学习难度。

其次,设计模式并不难用。《设计模式》出版于1994年,在当时来看,也许都是很新的东西。但时间毕竟已经过去了17年,一些模式已经作为编程语言的某些特性,直接提供给用户使用。

迭代器就是一个典型的例子。在《设计模式》一书里,迭代器分在行为型模式的大类下,书里花了13页的篇幅介绍迭代器,譬如介绍迭代器的(设计)意图是“提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示”。现在呢?迭代器太常用,现在很多语言都提供有迭代器,简直随处可见,以致很多用过迭代器的同学根本没有意识到,这居然也是一种设计模式。

最后,我要说,老师当然也有说对的地方。设计模式是业内公认的好东西,但是,如果你没有软件设计的经验,并不了解软件设计都有哪些困难和问题,那你就很难体会设计模式有什么用,好在哪里。这就好比你把一本千辛万苦总结出来的《百分百吃鸡攻略》,交给一位只玩农药的同学,他当然也不会知道你的这本攻略有什么用,好在哪里,结论正如老师所说的,学了也不会懂,懂了也不会知道有啥用。

那怎么办呢,难不成非要有被软件项目毒打的经验以后才能来学设计模式?学习的门槛未免太高了吧?

客观上这确实存在矛盾 。我的意见是,要学习设计模式,这本日久弥新的《设计模式》肯定首先得读一遍,怎么读也有技巧,既然是解决方案,那当然尽可能地记住要解决的都是什么问题,用在什么场景。然后,学以致用,实践实践还是实践,遇到的问题越多,对设计模式的理解越深刻,某个模式很可能当时读毫无感觉,过后很久遇到某个问题想起来之后,才发现这真是干得漂亮。

 

 

作者简介:

莫凡,网名木羊同学。娱乐向机器学习解说选手,《机器学习算法的数学解析与Python实现》作者,前沿技术发展观潮者,擅长高冷技术的“白菜化”解说,微信公众号“睡前机器学习”,个人知乎号“木羊”。

 

扫码关注作者

4

推荐阅读

《设计模式:可复用面向对象软件的基础(典藏版) 

作者:[美] 埃里克·伽玛(Erich Gamma)

理查德·赫尔姆(Richard Helm)

拉尔夫·约翰逊(Ralph Johnson)

约翰·威利斯迪斯(John Vlissides)

推荐语:本书是引导读者走出软件设计迷宫的指路明灯,凝聚了软件开发界几十年的设计经验。四位顶尖的面向对象领域专家精心选取了颇具价值的设计实践,加以分类整理和命名,并用简洁而易于复用的形式表达出来。本书已经成为面向对象技术人员的圣经和词典,书中定义的23个模式逐渐成为开发界技术交流所必备的基础知识和词汇。

更多精彩回顾

书讯 | 12月书讯 | 年末上新,好书不断

书单 | 机器人时代已来!推荐几本机器人学硬核好书

干货 | 电商数据分析的方法、流程及场景

收藏 | Python条件判断语句详解:if、else、switch都有了

上新 | 这本书把数字化转型和中台的道理都讲清了

点击阅读全文了解更多数字化转型好书

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值