Christopher Alexander 是开创模式的鼻祖,有趣的是他研究的是建筑领域的体系结构,并非软件,其著作《A Pattern Language: Towns, Buildings, Construction》介绍了建造房屋和城市的通用模式。那么一本建筑学的著作为什么会对软件行业有这么大的影响力呢?我想这大概是文明相融相通的缘故吧。任何一项文明、一种文化都有其产生和发展的历程,该过程千奇百态,但又有本质上的相似,因为文明的发展是承前启后的,文化的内容是相互学习、相互包容的。计算机语言文明发展至今,最大限度的容纳了人类智慧的结晶,人类几乎离不开电子信息世界。同时由计算机语言而生的各种软件是计算机文明不可或缺的载体或工具。软件的发展如同华夏文化始祖人皇伏羲创建文明的过程,是启发、创造性思维相互作用的结果,那么软件又是受那些方面的因素启发而创造发展到现状的呢?很多很多方面,我想你已经猜到了其中一个 --- 建筑工程,是的,软件的发展从混沌状态到现在的大规模的规格化、系统化的生产,确实从建筑学借鉴了很多成功的经验,从而产生了软件工程、设计模式之类的先进思想。
模式能给我们带来什么好处,或者说我们为什么要学习模式呢?其实我觉得模式就在我们的生活周围,只不过被Alexander用来定义某个方面的内容,该内容备受大家推崇,成了他的一家之言的“商标”了,请允许我这么打个比方^_^我们拿做饭来说吧,我们知道米饭应该先煮的差不多熟了,再捞起来用蒸笼蒸比较好吃(当然现代的电饭堡简化了该过程,不过做出来的饭没有“原始工艺”的香^_^); 韭菜和鸡蛋一起抄比较好吃;北京烤鸭难道不是养出来的鸭子烤的,谁都知道人家有自己的工艺配方,啥叫工艺配方,我个人理解为以下要素:火候、作料、制作流程。再拿茶水、酒水来说,不同的茶用不同水,不同的酒用不同的杯。这些都是人类生活总结的经验,这些和上述的模式有什么分别吗,我是不以为然的。我们不妨称这些为“生活模式”,Alexander 的为“建筑模式”。有了这些“模式”我们就能更高效、更有质量的保证生产。不是把菜洗干净丢进热锅里面抄就能作出可口的菜肴,有的人做出的饭菜味同嚼蜡,有的人做的饭菜即使普通材料也弄的如同珍馐佳肴让人留恋往返;不是把水烧来了就能泡出好茶来,什么水,怎么烧,怎么冲茶,都是很有讲究的,泡茶我没有机会亲身实践过,不过没见过猪跑还没吃过猪肉吗。^_^所以你应该乡下老家,请教你的爸爸妈妈、叔叔婶婶学学厨艺,有条件的你可以业余时间去参加厨师培训班,再不行,有钱你可以请个厨师,生活不要亏待自己;你应该跟领导多打交道,跟他请教、切磋一下茶道; 多出面一些交际场合,我想你不光会知道怎么喝酒这么简单。软件也一样,不是你一味一行一行的敲代码就能整出一套性能优良、运行稳定、客户满意的软件产品。软件发展已经经历过这样一种混乱的状态。想象一下计算机语言之初的状态,第一代骨灰级程序员是输0和1的组合来编制程序的(这是我很向往尝试的工作,可惜一直没有机会),输出是打孔的纸带,时间长了,他们发现一些有规律的东西(“计算机语言模式”雏形),汇编因此诞生了,依次类推,接下来是B, C C++和Java. 计算机语言好比是砖,软件好比是我们的建筑,如房子、街道、城市。物质资源日趋丰富,生活水平的不断提高,人类的房屋越来越坚固,越来越别致。不同的人群,不同的区域,不同的行业,对房屋的要求是不一样的,有适合平民的经济房,有适合有钱人的别墅,盖在地震多发地段的要防震(像日本的房子就是比较好的“建筑模式”),写字楼、卖厂和住宅楼是不应该盖一样的。这些都分门别类,各有方案模式;软件也是一样,有C/S结构,有B/S结构,有实时系统,有分布式系统他们各有特点。如果我们不懂模式,不运用模式,我想或许我们也能做出这些系统来,如果我给你一落砖,假以时间和毅力相信还是可以砌一座房子,如果不参考你以知的建筑模型和相关技术,你一定会历经重重失败才完成工作,或更本完成不了工作,你的房子即使造出来也是岌岌可危,这样的“危房”你敢住吗?建筑师就不同,他们学识渊博,经验丰富,他们知道门该开在那里合适,建拱门还是方形门,走廊应该建多长,这样主人才能住的舒服;对于地震地区的房子要防震,该采用什么结构和材料;卖厂和写字楼的房子该如何布局等等,都有现成的图纸和资料参考,这在他们心目中早已经胸有成竹了。熟能生巧,建筑师还可以在以有方案的基础上改革、创新。看看悉尼歌剧院,南京长江大桥,赵州桥,还有我们的鸟巢奥运会馆,相信你会感受到这些建筑模式是多么的巧夺天工。罗嗦了这么一大堆,其实我是想说,在软件行业是相似的,为什么我们有“软件工程”这个说词,就是软件行业向建筑行业借鉴产生的。软件工程定义了软件的生命周期(SDLC),软件设计模式定义了软件生产模式。在设计模式的指导下生产软件能更快速、更高质量、更方便的后期运行、维护……打个比方,你可以用50块砖盖出比别人用100砖盖的还坚固的围墙或其它物体。在软件开发中运用设计模式能用10个类完成未运用设计模式设计的上百上千个类的现象早已是明日黄花了。运用设计模式开发软件,开发人员之间更容易交流沟通,更容易把握项目的需求和发展状态。在《设计模式精解》中有这样的描述很恰当,说的是两个木匠正在讨论如何为橱柜制作抽屉的问题。 假设如果他们都不懂模式的情况下,下面是他们的对话:
木匠1: 你认为我们应该怎样制作这些抽屉呢?
木匠2: 唔,我想我们应该这样结合部分,在木材上直锯下去,然后回转45度锯,然后再直锯下去,再朝另一个方向回转45度,再直锯下去,然后……
请问,如果你听明白他们究竟在说些什么吗,如果你能听懂,那只能说你跟他们太默契了,你们是天生的搭档、好哥们^_^
让我们再来看看另一个场景,假设他们都懂模式的情况下,他们又是如何对话的呢:
木匠1: 我们应该用一个燕尾结合还是一个斜面结合?
现在木匠2说什么已经不重要的,问题已经放生了质的变化,现在很清楚了。如果你是个专业木匠我想你应该听的懂木匠1在说些什么。如果现在让你和我去做这个抽屉,我想我们是第一种情形的俩木匠,不过当我们“偷听”了第二种场景的木匠师傅的对话,我们心里似乎已经有了参考方案。现在GooGle,BaiDu真是太方便了,一查就知道燕尾结合和斜面结合是这么回事了。^_^
不知道现在大家明白了设计模式的好处没有。设计模式是针对特定的场景下的特定问题的可重复、可表达的解决方案。上面两个木匠的场景就是要做橱柜抽屉,他们遇到的问题是怎么设计抽屉的结合,已经有两个久经考验的方案“燕尾结合”和“斜面结合”,只要做抽屉,你就应该想到这两种方案并能选择使用他们。
既然设计模式这么好,我们该如何学习或者使用它呢?在讨论这个问题之前,让我们先充充电。
Martin Fowler 在其《UML Distilled》一书中定义了软件开发过程的三个不同的视角,具体内容为:
1。概念视角(conceptual view) 该视角展现了问题领域中的概念……一个概念模型可以在对实现软件有很少或毫无注意的情况下表达出来…… 这也就建议你,在这个层次讨论问题就把计算机语言给忘了吧(程序员做到这步确实需要功夫,但是客户好象天生比较容易做到^_^)。在面向对象的软件开发中,该层次定义了一系列的对象和他们的责任。
2。规格视角(specification view) 该视角看软件,只看软件的接口,不看实现。请注意哦,这里的接口可不只是Java 语言里面的 Interface接口,关于这方面不清楚的要赶紧补课,不然学习模式会感觉懵懂。在面向对象的软件开发中,该层次定义了一系列可以被其他对象或本身调用的方法。
3。实现视角(implementation view) 该视角置身代码本身。这可能是我们最常用的视角,但是在许多方面,规格视角是更好的视角。现在SSH能够盛行,与其在规格视角方面给广大用户考虑的很周到的因素不无有关。在面向对象的软件开发中,该层次就是一些代码和数据。
另外设计模式的四大元老级人物“四人团”有以下三点建议:
1。针对接口编程
2。优先使用对象组合,而不是继承
3。找到并封装变化点
模式是经验、智慧的沉淀,具有抽象性,这样才能做通用,但是模式又是针对特定场景的。拿上述两个木匠的对话来打个比方吧,假设你是一个面向对象的开发者,要想学模式,我感觉可以从以下几个方面入手:
1。要掌握模式表达的语言,这主要是针对书面的表达形式,面向对象的设计模式都是通过UML图来表达其模式含义的,如果你不懂得这些语言,好比是让你跟天上的鸟对话一样。还好,UML还是比较形象简洁的,简单熟悉他并不需要耗费你太多的精力。现在这方面的资料太多了。
2。要掌握模式表达的场景,模式是针对特定场景下特定问题的,一旦你熟悉了模式的场景,当你置身这样的环境中你才能想到你已经有这样很成熟的参考方案。
3。要掌握模式表达的方案,同一个场景可能有很多方案,具体选择哪个要根据你的具体需求来选择和配合
4。要掌握模式表达的实现,一个既定模式的实现规格是已经确定的,只有已经熟悉了他你才能顺利进行你的工作,改进你的工作。
5。要不断的实践,上述都是知识方面的准备,在实践上要多脑筋,平时要多学习模式,在工作中将模式运用到实践中,实践是检验真理的唯一标准。
6。选择良好的工具,公欲善其事,毕先利其器,良好的IDE能将系统模型用UML语言表达出来,比如JBuilder等,选择一款适合自己的就行。
7。选择良好的素材,个人觉得JDK和Spring 、Struts、Hibernate中已经包含了丰富的设计模式,而且他们和我们是那么的贴近,这些都是经的起考验的现成的好例子,何必舍近求远呢。只要你有兴趣,好学,肯努力,定会有所收获。
本来是想写篇设计模式的方法讨论文章的,写着写着竟走了样,先搁这吧,以后跟大家一起学习设计模式。
分享到:
相关推荐
本资源包含23种经典的设计模式的Swift实现,这些源码质量上乘,为学习和应用Swift设计模式提供了宝贵的参考。 1. **单例模式(Singleton)**:保证一个类只有一个实例,并提供全局访问点。在Swift中,可以使用`...
【程序员个性壁纸】是一种专为程序员群体设计的个性化桌面背景,它们通常包含了各种与编程、科技、极客文化相关的元素,旨在展现程序员独特的审美和兴趣。这类壁纸在设计上注重清晰度和大尺寸,以确保在高分辨率...
本书作者Gayle Laakmann McDowell是著名的软件从业者,曾担任谷歌资深面试官和招聘委员会成员,深谙世界顶尖科技公司的面试之道,与数百名求职者有过“交锋”,洞悉面试成败的关键所在。 本书融萃了作者在世界...
在本压缩包“行业文档-设计装置-一种大学生用书柜.zip”中,主要包含了一份名为“一种大学生用书柜.pdf”的文档,该文档详细介绍了针对大学生群体设计的一款创新书柜。书柜作为学习和生活空间的重要组成部分,其设计...
在本压缩包“行业文档-设计装置-一种纸制包装桶.zip”中,主要包含了一份名为“一种纸制包装桶.pdf”的文档,该文档详细介绍了关于纸制包装桶的设计、制造及其在工业应用中的相关知识。以下是根据这些信息提炼出的...
标题中的“行业文档-设计装置-一种利用废旧新闻纸制造高强度纸板的方法”揭示了这份文档的核心内容,即介绍了一种创新的工艺设计,目的是通过回收废旧新闻纸来制造具有高强度特性的纸板。这种技术既环保又经济,因为...
课堂活动部分,设计了一系列类似的问题,例如"3×3 + 14"和"2×6-1 = 11",让学生实践并巩固所学。这些练习有助于提高学生的计算能力和理解力,使他们能够迅速找到正确答案。 在当堂检测环节,设计了计算题和实际...
总结来说,"一种便于取用的高中生用书本袋"的设计涵盖了功能布局、人体工程学、材料选择、外观设计以及环保理念等多个方面,旨在为高中生创造一个实用、舒适、美观且环保的学习伙伴。通过这样的创新设计,不仅可以...
标题中的“一种带有推板机构的笔记本转轴模具”揭示了这个设计的独特之处在于其推板机构,这在模具设计中是一种创新的应用。推板机构在注塑成型过程中起到关键作用,它可以有效地帮助产品脱模,提高生产效率并减少...
解压后,可以直接运行jd-gui.exe启动程序,无需安装,这使得它成为开发者工具箱中的便携式工具之一。此外,JD-GUI也提供了命令行版本JD-Core,适合于自动化脚本和集成到其他开发环境中。 总的来说,JD-GUI作为一款...
这份"外墙装修装饰施工组织设计-19-外墙装饰施工方案"文档很可能是对一个具体外墙装饰工程的详细规划,下面我们将深入探讨其中可能包含的关键知识点。 1. **项目背景与目标**:文档可能会首先介绍项目的基本信息,...
标题中的“开源免费的简易中文分词系统PHP分词的上乘之选”指的是一个针对中文文本处理的软件工具,特别适用于PHP编程语言。在IT领域,中文分词是自然语言处理(NLP)的一个重要步骤,它涉及到将连续的汉字序列切...
值得一提的是,该项目的源代码质量上乘,结构清晰,遵循了良好的编程规范和设计模式。无论是对于初学者还是有一定开发经验的开发者来说,都是一个极好的学习参考对象。此外,项目还附带了详尽的说明文档,从项目背景...
标题“行业文档-设计装置-带照明灯的钢笔.zip”和描述中提到的主题是关于一种创新设计——带有照明灯的钢笔。这种设计结合了书写工具与实用照明功能,旨在提供一种方便用户在暗环境下书写的解决方案。下面将详细讨论...
jQuery是一个快速、小巧、功能丰富的JavaScript库,它的设计理念就是简化JavaScript编程。使用jQuery,开发者可以在网页上轻松实现动画效果、HTML文档遍历和操作、事件处理、AJAX交互以及跨浏览器兼容的DOM操作等。 ...
1. **选材与准备**:选择质量上乘的桑皮纸,根据设计需求剪裁成合适的尺寸。同时,准备刺绣所需的线材,如丝线、棉线等,颜色需根据设计图案进行搭配。 2. **绘制设计**:在桑皮纸上用铅笔轻轻描绘出设计草图,确保...
在Node.js环境中,生成随机整数是一项常见的任务,特别是在编程测试、模拟数据生成或加密算法中。`random-int`模块是Node.js社区中一个实用的工具,它提供了一个简单的方法来生成指定范围内的随机整数。这个模块由...
Aspose.Words 15.8.0-jdk16的核心功能之一是将Word文档转换为PDF格式。这在企业级应用中尤其重要,因为PDF是一种通用的、可移植的文件格式,能够保持文档的原始布局和样式,无论在哪种设备或操作系统上打开,都能...
涉及到一种名为“三道压面机”的机械设备,使用的软件是SolidWorks 2013(通常简称为SW13),并且提供了可编辑的设计图纸,据描述所述,这些图纸质量上乘,100%实用。 在机械设计领域,设计图纸是至关重要的,它们...