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

大概花了一个半月的时间把市面上比较知名的设计模式类的书所有买回来学习了一遍,这些书里面有好有坏。
若是想系统的学习设计模式,我建议仍是买书看,由于书上的知识比较系统和权威,不像网上的文章参差不齐,虽然有不少有些的博客的文章不错,可是刚开始自学也没有能力去分辨。java

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

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


什么是设计模式

定义:

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

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

一、软件开发:
其实各行各业都有模式能够套用,这里的设计模式指的是在软件开发领域后端

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

三、特定环境:
必须是在某个特定环境才可使用该设计模式,由于不一样的环境,就算一样的问题,解决方案也不一样,因此不能脱离环境去谈使用设计模式框架

四、重复出现:
由于只有重复出现的问题才有必要总结经验,造成固定的解决方案,再次遇到这样的问题就不用从头开始寻找解决方案,而是直接套用就能够了。学习

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

每一个设计模式的构成以下:

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

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

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

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


为何要学习设计模式

引用知乎上面的一段话:

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

一、单一职责

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

二、开放封闭原则

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

三、里氏替换原则

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

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

五、依赖倒置原则

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

上面说的五种原则很是之抽象,也是面向对象设计的时候的指导原则,咱们只有尽可能遵照这些原则,才能够设计出漂亮的代码。

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

咱们在写代码的时候最痛苦的莫过于改需求,由于每次改需求,都会致使代码的大改动,因此咱们应该把常常变更的地方封装起来,让这些地方的变更不影响其余地方。这就是设计模式的主要做用。

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

image


总结

最后想说的一点是,学了设计模式,也不要无论什么场合都要硬套上设计模式,才显得有逼格。若是你写代码的时候以为不须要使用设计模式,那就说明用不上设计模式,等代码重构的时候,须要用到设计模式才去用,若是你只是私下练练手那不要紧。

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

路漫漫其修远兮。

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

相关文章
相关标签/搜索