App设计模式纵横谈(1)

      对我的文章和培训课程感兴趣的可以加我微信16230091进行关注。

——————————————————————————————————

      今天聊聊我沉淀比较久的一门技术,设计模式。这里是第一篇,算是概论,讲一下我这些年来学习设计模式的心路历程。

      (一)

     设计模式和数据结构,在日常开发工作中,无论是App还是后端Java开发,都非常实用,是必须要牢牢掌握的两门基本功。

     我不是科班出身,所以我第一次接触设计模式,是在05年,也就是工作一年之后,在书店看到讲设计模式的一本书,就买回来从头做了一遍,前几个模式还比较简单,越到后面越看着费劲。

     书看了一遍遍,但是在项目中很少使用到,所以能沉淀下来的也就单例、简单工厂、模版方法模式而已。这是第1个阶段:初识。

     后来经常在面试中被问的张口结舌,很多模式明明看过,却当场画不出来UML图,以及它背后的深刻思想。于是我开始死记硬背,把23个设计模式的UML图和代码实现,如同背诵乘法口诀一样,牢牢的记在心里。每次面试前一天,躺床上闭上眼睛把设计模式从头在脑子里过一遍,遇到哪个记不清了,就拿出书来看看,然后闭上眼睛继续过,因为是躺床上闭着眼睛,所以经常就睡着了,醒了继续,然后就这么全都背下来了。这是第2个阶段:死记硬背。

     后来就开始写博客了。十年来我写了五六百篇文章。写博客分为三层境界,第一层是自己能看懂,几年后也能看懂,这是读书笔记;第二层境界是让读者也能看懂,这是教学贴;第三层是你能讲一些自己独特的心得体会,这是老司机。我从一开始写笔记给自己看,到让更多的人也能看懂,为此参考了大量的技术文章和数据。08年设计模式比较流行的是吕震宇和李会军的文章系列,此外,还有一本书不得不提,《Java与设计模式》,对我的影响都是很大的。这是第3步,把自己的理解讲给别人听。

 

     (二)

     世界上最长的路,是什么路?

     {7A52F6CD-F768-941B-405F-A122641EC3DC}

     技术做的杂了,就会发现,原来技术也是讲套路的。十多年编程,我基本都从事UI的工作,从ASP.NET和Win Form,到WPF、Silverlight,从Windows Phone7到Android、iOS,经历了这么多系统,我深深的感受到这些系统在很多地方的实现思想是一样的,都用了相同的设计模式。

     比如说页面内控件之间是怎么互相通信的,它们都是借助于一个中介者作为载体,Android中就是Activity,iOS中就是ViewController。我们平常很少去自定义一个中介者模式,但我们每天都在中介者模式下进行工作。

     {5E9CC89A-2756-2EE7-A84D-D78A09437E28}

     再比如说点击某个区域,系统是怎么响应你的点击操作的。它会一层层往上或往下找,看这块区域内哪个框架能响应你的点击操作,这是典型的职责链模式。

     clip_image006

     比如说所有系统都有一棵控件树,树上存放的要么是一个具体的控件,要么是一个控件集合。这就是组合模式。想要遍历这棵控件树,就要用到递归算法。

     clip_image008

     再比如说,在XCode、Android Studio以及微软的Visual Stuido中,有各种各样的菜单和快捷键,点击后都会触发一个行为。这些都是基于命令模式实现的。

     clip_image009

     再进一步,程序员喜欢使用ctrl+z回退修改前的历史,这样的实现既可以用命令模式实现,也可以用备忘录模式来实现,一共有3种设计方案,取决于后退操作是否可逆,以及你在时间和空间上的取舍。

     {F569D423-5818-B416-718A-04172D7ADE77}

 

     (三)

     转眼已过十年,曾经我也遇到过技术瓶颈。于是我转而去研究烘焙、烹饪、咖啡,随着对这些技艺的掌握,我也发现这其中就蕴含着设计模式的思想。

     比如说,炒菜,就是装饰器模式。每次给这盘菜加盐、加糖、加鸡精,都是一种装饰。

     clip_image013

     再比如说,烘焙分四大类,蛋糕、面包、饼干、挞酥。不管怎么分,都离不开面粉(低筋、高筋)、奶油、黄油、蛋黄、白砂糖这些主要原料,只是搭配不同、比例不同、火候不同而已,这其实就是模版方法模式。当然,这么分类设计,对于也会烘焙的程序员而言,有点粗。面包和饼干的配料和做法还是有很大不同的。

     生活中的设计模式比比皆是,这就需要我们去热爱生活、接触生活,才能感受到。这是第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进行关注。

posted @ 2017-05-01 14:41 包建强 阅读(...) 评论(...) 编辑 收藏