内容简介 · · · · · ·
本书内容全面,讲解鞭辟入里,独具特色,读者必将在计算机科学的宫殿中的由登堂而入室。
作者简介 · · · · · ·
四位作者均是国际公认的面向对象软件领域的专家。
Erich Gamma博士是瑞士苏黎士国际面向对象技术软件中心的技术主管。
Richard Helm博士是澳大利亚悉尼IBM顾问集团公司面向对象技术公司的成员。
Ralph Johnson博士是Urbana-Champaign伊利诺大学计算机科学系成员。
John Vlissides博士是位于纽约Hawthorne的IBN托马斯J.沃森研究中心的研究人员。
目录 · · · · · ·
Foreword
Guide to Readers
1 Introduction
2 A Case Study: Designing a Document Editor
Design Pattern Catalog
· · · · · · (更多)
Foreword
Guide to Readers
1 Introduction
2 A Case Study: Designing a Document Editor
Design Pattern Catalog
3 Creational Patterns
4 Structural Patterns
5 Behavioral Patterns
6 Conclusion
A Glossary
B Guide to Notation
C Foundation Classes
Bibliography
Index
· · · · · · (收起)
丛书信息
喜欢读"设计模式"的人也喜欢的电子书 · · · · · ·
喜欢读"设计模式"的人也喜欢 · · · · · ·
设计模式的话题 · · · · · · ( 全部 条 )



设计模式的书评 · · · · · · ( 全部 84 条 )



看了30遍后至今没再看
> 更多书评 84篇
-
复用,永远是一种诱惑,与其说是对程序员的诱惑,不如说是对公司管理层的诱惑。复用,暗示着一次投资多次回报。于是,公司投入重金和大批的技术骨干,期望开发一本万利的平台软件。软件工程里面,以变化闻名于世的,是需求。商业平台软件的项目经理们,基本无力抵抗客户和盈利的重重压力。于是乎,源源不断的各式各样新需求加入进来了,各种奇奇怪怪的bug也被创造出来了,没完没了的bug fix,让技术精英们疲于奔命,勉力维持眼...
2020-04-04 14:26
复用,永远是一种诱惑,与其说是对程序员的诱惑,不如说是对公司管理层的诱惑。复用,暗示着一次投资多次回报。于是,公司投入重金和大批的技术骨干,期望开发一本万利的平台软件。软件工程里面,以变化闻名于世的,是需求。商业平台软件的项目经理们,基本无力抵抗客户和盈利的重重压力。于是乎,源源不断的各式各样新需求加入进来了,各种奇奇怪怪的bug也被创造出来了,没完没了的bug fix,让技术精英们疲于奔命,勉力维持眼前的苟且,诗和远方的浪漫情怀与雄心壮志,早已消失殆尽。于是乎,平台软件迅速变得臃肿不堪,quanlity迅速退化,迎接它们的,只能是被嫌弃和被抛弃的命运。
Linux的开发,是另外一个故事。Linus不属于任何商业机构,不需要考虑商业回报,不会有项目进度压力,不会因为技术以外的因素来影响技术决策,所以,Linux的quality才能保持下去。如果换成一个商业机构来主持Linux开发,很难想象Linux是否还能如此成功。
什么是程序员的复用?
White-box Reuse Vs. Black-box Reuse White-box reuse: implementation inheritance.
Black-box reuse: interface inheritance + composition
Favor object composition over class inheritance
——————————————————
三种复用类型:
1. Class inheritance: include implementation inheritance and interface inheritance, R.g., Template Method
2. Object composition: Strategy
3. Parameterized Types: C++ template
———————————————————
Design reuse vs. code reuse
Code reuse: infrastructure layer
Design reuse: domain layer, application layer and interface layer
———————————————————
Smart Reuse Vs. Lazy Reuse
Smart Reuse: 领域层复用,抽象来实现服用。广泛的分析业务领域的各个场景,各个交互对象,提炼出反映业务本质的共性。当有特殊情况需要处理时,说明抽象出了问题。
Lazy Reuse:简单的贴标签。具体实现的复用。没有核心本质的共性,仅仅只是表面上相似。
回应 2020-04-04 14:26 -
细节是容易变化的,对细节的依赖会使设计失去弹性,任何一个corner case没考虑到,就会对依赖于它的众多对象们产生不可预知的影响,而最终,这种影响会扩散成系统级灾难。 肉丸的故事 你和你的好基友,知根知底,你甚至知道好基友明天会带8个肉丸到公司当午餐,你也知道你的好基友其实只能吃下6个肉丸,而你,也喜欢吃肉丸,午餐也要吃6个肉丸,由于你知道你的好基友会多出2个肉丸,于是,你决定只带4个肉丸去公司做午餐。不幸...
2020-04-04 10:03
细节是容易变化的,对细节的依赖会使设计失去弹性,任何一个corner case没考虑到,就会对依赖于它的众多对象们产生不可预知的影响,而最终,这种影响会扩散成系统级灾难。
肉丸的故事
你和你的好基友,知根知底,你甚至知道好基友明天会带8个肉丸到公司当午餐,你也知道你的好基友其实只能吃下6个肉丸,而你,也喜欢吃肉丸,午餐也要吃6个肉丸,由于你知道你的好基友会多出2个肉丸,于是,你决定只带4个肉丸去公司做午餐。不幸的是,你的好基友在上班路上摔了一跤,午餐盒摔烂了,8个肉丸全洒了。谁也不知道自己什么时候会摔跤,这就是个corner case。于是,你的好基友要求你分一半的肉丸给他做午餐,你的午餐变得只剩2个肉丸,注定下午饿肚子。问题是,下午4点你请了假,去参加一场重要的网球比赛,这场比赛对你非常重要,它的结果会决定你能不能从业余组晋升到职业组。考虑到你的年龄,这是你最后的机会。赢了,你就可以变成职业网球运动员,像德约科维奇一样赢取公开赛冠军,拿千万年薪;输了,就只能认命了,在公司搬一辈子砖。由于中午没吃饱,没体力,这场重要的比赛毫无悬念的输了,最终,你不得不在公司搬一辈子砖。回顾整个经历,你会懊悔,为什么不好基友吃好基友的肉丸你自己吃自己的肉丸,不必要的依赖,毁掉了你进军职业网球界的人生梦想。
教训啊!
针对接口编程,不要针对具体实现编程。
当你和你的好基友,需要协作完成一个具体任务时,通过必要的接口进行交互,你不需要关心你的好基友中午是吃肉丸还是排骨,他的肉丸洒了,只会影响他,不会影响到你。
同样的,各对象通过接口互相协作,完成具体事情,对象内部的实现细节,各自负责。这,就是封装的意义。
对象的创建过程,特别是复合对象的创建,无疑是涉及到具体细节。creational patterns(factory method, abstract factory builder, prototype and singleton),正是为了解决如何有效封装创建对象的这一细节而提出的。
回应 2020-04-04 10:03 -
例子:可口可乐流水线给瓶子拧盖子。 流水线的机械臂不需要知道自己拧的是可口可乐,健怡可乐,零度可乐还是雪碧,它只需要提取关于各种饮料瓶的特征参数,如瓶子的高度,瓶盖的直径等对流水线机械臂产生影响的参数,其他诸如饮料品牌、瓶盖颜色等,跟该场景的目标(拧紧盖子)无关,这无需考虑。 1. 提取特征的过程,就是抽象的过程。 2. 这组特征参数,就是接口,机械臂根据这组参数来设置机械臂的坐标、角度和力度,这个过程...
2020-04-04 09:44
例子:可口可乐流水线给瓶子拧盖子。
流水线的机械臂不需要知道自己拧的是可口可乐,健怡可乐,零度可乐还是雪碧,它只需要提取关于各种饮料瓶的特征参数,如瓶子的高度,瓶盖的直径等对流水线机械臂产生影响的参数,其他诸如饮料品牌、瓶盖颜色等,跟该场景的目标(拧紧盖子)无关,这无需考虑。
1. 提取特征的过程,就是抽象的过程。
2. 这组特征参数,就是接口,机械臂根据这组参数来设置机械臂的坐标、角度和力度,这个过程就是,映射到OO,就是针对接口编程。
3.机械臂不需要知道饮料瓶子对象的品牌,瓶子颜色等无关细节,瓶子对象也不需要知道机械臂的各种参数设定细节,这体现了OO封装的思想。各个对象,例如机械臂和瓶子对象,互相隐藏实现细节,而通过接口互相协作,完成目标。
回应 2020-04-04 09:44
-
刚读过第2章。这一章以设计一个所见即所得的文档编辑器为例,将第3章起的很多设计模式的应用场景都串了起来。不过还是有几处让我困惑的地方: 1. Composite Pattern完全就是在实现一个树结构。只要是需要用树来作为数据结构的地方,肯定都会采用这种设计模式。干脆直接叫Tree Pattern好了。我都读过Composite Pattern那一章了,还不太清楚这跟实现一颗普通的树有啥区别。可能这个模式强调的是,树中的所有节点对外都是一个统一...
2013-07-22 23:29
刚读过第2章。这一章以设计一个所见即所得的文档编辑器为例,将第3章起的很多设计模式的应用场景都串了起来。不过还是有几处让我困惑的地方: 1. Composite Pattern完全就是在实现一个树结构。只要是需要用树来作为数据结构的地方,肯定都会采用这种设计模式。干脆直接叫Tree Pattern好了。我都读过Composite Pattern那一章了,还不太清楚这跟实现一颗普通的树有啥区别。可能这个模式强调的是,树中的所有节点对外都是一个统一的接口,每个节点内部的实现可以各自不同。 2. Strategy Pattern和Bridge Pattern在这一章里给我感觉十分相似。2.9节小结里写道,Strategy的作用是“allow different formatting algorithms”,Bridge的作用是“allow multiple windowing platforms”。其实都可归结为“allow different XXX”。不同的视窗平台蕴含着的其实就是不同的绘制实现,2.6节的代码例子也说明了这点。实际上2.3节的Strategy UML图和2.6节的Bridge UML图也非常相似。不过在后面章节里,这两个模式却很不一样,而且Strategy被归到了行为模式,Bridge被归到了结构模式。希望读到后面时能找到答案。
回应 2013-07-22 23:29 -
之前读第2章A Case Study的时候就已经基本理解了抽象工厂模式的思想。这一章对我而言比较新的内容倒是Smalltalk利用自身的类为一等公民和动态类型的特性,使用原型(Prototype)的思路来实现抽象工厂的方法。 Known Uses这一节提到,ET++使用了抽象工厂模式来实现不同窗口系统(如X Windows和SunView)之间的可移植性。不过在第2章2.6节里,作者却是使用桥接模式(Bridge Pattern)来实现同样目的的,理由是不同窗口系统之间的...
2013-08-08 07:21
-
我把这一章读了两遍才感觉理解了原型模式的含义,可能是因为实践中没怎么碰到过这种模式。不过Consequences一节写道的原型模式的其中两点好处还是挺让我糊涂:Specifying new objects by varying values和Specifying new objects by varying structure。要是能就这两点举个代码上的例子就好了。可惜篇幅有限。
2013-08-15 21:05
-
luckyV (红断香消,雪落枝头)
151-161 Bridge Decouple an abstraction from its implementation so that the two can vary independently. I want to say I like the original English book.2012-11-26 10:14
-
复用,永远是一种诱惑,与其说是对程序员的诱惑,不如说是对公司管理层的诱惑。复用,暗示着一次投资多次回报。于是,公司投入重金和大批的技术骨干,期望开发一本万利的平台软件。软件工程里面,以变化闻名于世的,是需求。商业平台软件的项目经理们,基本无力抵抗客户和盈利的重重压力。于是乎,源源不断的各式各样新需求加入进来了,各种奇奇怪怪的bug也被创造出来了,没完没了的bug fix,让技术精英们疲于奔命,勉力维持眼...
2020-04-04 14:26
复用,永远是一种诱惑,与其说是对程序员的诱惑,不如说是对公司管理层的诱惑。复用,暗示着一次投资多次回报。于是,公司投入重金和大批的技术骨干,期望开发一本万利的平台软件。软件工程里面,以变化闻名于世的,是需求。商业平台软件的项目经理们,基本无力抵抗客户和盈利的重重压力。于是乎,源源不断的各式各样新需求加入进来了,各种奇奇怪怪的bug也被创造出来了,没完没了的bug fix,让技术精英们疲于奔命,勉力维持眼前的苟且,诗和远方的浪漫情怀与雄心壮志,早已消失殆尽。于是乎,平台软件迅速变得臃肿不堪,quanlity迅速退化,迎接它们的,只能是被嫌弃和被抛弃的命运。
Linux的开发,是另外一个故事。Linus不属于任何商业机构,不需要考虑商业回报,不会有项目进度压力,不会因为技术以外的因素来影响技术决策,所以,Linux的quality才能保持下去。如果换成一个商业机构来主持Linux开发,很难想象Linux是否还能如此成功。
什么是程序员的复用?
White-box Reuse Vs. Black-box Reuse White-box reuse: implementation inheritance.
Black-box reuse: interface inheritance + composition
Favor object composition over class inheritance
——————————————————
三种复用类型:
1. Class inheritance: include implementation inheritance and interface inheritance, R.g., Template Method
2. Object composition: Strategy
3. Parameterized Types: C++ template
———————————————————
Design reuse vs. code reuse
Code reuse: infrastructure layer
Design reuse: domain layer, application layer and interface layer
———————————————————
Smart Reuse Vs. Lazy Reuse
Smart Reuse: 领域层复用,抽象来实现服用。广泛的分析业务领域的各个场景,各个交互对象,提炼出反映业务本质的共性。当有特殊情况需要处理时,说明抽象出了问题。
Lazy Reuse:简单的贴标签。具体实现的复用。没有核心本质的共性,仅仅只是表面上相似。
回应 2020-04-04 14:26 -
细节是容易变化的,对细节的依赖会使设计失去弹性,任何一个corner case没考虑到,就会对依赖于它的众多对象们产生不可预知的影响,而最终,这种影响会扩散成系统级灾难。 肉丸的故事 你和你的好基友,知根知底,你甚至知道好基友明天会带8个肉丸到公司当午餐,你也知道你的好基友其实只能吃下6个肉丸,而你,也喜欢吃肉丸,午餐也要吃6个肉丸,由于你知道你的好基友会多出2个肉丸,于是,你决定只带4个肉丸去公司做午餐。不幸...
2020-04-04 10:03
细节是容易变化的,对细节的依赖会使设计失去弹性,任何一个corner case没考虑到,就会对依赖于它的众多对象们产生不可预知的影响,而最终,这种影响会扩散成系统级灾难。
肉丸的故事
你和你的好基友,知根知底,你甚至知道好基友明天会带8个肉丸到公司当午餐,你也知道你的好基友其实只能吃下6个肉丸,而你,也喜欢吃肉丸,午餐也要吃6个肉丸,由于你知道你的好基友会多出2个肉丸,于是,你决定只带4个肉丸去公司做午餐。不幸的是,你的好基友在上班路上摔了一跤,午餐盒摔烂了,8个肉丸全洒了。谁也不知道自己什么时候会摔跤,这就是个corner case。于是,你的好基友要求你分一半的肉丸给他做午餐,你的午餐变得只剩2个肉丸,注定下午饿肚子。问题是,下午4点你请了假,去参加一场重要的网球比赛,这场比赛对你非常重要,它的结果会决定你能不能从业余组晋升到职业组。考虑到你的年龄,这是你最后的机会。赢了,你就可以变成职业网球运动员,像德约科维奇一样赢取公开赛冠军,拿千万年薪;输了,就只能认命了,在公司搬一辈子砖。由于中午没吃饱,没体力,这场重要的比赛毫无悬念的输了,最终,你不得不在公司搬一辈子砖。回顾整个经历,你会懊悔,为什么不好基友吃好基友的肉丸你自己吃自己的肉丸,不必要的依赖,毁掉了你进军职业网球界的人生梦想。
教训啊!
针对接口编程,不要针对具体实现编程。
当你和你的好基友,需要协作完成一个具体任务时,通过必要的接口进行交互,你不需要关心你的好基友中午是吃肉丸还是排骨,他的肉丸洒了,只会影响他,不会影响到你。
同样的,各对象通过接口互相协作,完成具体事情,对象内部的实现细节,各自负责。这,就是封装的意义。
对象的创建过程,特别是复合对象的创建,无疑是涉及到具体细节。creational patterns(factory method, abstract factory builder, prototype and singleton),正是为了解决如何有效封装创建对象的这一细节而提出的。
回应 2020-04-04 10:03 -
例子:可口可乐流水线给瓶子拧盖子。 流水线的机械臂不需要知道自己拧的是可口可乐,健怡可乐,零度可乐还是雪碧,它只需要提取关于各种饮料瓶的特征参数,如瓶子的高度,瓶盖的直径等对流水线机械臂产生影响的参数,其他诸如饮料品牌、瓶盖颜色等,跟该场景的目标(拧紧盖子)无关,这无需考虑。 1. 提取特征的过程,就是抽象的过程。 2. 这组特征参数,就是接口,机械臂根据这组参数来设置机械臂的坐标、角度和力度,这个过程...
2020-04-04 09:44
例子:可口可乐流水线给瓶子拧盖子。
流水线的机械臂不需要知道自己拧的是可口可乐,健怡可乐,零度可乐还是雪碧,它只需要提取关于各种饮料瓶的特征参数,如瓶子的高度,瓶盖的直径等对流水线机械臂产生影响的参数,其他诸如饮料品牌、瓶盖颜色等,跟该场景的目标(拧紧盖子)无关,这无需考虑。
1. 提取特征的过程,就是抽象的过程。
2. 这组特征参数,就是接口,机械臂根据这组参数来设置机械臂的坐标、角度和力度,这个过程就是,映射到OO,就是针对接口编程。
3.机械臂不需要知道饮料瓶子对象的品牌,瓶子颜色等无关细节,瓶子对象也不需要知道机械臂的各种参数设定细节,这体现了OO封装的思想。各个对象,例如机械臂和瓶子对象,互相隐藏实现细节,而通过接口互相协作,完成目标。
回应 2020-04-04 09:44
这本书的其他版本 · · · · · · ( 全部8 )
-
机械工业出版社 (2000)9.1分 3986人读过
-
Addison Wesley (1994)9.2分 341人读过
-
机械工业出版社 (2007)9.2分 145人读过
-
Pearson Education (2000)9.2分 32人读过
在哪儿借这本书 · · · · · ·
以下书单推荐 · · · · · · ( 全部 )
谁读这本书?
二手市场
订阅关于设计模式的评论:
feed: rss 2.0
0 有用 _ 2015-08-02
值得反复阅读的书!
0 有用 Roger 2012-12-30
由于做的项目少,平时用到的模式主要也就Factory和Singleton等少数几个
0 有用 luckyV 2013-01-16
设计模式书,还是觉得最爱《Java与模式》,其它的都不够细致与全面。
0 有用 戈多 2009-03-09
TTL推荐数目三之三 看出点意思了。只要坚持着读,多少会有点收获。 和UML与模式应用一块读,清晰多了。 第二次放下。
1 有用 abing 2008-02-04
永远的计算机藏书
0 有用 [已注销] 2020-12-14
厕所读物,very nice
0 有用 补天手 2020-05-07
设计模式字典, 入门读起来略吃力。值得反复回味
0 有用 Neil 2019-04-14
设计模式是编程的成功套路经验,而算法是编程的本质。
1 有用 懒猫 2018-02-27
Bible级别书籍,惜字如金
0 有用 豆沙包 2017-06-14
粗读了一遍就感觉很有感触,准备有时间在看看,果然过了一段时间很多都忘记了,还要重新读过