PrintJ的设计模式之旅——1.模式之父

好奇设计模式的源头,做了一番搜索和调查,于是便开启了这个系列“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的足迹,带着亚历山大的精神继续设计模式之旅。

附录

  • DESIGN PATTERNS CRITICISM
  • Rethinking Design Patterns
  • "Design Patterns" Aren't
  • Design Patterns: When Breaking The Rules Is OK

 

转载于:https://www.cnblogs.com/printj/p/3875543.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/399184.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iOS 添加导航栏两侧按钮

self.navigationItem.leftBarButtonItem [[UIBarButtonItem alloc] initWithTitle:"首页" style:UIBarButtonItemStyleBordered target:self action:selector(popToRootView)] ;self.navigationItem.rightBarButtonItem [[UIBarButtonItem alloc] initWithTitle:&q…

java 1.6 ubuntu_ubuntu配置 Java SE 1.6

今天编译android 4.0时提示如下错误:You are attempting to build with the incorrect version of java.Your version is: java version "1.6.0_22".The correct version is: Java SE 1.6.查了一下现在已安装的java:java -versionjava version…

微信小程序 功能函数 把数字1,2,3,4换成春,夏,秋,冬

let season ‘1,2,3’;// console.log(season.length)if (season){if (season.length1){seasonChe1season.substr(0);seasonChe1 parseInt(seasonChe1)switch (seasonChe1) {case 1:(function(){seasonChe2春})()break;case 2:(function () {seasonChe2 夏})()break;case 3:(…

UVa 11549 Calculator Conundrum

大白书里面的题感觉就是没有什么固定的思路,只能认真理解学习汝佳大大的代码。 这里用的Floyd判圈法,就像插图里面的一样,两个小孩,一个快一个慢,如果实在一个环形跑道,那么快的那个最终一定会“追上”慢的…

servlet与MySQL商品管理系统_servlet和mysql实现宿舍管理系统

【实例简介】servlet mysql实现的宿舍管理系统,以及各个功能的视频录像【实例截图】【核心代码】Sushem└── Sushem├── kk 录像│ └── kk 2017-11-13 17-11-38.avi└── Sushem├── src│ ├── dao│ │ ├── BaoxiuDao.java│ │ ├──…

几个性能测试工具

我个人认为一个优秀的软件工程师必须掌握一定的测试技能。可能有的开发工程师认为测试是测试工程师的事情,不是开发工程师的事情。这种开发工程师是缺一条腿的,离开了测试工程师,你如何证明你的程序没有问题。 下面是我这两天搜集的性能测试工…

Bootstrap页面布局14 - BS按钮群组

首先看看这个代码&#xff1a; <div classbtn-group><button typebutton classbtn>计算机</button><button typebutton classbtn>网络</button><button typebutton classbtn>桌面项目</button> </div> 将功能相近的按钮分成一…

type const mysql_Mysql Explain之type详解

select version()&#xff1a;5.7.21MySQL 提供了一个 EXPLAIN 命令, 它可以对 SQL 语句进行分析, 并输出 SQL 执行的详细信息, 以供开发人员针对性优化.例如分析一条 SELECT 语句EXPLAIN 结果中的type字段Tips&#xff1a;常见的扫描方式system&#xff1a;系统表&#xff0c;…

Android Intent传递数据

刚开始看郭大神的<>,实现以下里面的一些例子.Intent传递数据. 我们利用显示的方式进行Intent的启动. 1.启动intent并输入数据. Intent intentnew Intent(MainActivity.this,TwoActivity.class);intent.putExtra("data", "hello two");startActivity(…

WCF中的标准绑定

使用过WCF的童鞋们都很清楚&#xff0c;绑定是必须的。我将这些绑定总结了下。 一、标准绑定简要说明 1.basicHttpBinding基于WS-I Basic Profile 1.1 的web服务,所需的.Net Framework版本为 3.0 以上。 2.wsHttpBinding针对改进的web服务的绑定,包括WS-Security,WS-Transactio…

PM2.5空气质量指数(AQI)是如何计算的

源&#xff1a;PM2.5空气质量指数(AQI)是如何计算的 阅读目录 AQI如何计算  空气污染指数分级标准AQI如何计算 具体要计算PM2.5空气质量指数(AQI)&#xff0c;SENBE申贝技术人员向您介绍如何计算的公式。比如当实测浓度小于等于0.035时&#xff0c;根据实测浓度50/0.035计算。…

C++对于大型图片的加载缩放尝试

Qt对于图片的操作主要集中在这几个类 QImage ,QImageReader ,QPixmap 其中QImage这个类对图片的缩放有几个很不错的技巧&#xff0c;不过对于大图片却并不好使&#xff0c;当我们去看QImage的实现代码时&#xff0c;会发现其中读取QImageReader来加载图片&#xff0c;当我们去看…

PHP移动互联网开发笔记(3)——运算符

一、PHP的运算符PHP中有丰富的运算符集&#xff0c;它们中大部分直接来自于C语言。按照不同功能区分&#xff0c;运算符可以分为&#xff1a;算术运算符、字符串运算符、赋值运算符、位运算符、条件运算符&#xff0c;以及逻辑运算符等。当各种运算符在同一个表达式中时&#x…

xadmin与mysql数据库_十八、Django3.0学习之引入xadmin

一、将xadmin导入Django工程中1.1 xadmin下载地址&#xff1a; https://github.com/sshwsfc/xadmin/tree/django2或者&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1VJPsN5GOW_xbiPb8t43oRg提取码&#xff1a;nkei1.2 下载压缩包1.3 到zip目录下&#xff0c;进行pip3 …

WebApi个人理解概要

WebApi概要Global文件的作用&#xff1a; 12345678910111213141516public class MvcApplication : System.Web.HttpApplication{protected void Application_Start(){//1.注册区域路由AreaRegistration.RegisterAllAreas();//2.注册webApi的路由WebApiConfig.Register(GlobalCo…

帮 C/C++ 程序员彻底了解链接器

为什么80%的码农都做不了架构师&#xff1f;>>> http://blog.jobbole.com/96225/ 转载于:https://my.oschina.net/lieefu/blog/547083

12306订票助手java_12306订票助手

权限信息 com.android.alarm.permission.SET_ALARM 读取日历活动和机密信息 添加或修改日历活动&#xff0c;并在所有者不知情的情况下向邀请对象发送电子邮件 完全的网络访问权限 查看网络连接 查看WLAN连接 读取您的USB存储设备中的内容 修改或删除您的USB存储设备中的内容 a…

linux安装软件包(pip, distribute, nose, virtualenv)

一、 先安装pip 1. 先去python官网下载pip&#xff0c;网站&#xff1a;https://pypi.python.org/pypi/pip#downloads&#xff0c;点击下图中的“download” 2. 然后选择下图标注的包&#xff0c;链接可以通过f12获取&#xff0c;具体如下&#xff1a; 3. 然后再linux终端输入&…

event对象获取方法

为什么80%的码农都做不了架构师&#xff1f;>>> http://www.jb51.net/article/42691.htm 转载于:https://my.oschina.net/zxin/blog/547902

【iOS开发每日小笔记(一)】UIPickerView 自动选择某个component的某个row

这篇文章是我的【iOS开发每日小笔记】系列中的一片&#xff0c;记录的是今天在开发工作中遇到的&#xff0c;可以用很短的文章或很小的demo演示解释出来的小心得小技巧。它们可能会给用户体验、代码效率得到一些提升&#xff0c;或是之前自己没有接触过的技术&#xff0c;很开心…