设计模式系列1--开篇漫谈

6,755 阅读13分钟

大概花了一个半月的时间把市面上比较知名的设计模式类的书全部买回来学习了一遍,这些书里面有好有坏。
如果想系统的学习设计模式,我建议还是买书看,因为书上的知识比较系统和权威,不像网上的文章良莠不齐,虽然有很多有些的博客的文章不错,但是刚开始自学也没有能力去分辨。

这篇文章应该算是学习设计模式的预热,让你对设计模式有一个大概的了解。

后续我会把大部分设计模式单独成文,这些文章的代码和文字是我糅合这些书籍加上自己的理解写出来的,如有偏差,欢迎指正。


什么是设计模式

定义:

在软件开发中,经过验证的,用于解决在特定环境下,重复出现的特定的问题的解决方案。

注意上面的提到的限定词,下面来详细说下

1、软件开发:
其实各行各业都有模式可以套用,这里的设计模式指的是在软件开发领域

2、经过验证的:
必须是经过大家公认和验证过的解决方案才算得上是设计模式,而不是每个人随便总结的解决方案都能算

3、特定环境:
必须是在某个特定环境才可以使用该设计模式,因为不同的环境,就算同样的问题,解决方案也不同,所以不能脱离环境去谈使用设计模式

4、重复出现:
因为只有重复出现的问题才有必要总结经验,形成固定的解决方案,再次遇到这样的问题就不用从头开始寻找解决方案,而是直接套用就可以了。

5、特定问题:
软件开发领域没有银弹,不要指望一种设计模式就能包治百病。每种模式只是针对特定问题的解决方案,所以不要迷信设计模式,滥用设计模式。

每个设计模式的构成如下:

1、模式名称:模式的一个好记的名字

2、环境和问题:描述在什么环境下,出现什么特定的问题

3、解决方案:描述如何解决问题

4、效果:描述应用模式后的效果,以及可能带来的问题


为什么要学习设计模式

引用知乎上面的一段话:

image

这段话很好的总结了设计模式的学习路径,这是在你长时间浸淫在编程领域,然后自己某天顿悟了,这需要足够的长的时间和悟性。但是现在有了设计模式,可以让你借用前人总结好的经验,更快的理解编程思想。

我们都知道面向对象设计的六大原则SOLID,只要遵循这些原则,就可以达到了代码复用、增加可维护性的目的,从而增加重用性,易于修改,后期可扩展。

但是这写原则太过于抽象,你没有几年的项目实战,是没法领悟透彻的,这还需要悟性。

如果说SOLID是软件开发的内功,那么设计模式就是武功招式,把SOLID原则表现出来的招式,把思想转化为实际场景中应用的代码。

通过学习这些设计模式,让你找到“封装变化”、“松耦合”、“针对接口编程”的感觉,从而设计出易维护、易复用、扩展性好、灵活性足的程序。

高手都是先模仿,然后领悟,最后自创。俗话说的“熟读唐诗三百首”就是这个道理。

不是说你学会了这23种设计模式(设计模式也不止这23种)你就能解决软件领域的任何问题了,而是通过学习设计模式让你领悟面向对象编程的思想(SOLID),到最后就可以抛弃设计模式,把这些思想应用在你的代码中,写出高内聚、低耦合、可扩展、易维护的代码了。此时已然是心中无设计模式,而处处是设计模式了。这就是学习设计模式的目的。

学完设计模式只是第一步,并不会让你的编码水平有了质的飞跃,接下来需要你通过大量实践来消化这些设计模式的精髓,内化为自己的思想,从而体现在代码上。


如何学习设计模式

下面的都是摘抄自《研磨设计模式》一书

1. 学习设计模式的三个层次

image

2.如何学习设计模式

image


学习建议

如果你看完上面的内容,觉得很有必要学习设计模式来提高自己的内功,那么可以接着看下去。

我的学习建议如下,也是对这几本书的评价吧,大家可以做个参考

1. 《head first设计模式》,推荐指数:❤️❤️❤️❤️

建议反复阅读,然后把所有代码手动实现一次。虽然这本书是用java语言写的,如果有其他语言基础,看起来基本上没什么难度。

这本书真正做到了深入浅出,用简单易懂的语言把设计模式这种抽象程度非常高的知识讲的非常透彻。但是估计很多人看不惯这种漫画风和对话方式的书写方式,但是你适应了,就发现其实这种方式比纯文字书写,学习起来效率更高。因为人的大脑对于图像的记忆总是比文字记忆更加深刻,但是这本书并没有把23种设计模式讲完。

2. 《研磨设计模式》,推荐指数:❤️❤️❤️❤️❤️

如果要给这几本书打评分的话,这本书我想给满分,真想不到国人也能写出如此好的技术书籍。这本书出彩的地方在于不仅详细讲解了GOF的23种设计模式,而且写作的方式我觉得非常好。

首先抛出一个实际问题,然后列出常规的解决方案,接着之处常规的解决方案会有什么问题,自然而然的引出对应的设计模式来解决。这样有个比较过程,可以很好的帮助我们理解为什么要使用设计模式。

这本书之所以如此出彩,大概有如下几点:

1> 在于书上的大多数例子解决的是开发中遇到的实际问题,虽然都是java后端的,对我们iOS端没什么大的意义,但是我们可以从中学习到使用设计模式解决问题的思路,从而领悟到该模式的精髓,大有裨益。

2> 对每个模式进行了深入的扩展,其他书要么是把用模式模拟下伪代码,要么就是讲解的不够深入。但是这本书基本上对每个模式都做到深入讲解,分析每个模式的利弊,适用场景,如果变形使用

3> 对于每个模式,都讲解了如何和其他模式联合使用,对于相似的模式,也做了比较详细的比较。

基于以上三点,我觉得这本书当之无愧的全场最佳。但是非常的遗憾的是,这本书的纸质版网上基本上买不到了,估计销量不好,出版社不出书了,本来想买一本珍藏起来,时常翻阅,恐不能遂愿了,不得不说遗憾。这本书虽然没有其他书籍名气那么大,但是从内容上来说,当属最优秀的。如果你只想看一本书的话,我推荐这本书,必看!!

3. 《设计模式之禅》,推荐指数:❤️❤️

这本书的内容对不起这个书名,乍一看这书名应该是对设计模式做了深入研究的。但是真正打开一看,发现每篇都是浅尝辄止,甚至直接给你抛出一个设计模式的伪代码,也不讲解下为什么这么写。有的篇章举得例子也是非常不恰当,强行把例子和设计模式扯上关系,不伦不类。

甚至作者在前言里面提到的本书的精华部分:设计模式和扩展。只是寥寥数笔带过,说了和没说一样。至于本书的杀手锏:设计模式PK和设计模式混编。也是一般般,不过尔尔。

当然本书也不是一无是处,第一部分,我觉得是这本书的精华,详细解释了SOLID设计原则,可以好好看看。本篇博文的SOLID部分也是借鉴这本书的。

4.《大话设计模式》,推荐指数:❤️❤️❤️

这本书应该算是所有书里面最浅显易懂的,如果你阅读其他的书籍有困难,可以先看这本书。但是这本书讲的非常浅显,仅仅能让你认识下每个设计模式的实现伪代码和作用,看完了有个大概了解,没有做进一步讲解。

虽然这本书的网上评价很高,但是我觉得没必要读。原因就是真的太浅显了,看完了对设计模式还是雾里看花,懵懵懂懂。要入门的话,推荐看head first。

5. 《设计模式》,推荐指数:❤️❤️❤️❤️

这本书是其他书籍的鼻祖,GOF原创。但是这本书写的非常简练,加之代码都是c++实现的,如果之前没有接触过设计模式,基本上是别想看懂这本书。

不建议作为入门书籍,你可以把其他几本书看完了,再回头看这本书。这本书对每种设计模式做了非常精炼的描述,本书的精华在第一章,对面向对象设计领域做了很多高屋建瓴的指导意见,值得一读。《研磨设计模式》算是对本书的详细解读,如果把前者看懂了,这本书基本上不需要看。

6.《设计模式沉思录》,推荐指数:❤️❤️❤️

这本书是GOF作者之一写的,主要对于设计模式存在的一些误区做了解释,然后给出了一些使用设计模式的知道意见。可以了解下。

7. 《Objective-C编程之道:IOS设计模式解析》,推荐指数:❤️

烂书一本!!

首先翻译就是稀烂,语句不通,不知道写的什么玩意。其次这本书虽然是针对iOS写的,但是根本就没有针对iOS这个特定的领域来讲解设计模式,挂羊头卖狗肉,举得例子根本没实用性,除了少数几个还算有点用。

更奇葩的是,很多地方都是强行使用设计模式,把本来简单的实现改非常复杂,吃饱的撑得。设计模式是解决问题的,不是制造问题的。

反正烂书一本,不推荐看。

如何看书

吐槽完了,说下我的学习建议:

高阶:只看一本《研磨设计模式》足矣,把这本书反反复复的搞透,其他基本不用看了。

中阶:《head first设计模式》------->《研磨设计模式》

初阶:《大话设计模式》----> 《head first设计模式》---->《研磨设计模式》

书看完了,只是知道了有这么个玩意存在,如何灵活运用,就需要看开源项目区领悟这些设计模式的妙处和精髓了,你会看到设计模式在各种开源项目框架中存在,有的是直接使用,有的是变形使用。

多看,多写,多思考。


设计模式的分类

下面我们就来对设计模式做一个感性的认识吧。

每种设计模式的简要描述:

image

GOF的23种设计模式如下图所示:

image

如图所示,设计模式分为目的和范围两个维度。

根据目的,我们可以把模型分为三类:创建型,结构型,行为型

根据范围,可以分为对象和类两个大类。

具体描述如下,摘自《设计模式》一书

image

设计模式之间的关联:

image


面向对象设计原则SOLID

SOLID原则是为了写出可复用、可扩展、高内聚、低耦合的代码。

原则只是战略层面的指导,没有代码能完全遵守着五大原则,要根据实际情况合理取舍。

下面我们来看看SOLID的具体描述:

image

1、单一职责

一个类只做一种类型责任,当这个类需要承当其他类型的责任的时候,就需要分解这个类。不过在现实开发中,这个原则是最不可能遵守的,因为每个人对一个类的哪些功能算是同一类型的职责判断都不相同。

2、开放封闭原则

软件实体应该是可扩展,而不可修改的。也就是说,你写完一个类,要想添加功能,不能修改原有类,而是想办法扩展该类。有多种设计模式可以达到这一要求。

3、里氏替换原则

当一个子类的实例应该能够替换任何其超类的实例时,它们之间才具有is-A关系。也就是说接口或父类出现的地方,实现接口的类或子类可以代入,这主要依赖于多态和继承。

####4、 接口分离原则
不能强迫用户去依赖那些他们不使用的接口。换句话说,使用多个专门的接口比使用单一的总接口总要好。 不要提供一个大的接口包括所有功能,应该根据功能把这些接口分割,减少依赖。

5、依赖倒置原则

  1. 高层模块不应该依赖于低层模块,二者都应该依赖于抽象
  2. 抽象不应该依赖于细节,细节应该依赖于抽象

上面说的五种原则非常之抽象,也是面向对象设计的时候的指导原则,我们只有尽量遵守这些原则,才可以设计出漂亮的代码。

设计模式就是对这些抽象思想的具体实现,理解每个设计模式,可以加深对这些原则的理解,对我们内功提升大有裨益。

我们在写代码的时候最痛苦的莫过于改需求,因为每次改需求,都会导致代码的大改动,所以我们应该把经常变动的地方封装起来,让这些地方的变动不影响其他地方。这就是设计模式的主要作用。

下面我们看看每种设计模式封装的变化部分:

image


总结

最后想说的一点是,学了设计模式,也不要不管什么场合都要硬套上设计模式,才显得有逼格。如果你写代码的时候觉得不需要使用设计模式,那就说明用不上设计模式,等代码重构的时候,需要用到设计模式才去用,如果你只是私下练练手那没关系。

学习设计模式是一个漫长的过程,看完书了解每个设计模式的使用才刚刚开始,接下来需要你反复思考、锤炼,把学到这些模式内化为思想,体现到代码上。

路漫漫其修远兮。

后面我会写一系列设计模式的文字,争取把每个模式讲清楚,有什么错误,欢迎指正探讨。