1987 年,SmallTalk社区的Ward Cunningham Kent Beck发表了一篇文章《Using Pattern Languages for Object-Oriented Programs》这标志着建筑大师的思想落户软件开发领域。

 

       设计模式的起源是建筑师Christopher Alexander 的研究,不同时代建筑师留下的伟大建筑作品中,有很多重复出现的设计,于是,他找到了一种结构化、可重用的方法来捕捉并描述这些重复的设计, 还给这些描述的结果起了一个名字叫模式(Pattern)。

     “每一个模式描述了一个在人们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能不断地使用该方案而不必做重复劳动。”软件开发者最讨厌的东西也许就是重复,于是软件开发者很容易接受了这个思想。这里说一点题外话,中国的建筑史从来不以复用为目标的,中国至今没有一本像样的古代建筑史,是因为建筑师往往要突破旧例,而这些知识却往往是独占的。所以样式雷家族的建筑图谱遗失之后,故宫的建筑能拆开但是装不上去。

      建筑大师用四个重要部分来描述一个模式:

  • 名称:就像页面元素的ID一样,提到它的时候没有歧义就够了。但是有的名字太受欢迎了,哪里都有:比如工厂模式
  • 问题:也就是模式的适用场景
  •  解决方案:从规约层面来看设计的各部分的责任和关系
  •  效果:好多书上这里都用“后果”,这个词略带贬义,我使用了“效果”。

    这种描述方式也被借鉴到了软件开发领域,我们现在看到的设计模式的描述中,也都按照这样的格式来刻画某一个设计模式的关键特征。我们知道对于具体事物的描述大体上可分为两种。一种是对事物的属性进行度量,属于定量的表示方法。另一种则是对事务所包含的成分进行分析,称为定性的描述或结构性描述。显然这种方式还是定性分析。

       这里就有一个有趣的问题了,设计模式的定义是定性的。让机器辨别事物的最基本方法是计算,原则上讲是对计算机要分析的事物与作为标准的称之为“模板”的相似程度进行计算。所以现在很多人研究设计模式自动选择时,第一件事情就是把设计模式进行量化描述。而在这种研究没有成功之前,分析、描述、判断还是人的强项,设计模式也体现了一个开发人员的价值。

 

1995年,Erich GammaRichard HelmRalph Johnson John Vlissides发表了著名的《Design PatternsElements of Reusable Object-Oriented Software》,这本书成为了设计模式的经典之作,这四位也被称为GOF.

        设计模式复用的是面向对象设计知识和经验,它是用模板描述的,在设计阶段广泛使用。设计模式的关注者主要是设计师 开发人员。面向对象技术的日益成熟使其可操作性很强,通过学习面向对象的设计原则和设计模式的描述模板开发人员可以逐渐将设计模式应用到自己的设计过程中。

       

1996 年,Michael Akroyd 发表了“AntiPatternsVaccinations against Object Misuse”的论文,提出了反模式(Anti Patterns)的概念,反模式标识了导致软件质量低劣和项目失败的不好的设计概念、技术途径和开发实践,并提出了软件重组方案。现在我桌面上有《反模式:危机中软件、架构和项目的重构》,反模式方面的资料相对设计模式太少,这本200多页的小册子也成了反模式的经典。

      设计模式的组织思路是集中以往的优秀软件的设计经验,它的思路可以简单的表达为:站在巨人的肩膀上。而反模式的思路则是:失败是成功之母。反模式复用的是软件开发失败的知识和经验,它适用的场景跨越整个软件开发过程。因而无论是开发者、设计师还是软件开发的管理者都可以从反模式中获益。基于对软件开发最常见惨痛教训的总结,这种实践特征也让反模式具有较强的可操作性。反模式的也是像设计模式一样用模板来描述,它会包含反模式名称、根源、以及重构方案等组成部分。

 

1996 年,Martin Fowler 的《Analysis PatternReusable Object Models》一书提出了分析模式的概念。去年年底我翻译了Martin Fowler的一篇经典文章《新方法论》,随即发现这位大师在好多领域都是领先者比如Ioc,比如分析模式Analysis Pattern 经常在Martin Fowler的网站上转悠收获不少。

     复用的最高境界是什么?是需求的复用。OOA中可复用的分析知识和经验是分析模式复用的内容。分析模式着眼于软件的分析和蓝图规划阶段,它不是从计算机系统的角度来看问题而是从领域工程的角度,反映的是业务过程的概念抽象而不是软件实现。所以分析模式是使用面向对象的思维方式来帮助领域专家,分析师来认识问题的,它是高度抽象的。高度抽象同时意味着它在实践中的可操作性比较差,曲高和寡,向来如此。

       

        

        做为一个开发者,从最简单的代码复用开始,坚持不懈的学习设计模式,并借力设计模式将烟囱型的系统变成一个可扩展的健壮的系统。这个过程是漫长的,艰难的,要走好多的弯路,但是追求更好的设计是大部分开发者的共同点。

        这个磨砺过程之后才有开发过程中的举重若轻,这让我想到黄庭坚的诗句:“桃李春风一杯酒,夜雨江南十年灯”,继续吧… ...