好奇设计模式的源头,做了一番搜索和调查,于是便开启了这个系列“PrintJ的设计模式之旅”。

1.模式之父

GOF(Gang of Four)

Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides合著了"Design Patterns: Elements of Reusable Object-Oriented Software"(中文版《设计模式 : 可复用面向对象软件的基础》)

。这四位大神是公认的设计模式之父。

但是,大神们又是受到了谁的启发,基于什么动机去开始这项“伟业”呢是他们发明了设计模式还是发现了设计模式呢

带着这两个问题,找到了下面这位大神。

Christopher Alexander

C.亚历山大——加州大学伯克利分校建筑学教授,环境结构中心负责人,写了"The Timeless Way of Building : Way of Building"一书(中文版《建筑的永恒之道》)。正式这本书激发了软件行业对模式的思索。

亚历山大的问题

亚历山大要解决建筑设计问题。假设你要建一所大学,必须向学生和老师解释你的设计,

  • 否则建筑工人无法将你的设计变成精妙的建筑。
  • 没有设计师能够让工人知道所有他们应该了解的知识。

由于无法将设计向所有的参与者一一解释清楚,于是你会看到一个巨大的瓦砾堆。

“如何将设计的职责在一个大型组织中进行合理分配,与此同时保证整体设计的一致性与协调性?”

这个问题同样适用于软件开发。

亚历山大的答案

亚历山大提出了“模式语言”——涵盖设计决策的一组辞典。

"A Pattern Language : Towns, Buildings, Construction"(中文版《建筑模式语言(上下) : 城镇·建筑·构造》)

书中提到了超过250个示例,通过模式语言可以进行设计交流。所有的讨论都基于同样的基础,提升了设计通用性。

模式是什么?不是什么?

  • 模式不会告诉你如何设计
  • 模式会帮助你决定需要设计哪些内容
  • 你可以自己发明(make up)模式,只要它能够让设计变得更好

对GOF设计模式的争论

GOF的23种设计模式在当时无疑是一种巨大的进步,但同时也有一些局限,比如编程语言。于是产生了一些对设计模式的争论:

  • 一些设计模式在其他编程语言中已经提供了默认实现;
  • 你会在代码里看到GOF的书中示例被到处拷贝;
  • GOF设计模式无法灵活地运用……

这里不做口水式的争论,有兴趣的看官可以参考附录中的文章。

Jeff Atwood的建议

个人觉得Jeff Atwood的建议还是挺中肯的:

学习设计模式没有问题,但务必更加深入地读懂建筑模式语言。毕竟,思考比代码更重要。

题外话

看了这么多设计模式“负面”的内容一定会有所怀疑吧。让我们再回到GOF,Eric Gamma作为先驱参与了Eclipse的设计。

虽然Eclipse中,GOF23种设计模式的痕迹已不再清晰,但Eclipse的生机勃勃说明了“模式”未死。

下一篇,我会循着GOF的足迹,带着亚历山大的精神继续设计模式之旅。

附录

PrintJ的设计模式之旅——1.模式之父的更多相关文章

  1. C#设计模式(3)——工厂方法模式

    一.概念:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 二.代码实现 namespace 设计模式之工厂方法模式 { /// <summary&g ...

  2. Java 设计模式泛谈&装饰者模式和单例模式

    设计模式(Design Pattern) 1.是一套被反复使用.多人知晓的,经过分类编目 的 代码设计经验总结.使用设计模式是为了可重用代码,让代码更容易维护以及扩展. 2.简单的讲:所谓模式就是得到 ...

  3. C#设计模式(9)——装饰者模式(Decorator Pattern)

    一.引言 在软件开发中,我们经常想要对一类对象添加不同的功能,例如要给手机添加贴膜,手机挂件,手机外壳等,如果此时利用继承来实现的话,就需要定义无数的类,如StickerPhone(贴膜是手机类).A ...

  4. atitit.设计模式(2) -----查表模式/ command 总结

    atitit.设计模式(2) -----查表模式/ command 总结 1. 应用场景: 1 1. 取代一瓦if else 1 2. 建设api rpc风格的时候儿. 1 3. 菜单是Command ...

  5. 【转】设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

    设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成 ...

  6. JavaScript设计模式-单例模式、模块模式(转载 学习中。。。。)

    (转载地址:http://technicolor.iteye.com/blog/1409656) 之前在<JavaScript小特性-面向对象>里面介绍过JavaScript面向对象的特性 ...

  7. 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

    设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...

  8. Android设计模式系列--工厂方法模式

    工厂方法模式,往往是设计模式初学者入门的模式,的确,有人称之为最为典型最具启发效果的模式.android中用到了太多的工厂类,其中有用工厂方法模式的,当然也有很多工厂并不是使用工厂方法模式的,只是工具 ...

  9. IOS设计模式之三:MVC模式

    IOS设计模式之三:MVC模式   模型-视图-控制器 这个模式其实应该叫做MCV,用控制器把model与view隔开才对,也就是model与view互相不知道对方的存在,没有任何瓜葛,他们就像一个团 ...

随机推荐

  1. Bootstrap 源码解析(转)

    1.Bootstrap的作用域 2.Bootstrap的类定义 3.Bootstrap的插件定义 4.Bootstrap的事件代理 5.Bootstrap的对象数据缓存 6.Bootstrap的防冲突 ...

  2. 如何在CentOS 5.x 中安装Windows Azure Linux Agent (WALA)

    Qing Liu  Tue, Mar 10 2015 3:06 AM 在今天的这一个章节中,我们主要讨论在CentOs 5.x 中如何安装Windows Azure Linux Agent 2.11 ...

  3. apache开源项目--PDFBox

    PDFBox是Java实现的PDF文档协作类库,提供PDF文档的创建.处理以及文档内容提取功能,也包含了一些命令行实用工具. 主要特性包括: 从PDF提取文本 合并PDF文档 PDF 文档加密与解密 ...

  4. POJ 1236 Network of Schools 有向图强连通分量

    参考这篇博客: http://blog.csdn.net/ascii991/article/details/7466278 #include <stdio.h> #include < ...

  5. [OFBiz]简介 一

    1.What is Apache OFBiz?http://ofbiz.apache.org/ 2.概述http://baike.baidu.com/view/638900.html?fromTagl ...

  6. opencv开发的程序分发给客户时所需要的dll文件

    这里主要讲在其他裸机,没有搭建开发环境机器上运行自己开发的程序. 为了测试,我专门用visualbox搭建了一个虚拟机(主机和虚拟机都是win7系统) 在发给别人程序运行出现错误:msvcp100d. ...

  7. Jquery+bootstrap实现静态博客主题

    来源:个人博客     body部分:   side部分:     文章页面: 下载链接:             Fork Git: https://github.com/dwqs/theme1   ...

  8. 解析XML最快速的方式

    采用提JAXB技术 1.根据xml生成xsd 执行:java -jar trang.jar a.xml a.xsd 2.根据java的xjc来生成实现类 执行:xjc a.xsd 注:在执行前最好把数 ...

  9. Cppcheck代码分析(2)

    功能 解析函数中的可能的代码执行流 函数实际执行中只会执行代码流中的一条流 分析: 分支语句 if-else ,switch-case 循环语句 while, do-while ,for 代码流举例 ...

  10. PHP与MySQL动态网站开发1

    PHP内嵌在HTML中,置于 <?php ?> 标签内 一般php文件扩展名.php 在body结算标签之前 对于远程服务器,可以用ftp工具传程序 打印语句 echo'Hello Wor ...