《设计模式精解》学习笔记(三)------设计模式开始
看到“设计模式”这个词是在三四年前了,当时突然发现这个词到处都是。但我一点都不理解,只是看了个大概概念和一些零星的介绍,给我的感觉是这项技术很牛。一个偶然的机会我在学校的一个书摊一角上见到了那本传说中的《设计模式—可复用面向对象软件的基础》,而且老板还是半价出售。于是当即打算买下来回去看看,和老板讲了价钱最后15元搞定。当时我连C++还没有开始学,所以看这本书的时候根本看不懂。一直放了好长时间,最后我花了好长时间把《C++ Primer》啃了几遍,对C++略有所熟悉,对OO概念也有了些了解。与此同时“设计模式”这个词也越来越多的出现在我的视野中。想起来我还有一本讲设计模式的书,于是赶紧找了出来。发现我的这本就是网上评价最高的那本牛书,我简直高兴死了。于是又读了起来,最后发现一个问题:我还是看不懂。在网上找了很多相关的文章和资料说是要理解运用设计模式需要有相当的实践经验,于是这本书又被我放下了。
直到有一次我逛书店发现了《设计模式精解》这本书,翻着看了看通俗易懂,我赶紧买了下来。回去花了不到两个星期的时间就看了一遍,感觉非常爽。那时候我已经有一些实际的编程经验了,终于对设计模式有了些认识,读到每个模式的时候想想自己做过的东西感觉自己有所提高。现在回头重新看这本《设计模式精解》想好好的学习以下模式,为将来进一步学习更高阶的知识打下基础。
在以后的文章中为了更好的学习设计模式我不会仅限于《设计模式精解》这一本书,我将会参考《设计模式—可复用面向对象软件的基础》、《Thinking In Pattern》和网络上的一些大牛们的文章。
第五章设计模式简介
一、设计模式产生于建筑学和人类学
一个名叫Christopher Alexander的建筑师在他的《The Timeless Way of Building》一书中阐述了模式的概念。他把模式定义为:“在某一情景下的问题解决方案”。
Christopher Alexander观察了许多建筑物、城镇、街道以及人类为自己建造的其他样式的生活空间。他发现,对于任何特定的建筑物,优秀的结构之间总有一些相同之处。他还认识到,他必须观察设计出来以解决同样问题的不同结构。
对事物的熟悉有时候会阻碍我们看到一些很明显的东西。模式的价值是,那些经验很少的人也可以利用别人在他们之前学到的东西:一个优秀的设计中必须包括什么,以及为了避免做出拙劣的设计必须避免什。
Christopher Alexander说一个模式的说明应该包括四个项目:
l
模式的名称
l
模式的目的,它要解决的问题
l
我们如何实现它
l
为了实现它我们必须考虑的限制约束
二、从建筑学转移到软件设计模式
20世纪90年代前期,一些聪明的软件开发者偶然发现了Alexander关于模式的研究成果,于是提出了两个问题:
l
软件中是否有不断重复出现、可以用某种相同方式解决的问题?
l
是否可能用“按照模式、首先识别出模式然后在模式的基础上创建特定的解决方案”的方法来设计软件?
尽管有很多人都在研究设计模式,但影响最深远的是Gamma、Helm、Johnson和Vlissides的《设计模式—可复用面向对象软件的基础》,出于对他们重要成果的公认,他们通常被亲切的称为“四人团”。这本书有以下几点重要意义:
l
它将设计模式的思想应用于软件设计。
l
它描述了收录和描述设计模式的一个结构。
l
它收录了23个模式。
l
它在这些模式的基础上提出了OO策略及方法的原则。
但是需要认识到:这几位作者不是这些模式的创建者而是这些模式的总结者。
模式的基本要素:
l
名称:每个模式都有一个独一无二的名称,人们用名称来鉴别模式。
l
意图:模式的目的。
l
问题:模式试图解决的问题
l
解决方案:对于自己出现的场景中的问题,模式怎样提供一个解决方案。
l
参与者和协作者:模式包括的实体。
l
效果:使用模式的效果。使用模式的同时研究其约束。
l
实现:怎样实现模式。(注意:实现只是模式的具体表现形式,而不能像模式本身那样被分析)
l
GoF(四人团)参考:在四人团的书中得到更多信息的位置。
三、为什么要学习设计模式
学习设计模式的理由:
l
复用解决方案——通过复用解决已经建立的设计,我为自己的问题找到了更高的起点并避免了绕弯路。
l
建立通用的术语——交流与协作都需要一个共同的词汇基础、一个对问题的共同观点。
l
设计模式在分析和设计上给与更高的视角。
四、学习设计模式的其他优点
1.
改善团队的交流和个人学习
2.
大多数设计模式还让软件更具可修改性。
3.
设计模式——当他们被正确传授时——可以大大增加学习者对基本OO设计原则的理解。
GoF特别建议了以下几点:
l
针对接口编程。
l
优先使用对象组合,而不是继承。
l
找到并封装变化点。
五、总结
学习设计模式对于提高OO概念的理解很有帮助,我就是为了这个目的同时也是为了提高自己OO的分析和设计能力而学习的,希望能收到很好的效果。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=559801