原文转自:http://c.chinaitlab.com/special/sjms/Index.html
可以参考:https://www.cnblogs.com/whiteyun/category/272006.html
一个月下来,把常见的20个设计模式好好复习并且逐个用C++实现了一遍,收获还是很大的,很多东西看上去明白了但是真正动手去做的时候发现其实还是不明白--我深知这个道理,于是不敢怠慢,不敢写什么所谓的解释原理的伪代码,不敢说所谓的"知道原理就可以了"....因为我知道,我还还没有资格说这个话,至少对于设计模式而言我还是一个初学者,唯有踏实和实干才能慢慢的掌握到知识.
在我学习设计模式的过程中,觉得造成理解困难的主要是以下几点,谈一下自己的体会,希望对他人有帮助,不要走上我的老路上,毕竟我花了N长的时间才敢号称自己入门了~~!!-_-: 1)Gof并不适合于初学者.初学设计模式的一般都是从Gof入门开始学习的,不幸的是,这不是一本好的教科书,而把这本书称为一本奠定了设计模式理论基础的开山之作也许好一些,它把这些散落在各个设计中的常见模式收集起来,从此开始有了一个名词叫做"Design Pattern".说这本书不是一本好的教科书主要是以下的几个原因:
a)对设计模式或者说面向对象里面的一些原则性的东西解释的不够多不够彻底,比如"面向接口编程而不是对实现编程","优先采用组合而不是继承"等等,以至于后面看到各个模式的实现的时候很多模式看起来很相似却找不到区别和共性的地方.
b)对各个模式的解释或者举出来的例子不是特别的好,大部分都是为了讲解模式而讲解,没有加入前面提到过的一些基本原则的考量在里面,也就是说:原理性的东西和实现(各个设计模式)脱节.
2)初学者对语言或者说一些概念理解的不好.拿C++来说,为了做到面向对象需要提供的语言上的支持有继承,多态,封装,虚函数,抽象等等,我以前初学C++的时候,只为了学这些概念而去学习,不知道为什么要提供这些特性,这也是造成我走弯路的重要原因之一.当然,指望一个初学者在初学语言的时候就知道why是一件很困难的事情,也许结合着对设计模式的理解可以帮助你消化这些概念(我就是这样的).
3)看不懂UML结构图和时序图,UML图解释的类与类之间的关系,时序图解释的是各个对象的实现方式,两者结合在一起看才能加深对设计模式的理解,事实上,我现在已经可以做到仅仅看这两个图示就掌握一个模式的原理和实现了. 4)写的代码和参与过的项目不够多.设计模式和很多东西的产生过程都是一样的,首先人们遇到了问题,然后很多人解决了这个问题,于是渐渐的有人出来总结出解决这些问题所要遵守的一些原理和常用方法(我们称之为"模式"),久而久之就形成了一个理论或者说一个学科.而后人在讲述这些理论的时候大都是照本宣科,这对于计算机这样一个强调实践的学科或者说对于设计模式这样一个理论而言要理解起来是很困难的.前人在提出这些理论的时候一些考量,权衡等等只有在你自己遇到了这些问题的时候才能慢慢的体会.有一种说法是,没有写上10W行代码不要空谈什么设计模式大概就是这个意思吧.
综上所述,造成初学者学习设计模式困难的原因,一个是对基本的原则理解的不够透彻,一个的选的入门教材不合理,还有一个就是对各个模式的表述不明白,再次是实践不够多.有几本书籍,我看过,我想可以谈谈我的看法.第一本,<<敏捷软件开发:原则,模式与实践>>,这本书对于设计模式最大的贡献在于专门有几个章节讲述了面向对象的几个原则,比如Likov原则,开放封闭原则等等的,这几个章节在我学习设计模式的过程中起了关键的作用,因为当我理解了这些原则之后开始慢慢明白为什么要有纯虚函数提供接口,为什么要
有抽象基类,为什么要封装....我开始用这些原则去理解各个设计模式,开始慢慢体会各个模式的区别和共性.另外看过的两本书,我觉得性质都一样,如果你缺钱,任选其一吧.第一本是<<设计模式精解>>,第二本是<<深入浅出设计模式>>,都是我花上几个晚上 就可以看完的书.这两本的立足点都是以生动的例子结合面向对象的基本原理来讲解模式,我更喜欢前者一些(后者太贵,要不是打5折我才不买呐:)其次,要多接触项目或者可以找一些好的代码来看看,自己也多写一些代码.基本上,只要是用面向对象的语言开发的项目,里面没有几个模式的运用是不可能的了.因此,要戒除那些一开始接触设计模式就想整明白的幻想,因为要真正的理解需要很多的实践,同样的一时半会理解不了的也不必气馁(GOF的E文版我看了好多遍了:),坚信自己多实践一定可以慢慢的悟道的.关于设计模式的一个疑问:非面向对象语言中有没有所谓的"设计模式"?设计模式最初的定义是解决一些问题的惯用方法(大意如此),并没有明确的说必须要支持某种特性的语言.我用纯C开发的项目实在是有限,平时也只是自己作一些小东西玩玩,没有做过任何一个上万行的纯C开发的项目,所以一直对这个问题抱有疑问~~anyway,有问题是好事,说明我在思考~~把这个问题放在这里,以后慢慢实践之琢磨之~~
|