【IT168 技术文章】
不知何时开始,软件设计模式开始成为和软件架构一样火热的话题。一时间,程序员不谈设计模式不足以表其技术能力,软件设计师不谈设计模式不足以显身份。当人人都谈论这种模式,那种模式的时候,我们有没有想过是否需要模式?什么时候需要模式?需要什么样的模式?如果没有考虑过这些问题,则根本无法体会设计模式思想的精髓。
我见过一些言必谈架构、模式的人,聊天的时候总能高谈阔论。听到他们“架构”、“模式”、“反射”的说个不停,让我感觉自愧不如。后来有机会看到他们写的程序源代码才明白,原来不管讲的多么厉害的人,厉害只是存在于嘴上功夫,至于其真实水平如何,还真的不能从嘴上反映出来。古人就有“纸上谈兵”的典故,从这个典故中,我们也许可以得到一些反思。
战国时期,赵国大将赵奢曾以少胜多,大败入侵的秦军,被赵惠文王提拔为上卿。他有一个儿子叫赵括,从小熟读兵书,张口爱谈军事,别人往往说不过他。因此很骄做,自以为天下无敌。然而赵奢却很替他担忧,认为他不过是纸上谈兵,并且说:“将来赵国不用他为将罢、如果用他为将,他一定会使赵军遭受失败。”果然,公元前259年,秦军又来犯,赵军在长平(今山西高平县附近)坚持抗敌。那时赵奢已经去世。廉颇负责指挥全军,他年纪虽高,打仗仍然很有办法,使得秦军无法取胜。秦国知道拖下去于己不利,就施行了反间计,派人到赵国散布“秦军最害怕赵奢的儿子赵括将军”的话。赵王上当受骗,派赵括替代了廉颇。赵括自认为很会打仗,死搬兵书上的条文,到长平后完全改变了廉颇的作战方案,结果四十多万赵军尽被歼灭,他自己也被秦军箭射身亡。
软件设计模式和兵法一样,是前人总结下来的经验。兵法是作战策略的“模式”,是人们根据历史上的大量战争策略而提炼出来的,它代表了一般的作战思路,但绝对不是指挥作战的全部。如果我们错误的认为软件设计只需要用GoF的23种模式的话,那么最后我们设计出来的将不是软件,而是模式片断的拼凑,是没有生命的、无法工作的模块。
模式不是代码,不能通过“复制”、“粘贴”来使用,模式的使用需要软件的设计者根据实际情况进行采纳使用,在不同的情况下,需要对模式的使用进行差异化处理。作为一个优秀的设计师还要清楚自己在什么时候需要使用什么模式,只能创建一个对象的类应该使用单件模式进行设计,外观模式则可以将复杂的内部逻辑和用户界面分开,给客户程序提供一个统一编程的界面。模式能够帮助我们轻松的解决一些技术问题,当然这些问题要符合该模式的应用情境。如果待解决的问题不符合该设计模式的使用情境,而勉为其难的套用设计模式的话,就可能出现一个士兵拿着竹刀去打仗或者一个农民穿着盔甲来耕田的笑话了。
模式并不复杂也不并不难学,但是我接触过的很多人有说容易的,也有说很难的。为什么众口不一呢?他们的技术水平相差并不大,但是对设计模式认识却如此不同,甚至完全相反?那些认为设计模式很难的人大部分是因为觉得自己无法读懂并理解GoF的23种模式,而认为自己的水平很低。那些平时熟用过两三种模式的人认为设计模式就是自己用的这两种,已经滚瓜烂熟了,当然觉得容易。术有专攻,业有所长,在软件开发的实践中,不可能将所有的实际模式都用到,所以对于自己没有使用过、不需要使用的模式可以不掌握,等到需要用到它的时候,自然可以理解它了。
模式这东西既然是经验的总结,当然也就需要用经验去验证它。经验是不能纸上谈兵的,经验也不会凭空产生,同时经验也有它的适用环境。环境变了,以前的经验方法,可能会完全失效。GoF总结的设计模式有23种,但是设计模式并不是只有23种,也许在你看文章的时候,又有人总结出了一种适用于嵌入式软件设计的模式。设计模式只能被发现,而不能像某项技术专利一样而被发明,也许你在设计模式概念提出之前就已经使用了其中的某些模式,但是你可能到现在也没有意识到,如果你早于GoF之前提出设计模式的概念,现在的“四人帮”可能就变成了“五人帮”。
兵来将挡,水来土掩,世上之物,相生相克。设计模式就如同18般兵器,作为一个武林高手,并不需要18般兵器样样精通,但是一定要擅长其中的部分兵器,能够根据敌人的招数,选择合适的兵器进行出击。只有在需要使用某种模式的时候才使用,俗话说“杀鸡焉用牛刀”。过度的使用设计模式将使软件设计复杂化,降低可读性和可理解性,并不能代表一个人的水平有多高,真正的高手绝对不会使用复杂的设计来做简单的事情。
但凡是武功不高者,总喜欢舞弄新奇的兵器,以掩饰他武功的低下。没有过实战经验的人,总喜欢纸上谈兵,以显示自己的军事才能。殊不知,武功最高境界是“学习技法,而又抛弃技法,练习功法,而活用功法,练一技,修百艺,而成于自然”。要成为一个上乘的软件设计师绝对不是对设计模式的空谈阔论,而是理解设计模式、活用设计模式、思考设计模式,既而发现属于自己的设计模式。