本书是面向有一定Java语言基础和一定编程经验的读者,重点介绍了面向对象的核心内容以及作者在面向对象研究中的一些新思想,全面探讨在Java程序设计中怎样使用一些重要的设计模式。作者编写本书的目的是让读者不仅学习怎样在软件设计中使用好设计模式,更重要的是让读者通过学习使用设计模式深刻地理解面向对象的设计思想,以便更好地使用面向对象语言解决设计中的诸多问题。
本书可以作为计算机相关专业研究生或高年级学生的教材,也可以作为软件项目管理人员、软件开发工程师等专业人员的参考用书。可登录www.tup.com.cn下载书中的示例代码。
目前,面向对象程序设计已经成为软件设计开发领域的主流,而学习使用设计模式无疑非常有助于软件开发人员使用面向对象语言开发出易维护、易扩展、易复用的代码,其原因是设计模式是从许多优秀的软件系统中总结出的成功的可复用的设计方案,已被成功应用于许多系统的设计中。本书是面向有一定Java语言基础和一定编程经验的读者,重点介绍了面向对象的核心内容,全面探讨在程序设计中怎样使用一些重要的设计模式。作者编写本书的目的是让读者不仅学习怎样在软件设计过程中使用好设计模式,更重要的是让读者通过学习使用设计模式深刻地理解面向对象的设计思想,以便更好地使用面向对象语言解决设计中的诸多问题。
本书共26章,前6章重点介绍了面向对象的核心内容,以及作者在面向对象研究中的一些新思想;第7章~第26章探讨在程序设计中怎样使用一些重要的设计模式。为了说明一个模式的核心实质,本书精心研究了针对每个模式的示例,以便让读者结合这样的示例更好地理解和使用模式。本书的全部示例由作者编写完成,本书示例代码及相关内容仅供学习设计模式使用。希望本书能对读者学习和使用设计模式有所帮助,并请读者批评 指正。
作 者
2013年4月
第1章 面向对象入门1
1.1 编程语言的几个发展阶段1
1.1.1 面向机器语言1
1.1.2 面向过程语言1
1.1.3 面向对象语言2
1.1.4 使用Java的必要性3
1.2 从抽象到类3
1.3 类与程序的基本结构5
1.4 使用的开发工具6
第2章 封装7
2.1 从类的角度看封装性7
2.1.1 封装数据及操作7
2.1.2 类的UML图8
2.2 从对象的角度看封装性9
2.2.1 创建对象所体现的封装性9
2.2.2 对象访问变量和调用方法所体现的封装性11
2.2.3 实例变量和类变量体现的封装性12
2.2.4 关于实例方法和类方法13
2.3 从使用者角度看封装性14
2.4 有理数的类封装15
2.4.1 Rational类15
2.4.2 用Rational对象做运算18
2.5 从访问权限看封装性19
2.5.1 访问限制修饰符19
2.5.2 加强封装性21
2.6 包与类的封装22
2.6.1 包封装22
2.6.2 引入类库中的类24
2.6.3 引入自定义包中的类24
第3章 继承、接口与多态26
3.1 子类与父类26
3.2 子类的继承性27
3.3 关于protected的进一步说明27
3.4 子类对象的特点28
3.5 隐藏继承的成员29
3.6 通过重写实现多态30
3.7 上转型对象体现多态31
3.8 通过final禁止多态33
3.9 通过super解决多态带来的问题33
3.10 接口34
3.11 接口回调体现的多态36
3.12 重载体现的多态38
第4章 组合41
4.1 引用的重要作用41
4.2 对象的组合44
4.3 组合关系和依赖关系46
4.4 组合关系是弱耦合关系47
4.5 基于组合的流水线48
4.6 汽车动态更换驾驶员50
第5章 面向对象的几个基本原则53
5.1 抽象类与接口53
5.1.1 抽象类53
5.1.2 接口54
5.2 面向抽象原则55
5.3 “开-闭”原则57
5.3.1 什么是“开-闭”原则57
5.3.2 标准、标准构件和面向标准的产品58
5.4 “多用组合,少用继承”原则61
5.4.1 继承与复用61
5.4.2 组合与复用62
5.4.3 多用组合,少用继承62
5.5 “高内聚-弱耦合”原则63
第6章 设计模式简介64
6.1 什么是设计模式64
6.2 设计模式的起源65
6.3 GOF之著作65
6.4 学习设计模式的重要性65
6.5 合理使用模式66
6.6 什么是框架67
6.7 模式分类68
6.8 设计模式资源69
第7章 策略模式70
7.1 策略模式的结构与使用70
7.1.1 策略模式的结构70
7.1.2 策略模式的使用74
7.2 策略模式的优点75
7.3 适合使用策略模式的情景75
7.4 策略模式相对继承机制的优势76
7.5 举例——加密、解密文件76
7.5.1 设计要求76
7.5.2 设计实现76
第8章 状态模式82
8.1 状态模式的结构与使用82
8.1.1 状态模式的结构82
8.1.2 状态模式的使用85
8.2 状态切换86
8.3 状态模式的优点89
8.4 适合使用状态模式的情景89
8.5 举例——模拟咖啡自动售货机89
8.5.1 设计要求89
8.5.2 设计实现90
第9章 命令模式93
9.1 命令模式的结构与使用93
9.1.1 命令模式的结构93
9.1.2 命令模式的使用97
9.2 命令接口中的撤销方法98
9.3 命令模式的优点101
9.4 适合使用命令模式的情景101
9.5 举例——控制电灯101
9.5.1 设计要求101
9.5.2 设计实现101
第10章 中介者模式105
10.1 中介者模式的结构与使用105
10.1.1 中介者模式的结构105
10.1.2 中介者模式的使用108
10.2 中介者模式的优点110
10.3 适合使用中介者模式的情景110
10.4 举例——组件交互110
10.4.1 设计要求110
10.4.2 设计实现111
第11章 责任链模式114
11.1 责任链模式的结构与使用114
11.1.1 责任链模式的结构114
11.1.2 责任链模式的使用118
11.2 责任链模式的优点118
11.3 适合使用责任链模式的情景119
11.4 举例——计算阶乘119
11.4.1 设计要求119
11.4.2 设计实现119
第12章 模板方法模式123
12.1 模板方法模式的结构与使用123
12.1.1 模板方法模式的结构123
12.1.2 模板方法模式的使用126
12.2 钩子方法127
12.3 模板方法模式的优点130
12.4 适合使用模板方法模式的情景130
12.5 举例——考试与成绩录入130
12.5.1 设计要求130
12.5.2 设计实现131
第13章 观察者模式135
13.1 观察者模式的结构与使用135
13.1.1 观察者模式的结构135
13.1.2 观察者模式的使用140
13.2 观察者模式中的“推”数据与“拉”数据141
13.3 观察者模式的优点144
13.4 适合使用观察者模式的情景145
13.5 举例——关注天气和旅游信息145
13.5.1 设计要求145
13.5.2 设计实现145
第14章 访问者模式150
14.1 访问者模式的结构与使用150
14.1.1 访问者模式的结构150
14.1.2 访问者模式的使用153
14.2 双重分派154
14.3 访问者模式的优点154
14.4 适合使用访问模式的情景155
14.5 举例——评价体检表155
14.5.1 设计要求155
14.5.2 设计实现155
第15章 装饰模式160
15.1 装饰模式的结构与使用160
15.1.1 装饰模式的结构160
15.1.2 装饰模式的使用163
15.2 使用多个装饰者164
15.3 装饰模式相对继承机制的优势165
15.4 装饰模式的优点166
15.5 适合使用装饰模式的情景166
15.6 举例——读取单词表166
15.6.1 设计要求166
15.6.2 设计实现167
第16章 组合模式171
16.1 组合模式的结构与使用171
16.1.1 组合模式的结构171
16.1.2 组合模式的使用174
16.2 组合模式的优点176
16.3 适合使用组合模式的情景176
16.4 举例——苹果树的重量及苹果的价值176
16.4.1 设计要求176
16.4.2 设计实现177
第17章 适配器模式180
17.1 适配器模式的结构与使用180
17.1.1 适配器模式的结构180
17.1.2 适配器模式的使用182
17.1.3 适配器的适配程度183
17.2 适配器模式的优点184
17.3 适合使用适配器模式的情景184
17.4 单接口适配器184
17.5 举例——Iterator接口与Enumeration接口185
17.5.1 设计要求185
17.5.2 设计实现185
第18章 外观模式188
18.1 外观模式的结构与使用188
18.1.1 外观模式的结构188
18.1.2 外观模式的使用190
18.2 外观模式的优点191
18.3 适合使用外观模式的情景191
18.4 举例——解析文件191
18.4.1 设计要求191
18.4.2 设计实现192
第19章 代理模式195
19.1 代理模式的结构与使用195
19.1.1 代理模式的结构195
19.1.2 代理模式的使用197
19.2 远程代理198
19.2.1 RMI与代理模式198
19.2.2 RMI的设计细节199
19.3 代理模式的优点203
19.4 适合使用代理模式的情景203
19.5 举例——使用远程窗口阅读文件203
19.5.1 设计要求203
19.5.2 设计实现203
第20章 享元模式207
20.1 享元模式的结构与使用207
20.1.1 享元模式的结构207
20.1.2 享元模式的使用212
20.2 享元模式的优点213
20.3 适合使用享元模式的情景213
20.4 举例——化合物213
20.4.1 设计要求213
20.4.2 设计实现214
第21章 桥接模式218
21.1 桥接模式的结构与使用218
21.1.1 桥接模式的结构218
21.1.2 桥接模式的使用221
21.2 桥接模式的优点222
21.3 适合使用桥接模式的情景222
21.4 举例——模拟电视节目222
21.4.1 设计要求222
21.4.2 设计实现222
第22章 工厂方法模式226
22.1 工厂方法模式的结构与使用226
22.1.1 工厂方法模式的结构226
22.1.2 工厂方法模式的使用229
22.2 工厂方法模式的优点230
22.3 适合使用工厂方法模式的情景231
22.4 举例——药品231
22.4.1 设计要求231
22.4.2 设计实现231
第23章 抽象工厂模式235
23.1 抽象工厂模式的结构与使用235
23.1.1 抽象工厂模式的结构235
23.1.2 抽象工厂模式的使用240
23.2 工厂方法模式的优点241
23.3 适合使用抽象工厂模式的情景242
23.4 举例——商店与西服、牛仔服242
23.4.1 设计要求242
23.4.2 设计实现242
23.4.3 模式的使用245
第24章 生成器模式247
24.1 生成器模式的结构与使用247
24.1.1 生成器模式的结构247
24.1.2 生成器模式的使用250
24.2 生成器模式的优点251
24.3 适合使用生成器模式的情景252
24.4 举例——日历牌252
24.4.1 设计要求252
24.4.2 设计实现252
第25章 原型模式259
25.1 java.lang.Object类的clone方法259
25.2 Serializable接口与克隆对象263
25.3 原型模式的结构与使用263
25.3.1 原型模式的结构263
25.3.2 原型模式的使用265
25.4 原型模式的优点266
25.5 适合使用原型模式的情景266
25.6 举例——克隆容器267
25.6.1 设计要求267
25.6.2 设计实现267
第26章 单件模式270
26.1 单件模式的结构与使用270
26.1.1 单件模式的结构270
26.1.2 单件模式的使用272
26.2 单件模式的优点273
26.3 适合使用单件模式的情景273
26.4 举例——冠军273
26.4.1 设计要求273
26.4.2 设计实现273
参考文献278