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