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进行关注。

时间: 2024-10-13 10:50:38

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

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

一:模式分类 从目的来看: 创建型(Creational)模式:负责对象创建. 结构型(Structural)模式:处理类与对象间的组合. 行为型(Behavioral)模式:类与对象交互中的职责分配. 从范围来看: 类模式处理类与子类的静态关系. 对象模式处理对象间的动态关系. 二:Singleton (创建型模式) 单件 1.动机(Motivation) 软件系统中,经常有这样一些特殊的类,必须保证他们在系统中只存在一个实例,才能确保它们的逻辑正确性,以及良好的效率. 如何绕过常规的构造器,

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

动机(Motivation) 在软件系统中,经常面临着“某些结构复杂的对象”的创建工作.由于需求的变化,这些对象经常面临着剧烈的变化,但他们却拥有比较稳定一致的接口. 如何应对这种变化?如何向“客户程序(使用这些对象的)”隔离出“这些易变对象”,从而使得“依赖这些易变对象的客户程序”不随着需求的改变而改变. 意图(Intent) 使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象.   ----<设计模式> GOF 结构(Structure)

CSDN日报20170501 ——《我的春招总结》

[程序人生]我的春招总结 作者:Ezioooooo 我的春招只能用一个词来形容:惨不忍睹. 点击阅读全文 [iOS]mutableCopy 与 copy 在面试中的那些坑你知道吗? 作者:JackLee18 最近听到朋友谈论在面试中被面试官通过基础知识深挖狂虐的事情,心中有些不忿,决定推出一系列基础知识重温的文章,在方便自己复习的同时,希望和大家一块进步. 点击阅读全文 [Java] Java 异常打印输出中常见方法的分析 作者:木小鱼 本文将深入分析在异常日志打印过程中的若干情况,并给出若干的

NET设计模式 第二部分 行为型模式(15):模版方法模式(Template Method)

摘要:Template Method模式是比较简单的设计模式之一,但它却是代码复用的一项基本的技术,在类库中尤其重要. 主要内容 1.概述 2.Template Method解说 3..NET中的Template Method模式 4.适用性及实现要点 概述 变化一直以来都是软件设计的永恒话题,在XP编程中提倡拥抱变化,积极应对.如何更好的去抓住变化点,应对变化?如何更好的提高代码复用?通过学习Template Method模式,您应该有一个新的认识. 意图 定义一个操作中的算法的骨架,而将一些

NET设计模式 第二部分 结构性模式(13):代理模式(Proxy Pattern)

代理模式(Proxy Pattern) ——.NET设计模式系列之十四 Terrylee,2006年5月 摘要:在软件系统中,有些对象有时候由于跨越网络或者其他的障碍,而不能够或者不想直接访问另一个对象,如果直接访问会给系统带来不必要的复杂性,这时候可以在客户程序和目标对象之间增加一层中间层,让代理对象来代替目标对象打点一切.这就是本文要说的Proxy模式. 主要内容 1.例说Proxy模式 2.Proxy模式效果及实现要点 …… 概述 在软件系统中,有些对象有时候由于跨越网络或者其他的障碍,而

.NET设计模式(11):组合模式(Composite Pattern)(转)

概述 组合模式有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦. 意图 将对象组合成树形结构以表示“部分-整体”的层次结构.Composite模式使得用户对单个对象和组合对象的使用具有一致性.[GOF <设计模式>] 结构图 图1 Composite模式结构图 生活中的例子 组合模式将对象组合成树形结构以表示"部分-整体"的层次结构.让用户一致地使用单

NET设计模式 第二部分 结构性模式(10):组合模式(Composite Pattern)

组合模式(Composite Pattern) ——.NET设计模式系列之十一 Terrylee,2006年3月 概述 组合模式有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦. 意图 将对象组合成树形结构以表示“部分-整体”的层次结构.Composite模式使得用户对单个对象和组合对象的使用具有一致性.[GOF <设计模式>] 结构图 图1 Composite模式结构图

NET设计模式 第三部分 结构型模式(7):适配器模式(Adapter Pattern)

适配器模式(Adapter Pattern) ——.NET设计模式系列之八 Terrylee,2006年2月 概述 在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的.那么如何应对这种“迁移的变化”?如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口?这就是本文要说的Adapter 模式. 意图 将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可

NET设计模式 第二部分 结构性模式(8):桥接模式(Bridge Pattern)

桥接模式(Bridge Pattern) ——.NET设计模式系列之九 Terrylee,2006年2月 概述 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?这就要使用Bridge模式. 意图 将抽象部分与实现部分分离,使它们都可以独立的变化.[GOF <设计模式>] 结构图 图1 Bridge模式结构图 生活中的例子 桥接模式将抽象部分与它的实现分离