作者:
张传波
软件知识大学 首席专家
什么是设计模式?
设计模式,英文名字叫Design Pattern,这个“Pattern”硬生生地给翻译成“模式”,徒增了很多人的理解难度。
话说回来,我也不知道咋翻译好,反正设计模式这个说法说得多了,也就习惯了。
设计模式就是一些软件设计高手总结后得出的一些设计经验总结,目前还没有习惯设计模式这个说法的朋友就暂时不要去考究这个名字了,大概知道它的意思便可。
有什么设计模式?
设计模式一共有23种,按以下分类:
创建型(5种)
工厂方法(Factory Method)
抽象工厂(Abstract Factory)
单件(Singleton)
生成器(Builder)
原型(Prototype)
结构型(7种)
装饰者(Decorator)
适配器(Adapter)
外观(Facade)
组合(Composite)
代理(Proxy)
桥接(Build)
轻量(Flyweight)
行为型(11种)
策略(Strategy)
观察者(Observer)
命令(Command)
模板方法(Template Method)
迭代器(Iterator)
状态(State)
责任链(Chain)
解释器(Interpreter)
中介者(Mediator)
备忘录(Memo)
访问者(Visitor)
以上分类是按“官方”标准进行划分的,所谓的“官方”就是软件设计届的4位骨灰级人物:Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides,这几位作者常被称为"四人组(Gang of Four,缩写为GoF)",他们的著作就是《Design Patterns: Elements of Reusable Object-Oriented Software》。
学习设计模式需要懂UML吗?
熟悉类图是必须的,如果能熟悉对象图更好,而其它UML图就不是必须的。
惨不忍睹的软件设计现状与设计模式的理想境界
许多年前,IT行业是被崇拜的行业,程序员更是神圣的职业。但现在早已是程序员泛滥,大量的计算机专业应届生涌入编程的行列,蛇龙混杂,参差不齐。很多只在学校学过一两门编程,所写的代码行数不超过1000行的人,就直奔编程来了!编码功底不过关的程序员比比皆是,更甚者直奔软件设计去了,嘴巴说了一大通面向对象,写出来的代码却是垃圾!
国产的大部分软件,无设计可言,90%以上的项目是没有设计文档的,绝大部分的项目代码是没有人愿意去动的,大部分的项目经理做项目都是抱着早做完早解脱的心态,大部分的软件设计师没有感受到软件设计的魅力,没有办法去享受软件设计的乐趣。
设计模式能拯救我们这样的现状吗?设计模式为我们勾画了软件设计的美好境界,让我们很多人趋之若骛,很多人想在实际工作中运用设计模式,当往往是碰一鼻子灰,这有很多原因:
1.我们的水平还不够,没有能真正理解好设计模式,自然无法用好。
2.我们绝大部分的系统是数据库增删改查的四轮马车操作,设计模式的用武之地很小。
然而更深层次的原因是:
1.国内的软件编程及设计的教育实在太差,计算机相关专业知识陈旧落后。
2.国内软件水平实在落后,绝大部分软件企业是做解决方案、外包等应用级别的开发,精品软件、划时代的软件、改变世界的软件几乎等于零。
3.国家在软件行业的方针路线有误,重点应该是打造核心技术和培养高级人才,不要去折腾什么外包、CMMI,核心技术和高级人才才是国家核心竞争力。
设计模式不是纸上谈兵
n年前,我就买了GoF大作《Design Patterns: Elements of Reusable Object-Oriented Software》(中文版),不过实在惭愧,当时水平太差,里面的内容大部分是似懂非懂。尽管我已经写了几年代码,但功力依然是不足,经验也不够多,但大师的知识一时难以吃透。再过了几年,我又再次研究设计模式,这次居然基本可以看懂那本书了,感觉特妙!
设计模式绝对不是纸上谈兵的知识,光看书就以为自己懂了,那只是井底之蛙之见,设计模式绝对是从实践中来到实践中去的!如果编码经验很少,也不太可能能理解好设计模式,但凡软件设计能力强的人编码功底都是相当扎实的。如果没有能深刻理解面向对象,也不太可能理解好设计模式,刚刚毕业或者才工作一两年就说自己面向对象能力强的人,基本上就是夸夸其谈的人。
设计模式的魅力和威力,在具体介绍每种模式时再向大家展示。
高手是怎样炼成的?
我不是设计模式的高手,但我希望成为高手,要达成这个目标,还需要多年的努力。
按对设计模式的熟悉程度,我划分了以下几种档次:
不知道:没听说过,或者只知道名字。
能说:能简单说出该模式的用途。
能画:能准确地画出该模式的类图,或者画出实际应用的类图。
能写:能写出实现该模式的实例代码。
会用:能在实际工作中用起来。
活用:很熟练,能在工作中创造性地应用设计模式,可以指导别人应用设计模式工作。
对于我来说,23种模式我大概只能达到第3到第4的层次,如果能达到第6个层次,那简直就是世外高人了!
我们很多人都知道设计模式这东西,但绝大部分人所在的层次仅是第1最多是第2层次,各位想着实提高自己水平的话,可用以上的标准来检查一下自己达到怎样的程度了。
如何学习设计模式?
说说我的一些学习体会:
1.要用真正面向对象的语言来编程,如Java、C#、C++,这样才能加速你对面向对象、设计模式的理解。
我最开始用的编程语言是Basic,然后是Visual Basic,结果抽象类、继承这些东西基本上没有能在实际工作中体会过,后来用C#后才算是真正体会到面向对象。
2.找显浅的设计模式书来学习。
GoF的经典大作好是好,但很难看懂,后来我看了比较显浅的《Head First 设计模式》,终于我让跨进了实质的一步。
3.在实际工作中多用类图。
类图光会看是远远不够的,要多多实践,通过类图来提高你的OO能力!
4.抓破脑袋想设计模式具体的应用例子,并写出示例代码。
尽管有一些显浅的设计模式书,但里面不少例子没有实际的应用价值,有些书甚至还会用一些实际生活中的例子来说明某某模式,我觉得有点牵强附会。书中的大部分例子,只能帮助你大概理解该模式,更重要的是你必须想到在实际工作中的具体应用,写出具体的代码来。
5.多提问题,敢于挑战传统想法。
学习过程中,一定要多多思考、深入思考,多提问题,你会发现有些问题与你之前的认识是相左的,有些问题是和别人的看法是矛盾的,有时你甚至会去怀疑GoF是不是搞错了,这些都很正常,也是很好的事情。如果你一直没有发现问题,还感觉良好,那你就要注意了,那肯定是你没有理解好。
希望通过本文能让同学们对设计模式有简单的认识。
学习和掌握设计模式需要长时间磨练,你做好准备没有?
欢迎大家到设计模式学院一起来学习和进步!