01设计模式的本质说到设计模式,就不得不说到重构。2017年,我还是一个工作了3年的菜鸟,重构了公司一个十几年的老系统,累死我了。为了深刻吸取这次重构的教训,写了一篇文章记录这次重构的心得:浅谈重构中踩过的坑——陈树义的博客。时隔三年,重新温习了设计模式的相关知识,这次对设计模式有了更深的理解。那么今天我们就来聊一聊:设计模式的本质是什么?它存在的价值是什么?学习设计模式有什么好处?在这篇文章中,我对设计模式的总结是:设计模式用来承载复杂的业务逻辑,使得编写的代码简洁,易于扩展。简而言之,您需要了解业务中正在发生的变化以及未发生的变化。这些变化的东西是复杂的业务逻辑。你需要思考如何用一个合适的设计模式来承载它,让它在变化的时候,能够有很好的扩展性。这时候,如果你学过设计模式,熟悉各个设计模式的使用场景,那么做起来就会得心应手。有人说,我觉得有些人没学过设计模式,但是他们的代码也写得很好。在这里我想表达我的第二个观点:抽象思维是设计模式的核心。有些人接触过很多项目,不知不觉中在项目中使用了一些设计模式。这些人一般都有一个共同点:抽象总结能力强。他们接触过很多东西,他们会不断思考自己的共同点,然后尝试总结经验。如果你有这种抽象思维,即使没见过设计模式,也能写出类似设计模式的代码。甚至到最后,你都可以想出一个独特的设计模式。到时候,你就有可能成为自己门派的“宗师”。02设计模式的价值对于设计模式,很多人也有很多看法。有人认为设计模式的名字太多了,在实际编程中远没有那么重要。在我看来,设计模式的存在是合理的,至少有以下三个真正的意义。设计模式是经验的积累,方便后来者快速学习。人类之所以能够一代代变强,就是用文字符号来实现经验的传承。在编程领域,我们的设计模式其实就是前人在实战中的经验总结,他们把这些经验总结成设计模式。对于经验不多的人来说,学习设计模式可以给他们一个初步的印象,当他们有了相应的项目经验之后,才能更好的应用。对于项目经验丰富的人来说,设计模式可以丰富他们的项目场景,进一步提高他们对复杂场景的掌控能力。设计模式可以促进交流。有的同学会觉得有些设计模式自己用过,不过前辈给了个名字,也没什么大不了的。但是不知道这位同学有没有想过:为什么要给每个设计模式起一个名字呢?我们的知识可以分为显性知识和隐性知识。显性知识是每个人都能理解的东西。例如,锤子可以用来钉钉子,搜索引擎可以用来搜索知识。无形的知识是指那些我们在做事时所体验到的、我们难以描述的事情。我们这里说的设计模式,其实就是实现时对应的代码结构。但是我们在实战中如何描述这种体验呢?一种最直接的方法是:每次和别人交流的时候,我说:你创建一个接口,然后这个类继承这个接口,然后blabla...可能你已经说了很久了,但是人家还是没明白。就算听懂了,下次还是要唠叨半天,让别人听懂。怎样才能让别人一下子明白我们的意思呢?很简单,给这个代码结构起个名字就行了!这也是为什么会有工厂方法、策略模式、模板模式等名词的原因。当你把这个名字说给别人听,别人就知道是怎么回事了,大大提高了沟通效率!其实,生活中类似的例子还有很多。为什么我们有很多思维模型,比如:SMART模型、PDCA模型?本质上,它们用于帮助记忆和促进交流。想想“搜索引擎”这个词。50年前还不存在,为什么会有搜索引擎这个词呢?不就是为了方便交流,让别人知道是怎么回事吗?假设没有“搜索引擎”这个词,我们要描述百度,怎么描述呢?试一试:你打开一个网页,输入文字,然后挑出一大堆相关信息。这个还是挺麻烦的。想想“五花肉”这个词,可能古代没有这个词吧。那我们怎么描述呢?古人云:就是那种肥一点瘦一点的猪肉。现代人三个字:五花肉!多么高效!03学习设计模式的好处说完了设计模式的本质和意义,最后说说设计模式的好处。提高系统设计能力,代码更简洁,更易扩展。在互联网公司工作过的人都知道,研发过程中最确定的就是变化本身。需求不可能一成不变,唯一不变的就是需求会一直在变化。这对研发人员提出了更高的要求,在设计系统时需要考虑后续的扩展。设计模式本质上是对变化的封装,使用结构化的代码结构来承载变化的需求。当你理解了这一点,你需要做的就是分析系统中变化的部分,然后使用合适的设计模式(代码结构)来实现。只要将变化的部件拆解得很好,那么你就有了一个足够坚固的结构来应对变化的需求。在这个层面上,考验的其实是你对业务的理解,以及你掌握的设计模式的数量。这些会直接决定你能不能提取出变化的部分,提取出变化的部分之后,能不能找到一个合理的设计模式来承载。如果找不到,那么你的“抽象思维”水平决定了你能否自己创造出一个设计模式。设计模式可以帮助阅读源代码和编写框架。我们现在使用的很多框架中都会用到很多设计模式。越是底层的系统,他们越需要抽象,使用的设计模式也就越多。例如:Spring框架中使用了十几种设计模式,包括工厂模式、代理模式、模板模式等等。了解了这些设计模式之后,再去阅读源码,就能更快的理解框架作者的意思。不然看源码??只会像看圣经一样,根本看不懂,还会抱怨代码怎么这么垃圾。设计模式对你的面试很有帮助。这一点可以说是比较功利了,但确实是最实用的一点。工作三年以上的工程师,至少要学一些设计模式。只有掌握了合理的设计模式,才能让你写出的功能更容易扩展。这也是我们这些工作多年的老coder和刚毕业的人的区别。如果你工作几年了,写代码的时候还是从头到尾短小精悍,一点扩展性都没有考虑,那你可能真的很容易被替换掉。在如今的面试中,越来越多地考察面试官的编码能力。掌握设计模式的思维方式,可以帮助你在面试中获得更多的筹码,赢得更高的薪水。04小结设计模式本质上就是用来承载变更的业务逻辑,这样写出来的代码简洁易扩展。它们就像武术中的招式,但具体招式不是目的,抽象思维才是设计模式的核心。一旦你掌握了抽象思维,你也可以设计自己的模式。设计模式是对前人经验的总结,方便后来者快速学习。设计模式和菜名、标签一样,都是对代码结构的描述,方便我们交流。掌握设计模式可以使我们提高系统设计能力,使系统更容易扩展。同时也让我们阅读源码和编写框架事半功倍。本文转载自微信公众号“陈淑仪”,可通过以下二维码关注。转载本文请联系陈淑仪公众号。
