App设计模式纵横谈(1)
对我的文章和培训课程感兴趣的可以加我微信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)的更多相关文章
- 面向对象设计模式纵横谈:Singelton单件模式(笔记记录)
李建忠老师讲的<面向对象设计模式纵横谈>,早就看过了,现在有了时间重新整理一下,以前的博客[赛迪网]没有了,现在搬到博客园,重新过一遍,也便于以后浏览. 设计模式从不同的角度分类会得 ...
- 面向对象设计模式纵横谈:Abstract Factory 抽象工厂模式(笔记记录)
今天是设计模式的第二讲,抽象工厂的设计模式,我们还是延续老办法,一步一步的.演变的来讲,先来看看一个对象创建的问题. 1.如何创建一个对象 常规的对象创建方法: 这样的创建对象没有任何问题, ...
- C#面向对象设计模式纵横谈——6.Prototype 原型模式(创建型模式)
动机(Motivation) 在软件系统中,经常面临着“某些结构复杂的对象”的创建工作.由于需求的变化,这些对象经常面临着剧烈的变化,但他们却拥有比较稳定一致的接口. 如何应对这种变化?如何向“客户程 ...
- C#面向对象设计模式纵横谈——5.Factory Method 工厂方法模式(创建型模式)
动机 (Motivation) 在软件系统中,经常面临着“某个对象”的创建工作; 由于需求的变化,这个对象经常面临着剧烈的变化,但是它却拥有比较稳定的接口. 如何应对这种变化?如何提供一种“封装机制” ...
- C#面向对象设计模式纵横谈——4.Builder 生成器模式(创建型模式)
动机 (Motivation) 在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成:由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是它们组合 ...
- C#面向对象设计模式纵横谈——3.Abstract Factory 抽象工厂(创建型模式)
动机(Motivation) 在软件系统中经常面临着“一系列相互依赖的对象”的创建工作,同时,由于需求变化,往往存在更多系列对象的创建工作.如何应对这种变化?如何绕过常规对象的创建,提供一种“封装机制 ...
- C#面向对象设计模式纵横谈——2.Singleton 单件(创建型模式)
一:模式分类 从目的来看: 创建型(Creational)模式:负责对象创建. 结构型(Structural)模式:处理类与对象间的组合. 行为型(Behavioral)模式:类与对象交互中的职责分配 ...
- C#面向对象设计模式纵横谈——1.面向对象设计模式与原则
一:设计模式简介 每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心. ---- Christopher Alexander 软件设计领域设计模式: 设计模式描述了软件设计过 ...
- 面向对象设计模式纵横谈:Bridge 桥接模式(笔记记录)
桥接模式是一个比较难理解的设计模式,设计和分析的时候也不容易把握,咱们听听“李建忠”老师是怎么来讲的.我们还是从演变的角度来说问题,一步一步的来把问题说清楚.先谈谈“抽象”和“实现”的关系. 抽象与实 ...
随机推荐
- PHP判断是手机端还是PC访问
function isMobile(){ $useragent=isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : ' ...
- MM-实际应用中的难题
SAP系统实际应用中的十大难题——塞依SAP培训 难题1:采购料维修 如果有物料坏了,需要退回给供应商处维修,此时一般不做退货.因为,第一,供应商不一定会乐意:第二,往来单据也无谓地增多:第三,最重要 ...
- href,src,url三者区别。
在html中: href(Hypertext Reference)指向网络上的资源,在现有元素(如a标签)或现有文档(如link)与目标锚或资源之间建立链接. 建立链接的过程中,浏览器不会停止解析所在 ...
- Django 重写用户模型
AUTH_USER_MODEL = 'myapp.MyUser' django——重写用户模型 Django内建的User模型可能不适合某些类型的项目.例如,在某些网站上使用邮件地址而不是用户名作为身 ...
- selenium下打开Chrome报错解决
错误如下: [22516:20196:0704/024642.979:ERROR:install_util.cc(597)] Unable to read registry value HKLM\SO ...
- Python中的线程详解
线程 常用的方法 import threading import time def hello(name): print('Hello %s' % name) # 阻塞 time.sleep(5) p ...
- JavaScript实现观察者模式
首先: 观察者模式是软件设计模式的一种,它
- redis5 集群迁移方案
Redis5 集群迁移方案 一.KEY优化 1.按原来要求进行优化与大KEY分拆. 二.现Redis 集群缩容(对业务无影响) 主节点按要求合并至3个主节点. 业务配置为3主4从 删除没有槽的主节点与 ...
- java_16Arrays类
1sort():对数组进行升序排列 public static void main(String[] args) { int[] arr= {2,43,6,7}; Arrays.sort(arr); ...
- Error running Tomcat8: Address localhost:xxxx is already in use
参考自: https://blog.csdn.net/huazhongkejidaxuezpp/article/details/41813683 第一步,命令提示符号,执行命令:netstat -an ...