学习设计模式基础
一:设计模式是什么
包括:什么是模式、设计模式的概念、设计模式的理解、设计模式的历史
 
二:设计模式有什么
包括:设计模式的组成、设计模式的分类、设计模式和面向对象设计原则、设计模式和UML、设计模式和设计工具、设计模式和重构
 
三:设计模式的学习
包括:为什么要学习设计模式、学习设计模式的层次、如何学习设计模式
 
四:每个模式的讲述结构
包括:初始某个设计模式、体会某个设计模式、理解某个设计模式、思考某个设计模式
 
设计模式是什么
什么是模式
从字面上理解,模:就是模型、模板的意思;式:就是方式、方法的意思。综合起来所谓模式就是:可以当作模型或模板的方式方法。再直白点说就是可以用来当成样板被参考的方式方法,类似于大家熟悉的范例。
按照这个理解,设计模式就是指的设计方面的模板,也就是设计方面的方式方法。
 
设计模式的概念
设计模式是:在软件开发中,经过验证的,用于解决在特定环境下、重复出现的、特定问题的解决方案。
 
设计模式的理解
1:设计模式是解决某些问题的办法
2:设计模式不是凭空想出来的,是经验的积累和总结
3:设计模式并不是一成不变的,而是在不断的发展中
4:设计模式并不是软件行业独有的,各行各业都有自己的设计模式
 
用大家身边的例子来说,比如医药行业,就有自己的设计模式。假设一个人感冒了,到药店买点感冒药来吃,这个感冒药就是设计模式的一个很好体现。
 
经过验证的:药品上市前,会有大量的验证和实验,以保证药品的安全性
特定环境下:这些药品是针对人的,不是针对其它动物的
重复出现的:正是因为感冒会重复出现,研制药品才是有意义的
特定问题:感冒药只用来解决感冒问题,不能解决其它问题,比如脚痛
解决方案:药品本身就是个解决方案的具体体现 
   
经过上面的比较,你会发现,医药行业对设计模式的体现,一点不逊色于软件行业。事实上,很多行业都有自己的设计模式。就算设计模式本身也不是起源于软件行业,而是起源于建筑业。
 
 
设计模式的历史
设计模式起源于建筑行业,一位名叫Alexander的建筑师,发现并总结了一些建筑行业的设计模式。
在上世纪90年代中,准确地说是1995年,由Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides合著的《设计模式——可复用面向对象软件的基础》一书的出版,正式掀开了在软件业设计模式的序幕,这本书的四位作者被世人称为四人组,也有称为四人帮的,也就是大家熟见的GoF(Gang of Four)。
设计模式的组成
在描述一个设计模式的时候,通常会有如下部分:
1:模式名称:就是为每个设计模式取个名字,好记忆,也好交流
2:环境和问题:描述在什么场景下,出现什么样的特定的问题
3:解决方案:描述如何解决这个问题
4:效果:描述模式应用的效果,以及可能带来的问题,或者使用中需要权衡的问题
 
上面是对单个设计模式来说的,在Java领域,对于设计模式的组成还有另外一种分法,就是按照设计模式所在的技术领域来划分,大致分成:
1:Java设计模式:通常指GoF的《设计模式——可复用面向对象软件的基础》一书中提到的设计模式
2:JEE设计模式:通常指SUN的《J2EE核心设计模式》一书中提到的设计模式
3:其它领域的,包括但不限于:EJB设计模式、实时系统设计模式、多线程设计模式、架构模式等等
 
设计模式的分类
为了缩小范围,我们仅讨论Java设计模式,也就是GoF著作中提到的23个设计模式。对于这23个设计模式的分类,GoF把它们分为三类: 
1:创建型模式:抽象了对象实例化的过程,用来帮助创建对象的实例
2:结构型模式:描述如何组合类和对象以获得更大的结构
3:行为型模式:描述算法和对象间职责的分配
当然也有按其它方式进行分类的,这里就不去讨论了。
设计模式和面向对象设计原则
面向对象的分析设计有很多原则,这些原则大都从思想层面,给我们指出了面向对象分析设计的正确方向,是我们进行面向对象分析设计应该尽力遵守的准则。
而设计模式已经是针对某个场景下某些问题的某个解决方案。也就是说这些 设 计原则是思想上的指导,而设计模式是实现上的手段,因此设计模式也是应该遵守这些原则的,换句话说, 设计模式就是这些设计原则的一些具体体现。
为何不重点讲述面向对象设计原则
1:设计原则本身是从思想层面上进行指导,本身是高度概括和原则性的,只是一个设计上的大体方向,其具体实现并不是只有设计模式这一种。理论上来说,可以在相同的原则指导下,做出很多不同的实现来。
2:每一种设计模式并不是单一的体现某一个设计原则,事实上,很多设计模式都是融合了很多个设计原则的思想,并不好特别强调设计模式对某个或者是某些设计原则的体现。而且每个设计模式在应用的时候也会有很多的考量,不同使用场景下,突出体现的设计原则也可能是不一样的。
3:这些设计原则只是一个建议指导,事实上,在实际开发中,很少做到完全遵守,总是在有意无意的违反一些或者是部分设计原则。设计工作本来就是一个不断权衡的工作,有句话说得很好:“ 设计是一种危险的平衡艺术”,设计原则只是一个指导,有些时候,还要综合考虑业务功能、实现的难度、系统性能、时间与空间等很多方面的问题
4:设计模式本身已经很复杂了,在一门课程里面很难再去深入的探讨这些设计原则,这样也避免出现过多的重点内容,导致大家无所适从
设计模式和UML
1:UML是一种标准的图形化建模语言,它是面向对象分析与设计的一种标准表示。
2:设计模式和UML本身没有任何联系
3:可以使用UML来图形化表示设计模式的:设计结构、调用顺序等,方便交流
4:完全可以不使用UML,可以使用任何易于交流和表达的方式来表示设计模式的:设计结构、调用顺序等
 
设计模式和设计工具
1:设计模式重在设计、重在思想、重在解决方案,跟使用什么样的设计工具,没有任何关系
2:使用设计工具,能有效地帮助我们去表达应用设计模式设计出来的成果,并对这些成果进行管理和维护
3:完全可以不使用任何设计工具
设计模式和重构
1:设计模式是重构的目标,重构是达到目标的手段
2:重构并不排斥提前设计,重构并不是不需要设计
3:合理的提前设计 + 重构来不断的改进设计 ==〉趋近于优秀的系统
设计模式的学习
为什么要学习设计模式
1:软件开发越来越复杂,对软件设计的要求也越来越高,而 软件设计和架构的入门功 夫就是深入理解和掌握设计模式,因此,设计模式的重要性不言而喻。
2:设计模式已经成为软件开发人员的“标准词汇”
3:学习设计模式是个人提高的捷径
4:不用重复发明轮子
学习设计模式的层次
1:基本入门级:
要求能够正确理解和掌握每个设计模式的基本知识,能够识别在什么场景下,出现了什么样的问题,采用何种方案来解决它,并能够在实际的程序设计和开发中套用相应的设计模式
2:基本掌握级:
除了具备基本入门级的要求外,还要求能够结合实际应用的场景,对设计模式进行变形的使用。
事实上,实际开发中,经常会碰到跟标准模式的应用场景有一些不一样的情况,此时要合理的使用设计模式,就需要对它们做适当的变形,而不是僵硬的套用了。当然能变形的前提是要能准确深入的理解和把握设计模式的本质, 万变不离其宗,只有把握住本质,才能够确保 正确变形使用而不是误用。
3: 深入理解和掌握级:
除了具备基本掌握级的要求外,更主要是从思想上和方法上吸收设计模式的精髓,并融入到自己的思路里面去,在进行软件的分析设计的时候,能随意的、自然而然的应用,就像是自己思维的一部分。
事实上,实际开发中,稍微复杂点的应用,在解决某个问题的时候,就不再是单一的应用某一个设计模式,而是综合应用很多的设计模式。例如:结合着某个具体的情况,很可能需要把模式A进行简化,然后结合上模式B的一部分,再组合应用变形的模式C……,如此来解决实际的问题。
更复杂的是除了考虑这些设计模式外,还可能需要考虑系统整体的体系结构、实际功能的实现、与已有功能的结合等等。这就要求在应用设计模式的时候,不拘泥于设计模式本身,而是从思想和方法的层面进行应用。
 
简单点说,基本入门级就是套用使用,相当于能够依葫芦画瓢,很机械;基本掌握级就是能变形使用,比基本入门级稍灵活一些,可以适当变形使用,但还是比较匠气;深入理解和掌握级才算是真正的把设计模式的精髓吸收了,是从方法和思想的层面去理解和掌握设计模式,就犹如练习武功到最高境界,开始“无招胜有招”了。要达到这个境界,没有足够的开发、设计经验,没有足够深入的思考,是不太可能的。
至于有些朋友说:设计模式的书我看了不少,觉得都看懂了,就是不知道在实际开发中怎么用这些设计模式,从而认为设计模式是“看上去很美”的“花拳绣腿”。那么“恭喜”这些朋友,你正处于对“ 设计模式了解级”,根本还没有入门。
 
如何学习设计模式
结合自身的经验,给出如下学习设计模式的建议:
1:首先要调整好心态,不要指望一蹴而就,不可浮躁
学习和掌握设计模式是需要有一个过程的,不同的阶段看这些设计模式会有不同的领悟和感受。不要指望真正的设计模式的课程是又简单又有趣的,一看就懂的,那种课程多是属于科普性质的,只是让你简单了解一下设计模式。这也是为何很多朋友总感觉“懂”设计模式,却不会在实际项目中应用设计模式了,因为你“懂”的程度不够。
要想真正理解和掌握,必须要上升到一定的难度和深度,让你学完后思考,思考后应用,然后再学、再思考、再应用,如此反复,方能成就。
“鱼和熊掌不可兼得”,因此,本课程尽量在内容的深度、难度和讲述的通俗易懂、简单明了上进行平衡,以期让大家能以相对较小的力气去真正理解和掌握设计模式。
2:学习设计模式的第一步:准确理解每个设计模式的功能、基本结构、标准实现,了解适合使用它的场景以及使用的效果
3:第二步:在实际的开发中,尝试着使用这些设计模式,并反复思考和总结是否使用得当,是否需要做一些变化
4:第三步:再回头去看设计模式的理论,有了实际的模式应用经验再看,会有不同的感悟,一边看一边结合着应用经验来思考。比如:设计模式的本质功能是什么?它是如何实现的?这种实现方式还可以在什么地方可以应用上?如何才能把这个设计模式和具体的应用结合上?这个设计模式设计的出发点是什么?等等。可以有很多考虑的点,从不同角度对设计模式进行思考
5:第四步:多次重复第二步和第三步。也就是在实际开发中使用,然后结合理论思考,然后再应用,再思考……,如此循环反复多次,直到达到对设计模式基本掌握的水平
 
简而言之,大家要注意让设计模式的理论和实践相结合,理论指导实践,实践反过来加深对理论的理解,如此反复循环,成螺旋式上升。
事实上,到了基本掌握设计模式的水平后,最后能达到一个什么样的高度,因人而异,得看个人的思维水平和理解水平,对于这个阶段,只有一个建议,那就是反复的、深入的思考,别无它法,到了思想的层面,就得靠“悟”了。
 
 
每个模式的讲述结构
初始某个设计模式
包括这个模式的:定义、结构、参考实现
 
体会某个设计模式
包括:场景问题、不用模式的解决方案、使用模式的解决方案
理解某个设计模式
主要是模式讲解部分,包括:认识某个模式、针对各个重点难点功能,或是与实际应用结合的讨论和示例、模式的优缺点
思考某个设计模式
包括:模式的本质、对设计原则的体现、何时选用
对每一个设计模式进行内容分级
1: 初级内容:从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等等,让读者能系统、完整、准确的掌握每个模式,培养正确的“设计观”
2: 中高级内容:深入探讨如何理解这些模式,模式中蕴含什么样的设计思想,模式的本质是什么,模式如何结合实际应用,模式的优缺点,和其它模式的关系等等,以期让读者尽量去理解和掌握每个设计模式的精髓所在
 
本课程在内容上深入、技术上实用、和实际开发结合程度很高,课程中大部分的示例程序都是从实际项目中简化而来,因此很多例子都可以直接拿到实际项目中使用。如果你想要深入透彻的理解和掌握设计模式,并期望能真正把设计模式应用到项目中去,那么这是你不可错过的课程。
 
配套视频课程:【 http://sishuok.com/product/501】
私塾在线学习网原创内容,转载请注明【http://sishuok.com/forum/blogPost/list/5664.html】