对我的文章和培训课程感兴趣的可以加我微信16230091进行关注。
——————————————————————————————————
今天聊聊我沉淀比较久的一门技术,设计模式。这里是第一篇,算是概论,讲一下我这些年来学习设计模式的心路历程。
(一)
设计模式和数据结构,在日常开发工作中,无论是App还是后端Java开发,都非常实用,是必须要牢牢掌握的两门基本功。
我不是科班出身,所以我第一次接触设计模式,是在05年,也就是工作一年之后,在书店看到讲设计模式的一本书,就买回来从头做了一遍,前几个模式还比较简单,越到后面越看着费劲。
书看了一遍遍,但是在项目中很少使用到,所以能沉淀下来的也就单例、简单工厂、模版方法模式而已。这是第1个阶段:初识。
后来经常在面试中被问的张口结舌,很多模式明明看过,却当场画不出来UML图,以及它背后的深刻思想。于是我开始死记硬背,把23个设计模式的UML图和代码实现,如同背诵乘法口诀一样,牢牢的记在心里。每次面试前一天,躺床上闭上眼睛把设计模式从头在脑子里过一遍,遇到哪个记不清了,就拿出书来看看,然后闭上眼睛继续过,因为是躺床上闭着眼睛,所以经常就睡着了,醒了继续,然后就这么全都背下来了。这是第2个阶段:死记硬背。
后来就开始写博客了。十年来我写了五六百篇文章。写博客分为三层境界,第一层是自己能看懂,几年后也能看懂,这是读书笔记;第二层境界是让读者也能看懂,这是教学贴;第三层是你能讲一些自己独特的心得体会,这是老司机。我从一开始写笔记给自己看,到让更多的人也能看懂,为此参考了大量的技术文章和数据。08年设计模式比较流行的是吕震宇和李会军的文章系列,此外,还有一本书不得不提,《Java与设计模式》,对我的影响都是很大的。这是第3步,把自己的理解讲给别人听。
(二)
世界上最长的路,是什么路?
技术做的杂了,就会发现,原来技术也是讲套路的。十多年编程,我基本都从事UI的工作,从ASP.NET和Win Form,到WPF、Silverlight,从Windows Phone7到Android、iOS,经历了这么多系统,我深深的感受到这些系统在很多地方的实现思想是一样的,都用了相同的设计模式。
比如说页面内控件之间是怎么互相通信的,它们都是借助于一个中介者作为载体,Android中就是Activity,iOS中就是ViewController。我们平常很少去自定义一个中介者模式,但我们每天都在中介者模式下进行工作。
再比如说点击某个区域,系统是怎么响应你的点击操作的。它会一层层往上或往下找,看这块区域内哪个框架能响应你的点击操作,这是典型的职责链模式。
比如说所有系统都有一棵控件树,树上存放的要么是一个具体的控件,要么是一个控件集合。这就是组合模式。想要遍历这棵控件树,就要用到递归算法。
再比如说,在XCode、Android Studio以及微软的Visual Stuido中,有各种各样的菜单和快捷键,点击后都会触发一个行为。这些都是基于命令模式实现的。
再进一步,程序员喜欢使用ctrl+z回退修改前的历史,这样的实现既可以用命令模式实现,也可以用备忘录模式来实现,一共有3种设计方案,取决于后退操作是否可逆,以及你在时间和空间上的取舍。
(三)
转眼已过十年,曾经我也遇到过技术瓶颈。于是我转而去研究烘焙、烹饪、咖啡,随着对这些技艺的掌握,我也发现这其中就蕴含着设计模式的思想。
比如说,炒菜,就是装饰器模式。每次给这盘菜加盐、加糖、加鸡精,都是一种装饰。
再比如说,烘焙分四大类,蛋糕、面包、饼干、挞酥。不管怎么分,都离不开面粉(低筋、高筋)、奶油、黄油、蛋黄、白砂糖这些主要原料,只是搭配不同、比例不同、火候不同而已,这其实就是模版方法模式。当然,这么分类设计,对于也会烘焙的程序员而言,有点粗。面包和饼干的配料和做法还是有很大不同的。
生活中的设计模式比比皆是,这就需要我们去热爱生活、接触生活,才能感受到。这是第4步:从生活中寻找设计模式的影子。
正如设计模式的启蒙之作《建筑的永恒之道》所说,只有踏上了永恒之道(The Timeless Way),才会生机勃勃(alive)。
——————放松一下——————————————————
看过《倚天屠龙记》的,都知道这样一个片段:
金花婆婆:“谢三哥,我这辈子从来没说过谢字。”
——————放松结束——————————————————
(四)
看过上面那个笑话,我们可以轻松回忆起张三丰的太极功夫。还记得他是怎么教张无忌这趟功夫的么?
学会后,要全都忘记——无招胜有招!
对设计模式的学习,最高的境界就是无招胜有招。要把之前刻在脑子里的23个设计模式都忘记。只留下设计模式6大原则就够了:
- 单一职责原则
一个类只做一类事情。为此,我们应该多用类的引用,而不是类的继承。
- 开闭原则
最重要的设计原则。Activity和ViewController动辄几千行代码,又难读懂又难修改,就是因为没有遵守这个原则。最著名的例子,就是把switch语句改为简单工厂。
- 里氏替换原则
其实就是多态。
- 依赖倒置原则
依赖于抽象编程。所以你看到所有的设计模式都有抽象类和接口的存在。
- 接口隔离原则。也就是看人下菜碟。
有多大胃口吃几碗饭。宽窄接口就是基于此,备忘录模式也是基于此。
- 迪米特法则。
也就是不要和陌生人说话。一个类不要引用太多的类。
23个设计模式就是基于这6个设计原则而衍化出来的。所以忘记那些具体的设计模式,给自己的大脑多释放些内存,用来存放更有用的知识。
接下来的公众号文章,我会对上面的内容进行展开,逐一介绍每一个设计原则、每一个设计模式,敬请期待
——————————————————————————————————
最后是一波广告,我现在每天晚上8点在腾讯课堂做Android和iOS技术直播,涉及以下领域:
- Android和iOS组件化拆分
- App性能优化
- App瘦身
- Android插件化
- Android和iOS热修复
- iOS内存管理
- iOS Runtime
- 设计模式
- RxJava
- 注解编程
- AOP
- ReactNative
- Swift
- App自动化测试
- 面试算法题
对我的文章和培训课程感兴趣的同学,可以加我微信16230091进行关注。