对我的文章和培训课程感兴趣的可以加我微信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进行关注。

App设计模式纵横谈(1)的更多相关文章

  1. 面向对象设计模式纵横谈:Singelton单件模式(笔记记录)

       李建忠老师讲的<面向对象设计模式纵横谈>,早就看过了,现在有了时间重新整理一下,以前的博客[赛迪网]没有了,现在搬到博客园,重新过一遍,也便于以后浏览. 设计模式从不同的角度分类会得 ...

  2. 面向对象设计模式纵横谈:Abstract Factory 抽象工厂模式(笔记记录)

         今天是设计模式的第二讲,抽象工厂的设计模式,我们还是延续老办法,一步一步的.演变的来讲,先来看看一个对象创建的问题. 1.如何创建一个对象 常规的对象创建方法: 这样的创建对象没有任何问题, ...

  3. C#面向对象设计模式纵横谈——6.Prototype 原型模式(创建型模式)

    动机(Motivation) 在软件系统中,经常面临着“某些结构复杂的对象”的创建工作.由于需求的变化,这些对象经常面临着剧烈的变化,但他们却拥有比较稳定一致的接口. 如何应对这种变化?如何向“客户程 ...

  4. C#面向对象设计模式纵横谈——5.Factory Method 工厂方法模式(创建型模式)

    动机 (Motivation) 在软件系统中,经常面临着“某个对象”的创建工作; 由于需求的变化,这个对象经常面临着剧烈的变化,但是它却拥有比较稳定的接口. 如何应对这种变化?如何提供一种“封装机制” ...

  5. C#面向对象设计模式纵横谈——4.Builder 生成器模式(创建型模式)

    动机 (Motivation) 在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成:由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是它们组合 ...

  6. C#面向对象设计模式纵横谈——3.Abstract Factory 抽象工厂(创建型模式)

    动机(Motivation) 在软件系统中经常面临着“一系列相互依赖的对象”的创建工作,同时,由于需求变化,往往存在更多系列对象的创建工作.如何应对这种变化?如何绕过常规对象的创建,提供一种“封装机制 ...

  7. C#面向对象设计模式纵横谈——2.Singleton 单件(创建型模式)

    一:模式分类 从目的来看: 创建型(Creational)模式:负责对象创建. 结构型(Structural)模式:处理类与对象间的组合. 行为型(Behavioral)模式:类与对象交互中的职责分配 ...

  8. C#面向对象设计模式纵横谈——1.面向对象设计模式与原则

    一:设计模式简介 每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心. ---- Christopher Alexander 软件设计领域设计模式: 设计模式描述了软件设计过 ...

  9. 面向对象设计模式纵横谈:Bridge 桥接模式(笔记记录)

    桥接模式是一个比较难理解的设计模式,设计和分析的时候也不容易把握,咱们听听“李建忠”老师是怎么来讲的.我们还是从演变的角度来说问题,一步一步的来把问题说清楚.先谈谈“抽象”和“实现”的关系. 抽象与实 ...

随机推荐

  1. Django Forms 表单

    环境 python 3.7 服务端  views.py from django import forms # 引入 froms 模块 from django.forms import widgets ...

  2. <记录> PHP监控进程状态,完成掉线自动重启

    1. 利用Shell脚本实现 #!/bin/bash PORT= while [ true ];do read -p "please enter the port that you want ...

  3. 使用idea生成maven项目的jar包(转)

    第一步  第二步  第三步 转自:https://blog.csdn.net/waterimelon/article/details/69243651

  4. html5移动端查找

    用form包裹住input,修改input的类型为seach,然后给input绑定seach事件,当输入状态是输入键盘上会出现搜索,点击搜索就可以查找了 <form action="& ...

  5. 使用pandas进行数据预处理01

    数据预处理有四种技术:数据合并,数据清洗,数据标准化,以及数据转换. 数据合并技术:(1)横向或纵向堆叠合数据 (2)主键合并数据 (3)重叠合并数据 1.堆叠合并数据: 堆叠就是简单的把两个表拼接在 ...

  6. Linux shell read 解析

    read是一个重要的bash命令,它用于从键盘或标准输入中读取文本,我们可以用read以交互的方式读取来自用户的输入,不过read能做的可远不止这些,当从键盘读取用户输入的时候,只有按下回车键才标志输 ...

  7. python的魔术方法

    什么叫魔术方法: 在python中定义以双下划线开头,有一些python自定义的函数,并且以双下划线为结尾的函数叫做魔法函数 class Company(object): def __init__(s ...

  8. swift 监测内存泄漏 MLeaksFinder

    使用MLeaksFinder检测项目内存泄露总结 https://www.cnblogs.com/ocarol/p/5288497.html

  9. Eclipse常用快捷键(用到想到随时更新)

    原始链接:https://jingyan.baidu.com/article/fedf073771323235ac8977f1.html Shift+Enter在当前行的下一行插入空行(这时鼠标可以在 ...

  10. Linux的php-fpm优化心得-php-fpm进程占用内存大和不释放内存问题(转)

    原文地址:https://wzfou.com/php-fpm/ 最近发现博客的内存老是隔三差五地被“吃掉”了,登录到后台后偶尔会出卡顿的情况,一开始怀疑是Swap不够导致的,于是给VPS主机增加了几个 ...