本书使用Java语言作为范例语言,由浅入深、循序渐进地讲解了面向对象的开发方法和分析方法。与其他讲解面向对象的书籍相比,本书的独特之处在于紧扣面向对象开发和分析方法的前沿发展,结合大量实例,讲解了设计模式、框架、UML语言等多种面向对象开发和分析的主流技术。
本书读者对象包括计算机专业高年级本科生、研究生、广大开发人员以及系统分析人员。
第1章 面向对象软件开发 1
本章概述 1
1.1 软件开发面临的挑战 1
1.2 工程的观点 3
1.3 面向对象的原则 7
1.4 迭代开发过程 8
第2章 使用UML的面向对象建模 14
本章概述 14
2.1 原理和概念 14
2.2 对关系和结构建模 21
2.3 动态行为建模 25
2.4 使用用例建立需求模型 29
2.5 案例分析:一家电子书店 31
第3章 Java简介 39
本章概述 39
3.1 Java 2平台的历史回顾 39
3.2 Java运行时构架 41
3.3 从Java开始 46
第4章 Java元素 54
本章概述 54
4.1 词法部分 55
4.2 变量和类型 62
4.3 语句 67
4.4 类声明 73
4.5 包 101
4.6 异常 105
4.7 一个简单的动画applet 111
第5章 类和继承 119
本章概述 119
5.1 方法和构造函数的重载 119
5.2 扩展类 122
5.3 扩展和实现接口 133
5.4 属性和类方法隐藏 140
5.5 应用——动画applet 141
5.6 常见问题和解决方案 154
第6章 从建立模块到建立项目 157
本章概述 157
6.1 类的设计和实现 157
6.2 契约和不变式 164
6.3 类的规范形式 172
6.4 单元测试 179
6.5 项目建立 186
第7章 使用抽象进行设计 190
本章概述 190
7.1 设计模式 190
7.2 设计通用的组件 192
7.3 抽象耦合 211
7.4 设计案例分析——排序算法的动画 218
第8章 面向对象应用程序框架 236
本章概述 236
8.1 应用程序框架 236
8.2 收 集 框 架 238
8.3 图形用户界面框架——AWT和Swing 255
8.4 输入/输出框架 281
第9章 设计案例分析:一个绘图板应用程序 305
本章概述 305
9.1 计划 305
9.2 迭代1:一个简单的涂写板 305
9.3 迭代2:菜单、选项和文件 309
9.4 迭代3:重构 325
9.5 迭代4:添加形状和工具 334
9.6 迭代5:更多的绘图工具 348
9.7 迭代6:文本工具 352
第10章 更多的设计模式 362
本章概述 362
10.1 类型安全的枚举类型 362
10.2 创建型设计模式 366
10.3 行为型模式 398
10.4 结构模式 403
第11章 并发编程 432
本章概览 432
11.1 线程 432
11.2 线程安全和活跃度 439
11.3 设计案例分析——tic-tac-toe游戏 451
第12章 分布式计算 464
本章概览 464
12.1 基于套接字的通信 464
12.2 远程方法调用 487
12.3 Java数据库连接 499
12.4 公共对象请求代理构架 508
由于对软件工程,特别是对面向对象的软件开发技术很有兴趣,我有幸得到翻译本书的机会。这对我本人来讲也是个难得的学习机会。在我的教学和工作过程中,我深深地体会到,软件工程这门课程从本科到研究生一直到工作岗位,对教师来说,一直被认为是计算机专业里很难讲的一门课;对学生来说,他们也大多觉得课上完了,可没学到什么东西。究其原因,我认为一是因为教材更新较慢,目前大部分教材的内容没有反映软件工程技术的最新发展,学生学的东西和实际工作使用的技术不能很好的衔接;二是因为软件工程是一门实践环节很重要的课程,光靠书本上的讲授很难让学生深刻地体会到软件工程的精髓。
本书是最近本人所看到的一些讲解面向对象开发技术里比较成功的一本。它基本上克服了上述缺点。一方面它基本涵盖了面向对象技术里的方方面面,从UML到设计模式、从软件开发过程到框架,包括了面向对象最近发展的最新进展;另一方面,该书不是简单地介绍概念,而是循序渐进地用实例讲解这些设计模式、框架的使用,让读者能直观地体会这些技术的使用场合和使用技巧。另外,本书使用的示例语言是Java语言,这是本书的重要特点之一。原则上讲,使用何种语言并不是关键,但Java语言能以其固有的易读性让读者把主要精力放在理解面向对象开发的技巧,而不是语言的细枝末节上。我认为这一点本书是很成功的。
当然,我们也不能寄希望于通过本书完全掌握面向对象开发技术。有人说,软件工程是一门艺术而不是科学,我们姑且不讨论这句话的对与错,至少它从一个侧面反应了软件工程技术是需要长期积累和体会才可能真正领会其精髓的。因此,在阅读本书时,最好能够结合阅读其他讲解软件工程,特别是面向对象软件开发的书籍。本书每章最后都有推荐的补充读物,读者可根据自身情况有选择地阅读。
本书在翻译过程中,得到了编辑车立红小姐的大力支持,在此表示最诚挚的谢意。同时感谢清华大学出版社给了我这个机会,让我对面向对象开发技术有了更深刻的理解。另外,微软全球技术中心的藤剑锋先生、德恒证券的潘彦先生、复旦大学的孙未未先生以及复旦德门软件有限公司的朱建秋先生参与了本书的翻译工作。在此向他们表示感谢,没有他们的辛勤工作,本书的完稿是不可想像的。最后,感谢在本书的翻译过程不断给了我鼓励和支持的所有朋友和家人。
Xiaoping Jia是DePaul大学计算机科学、电信以及信息系统学院软件工程系的软件工程专业副教授和系主任。他还是Aesthetic Software公司的创始人,这是一家致力于使用Java和XML为基于Web的应用开发技术的公司。他从Northwestern大学获得了计算机科学的博士学位。
杨茂江,2001年在复旦大学计算机科学与工程系获得软件工程专业博士学位,同年留校任教。主要兴趣和工作方向为软件工程、分布式计算以及图形图像处理。
面向对象软件开发已经发展了近20年,最近几年在很大意义上已趋于成熟。下列领域的进展在该技术的成熟过程中扮演了重要角色:
î 诸多的面向对象建模技术和表示法的演变及归一,导致产生了统一建模语言(Unified Modeling Language , UML),并成为事实上的标准。
î Gamma等人编著的《设计模式目录》一书的出版成为设计模式发展的里程碑,从而促使面向对象框架和设计模式得到了广泛采用。
î 软件界接受面向对象的开发思想在很大程度上应归功于Java语言的出现和普及。
总的来讲,面向对象技术在今天得到了前所未有的欢迎,特别是Java语言。然而,该技术的快速发展对计算机科学和软件工程专业的学生以及软件开发专业人员提出了学习上的挑战。本书旨在涵盖面向对象技术的各个方面及其内在关联性,包括使用UML的面向对象建摸,使用设计模式的面向对象设计,以及使用Java语言的面向对象编程。本书可作为计算机科学和软件工程专业的研究生入门教材以及高年级的本科生教材,同时也可作为专业开发人员的参考书。本书并不是Java语言编程的入门教材;本书的读者应当首先具备一定的编程经验,最好是C语言或C++语言。
在面向对象领域中,编程和设计是两个不同的任务;但是,它们之间的内在联系要比在传统的编程模式中紧密得多。学习使用Java语言的面向对象软件开发不仅仅局限于学习Java语言的语法和类库。面向对象开发与传统开发在思维方式上存在巨大差异,掌握它需要全新的思想方式。在本书中,我试图循序渐进地将面向对象的思想方法传授给那些通过使用设计模式使用面向对象思想的人,剖析Java类库的设计,以及演示迭代软件开发方法。我本人既是软件工程和面向对象开发的教授者,也是实践者。我的意图是从不同的视角学术界、工业界、理论和实践上,提出对面向对象软件开发的一个平衡的看法。
涵盖完整的Java语言和Java类库已经超出了本书的范围。因此,本书的重点是:
î 最重要的和最常使用的语言特性和类库。
î 使用Java类库来阐述面向对象设计原则和设计模式的应用。
本书可满足不同背景的学生对面向对象软件开发课程的不同目标要求。
î 第1章概述了面向对象软件开发所面临的挑战和解决方案。
î 第2章介绍了面向对象模式和统一建模语言(UML)。对于熟悉UML的学生来说,本章可作为一个复习。对于不熟悉UML的学生来说,本章可以作为入门读物,它包含了最重要的内容,这些内容在本书余下的章节中很有用。
î 第3~5章是为那些不熟悉Java语言,但有不同语言(如C或者C++)编程经验的学生准备的。对于那些熟悉Java语言的学生来说,这一部分内容可作为复习。
î 第6章和第7章阐述了面向对象编程和设计中的一些关键问题。第7章还介绍了几个最常用的设计模式。
î 第8章从使用框架以及运用设计模式设计框架的角度讨论了3个重要的Java框架,集合、图形用户界面以及输入/输出。
î 第9章给出了一个完整的案例分析,用以演示迭代开发过程,该过程包含了多个设计模式和多次重构。
î 第10章给出了更多的经常使用的设计模式的例子,同时给出了具体的用Java语言实现的示例。本章可用于重点讲述面向对象设计和设计模式的课程。
î 第11章和第12章讨论了Java语言的并发和分布计算。
本书在多个例子中使用了Java applet来阐述面向对象编程和设计的概念。随着Java技术的最新进展, Java applet在实践中的重要性和实用性都减弱了。但是,我认为Java applet仍然可以作为教授和学习面向对象编程和设计的有用的教学工具。因此,第2版中仍然保留了使用Java applet的大多数例子。
本版的改动
本版的主要改动包括:
î 1.4节讨论了迭代软件开发过程,包括Rational统一过程(Rational Unified Process,RUP)和极限编程(Extreme Programming,XP)。
î 第2章对统一建模语言进行了更深入的探讨,包括用例建模和用例图。
î 6.2节讨论了断言(assertion)、契约(contract)以及类的不变式(invariants of classes)。
î 6.4节和6.5节增加了单元测试和项目建立的内容。
î 第10章对设计模式进行了深入讨论。
î 第9章修改并扩充了本书第1版中的设计案例,以阐述迭代开发和重构。
标注和约定
下列字体用来代表程序代码:
1.可以逐字拷贝的代码片段是Monospace(等宽)字体。Boldface Monospace字体(粗体等宽)的代码片段是重要的或有特殊含义的。
2.直体Roman(罗马)字体的代码片段是伪代码,这是程序逻辑的非正式描述。
3.尖括号内的内容,比如:
<108页中的 doSomething()方法>
代表占位符。应该把在其他地方定义的代码片段插到这里。页码代表被插入的代码片段在哪一页被定义。
4.斜体名字,比如var,可以被任何其他特定且不同的名字所代替。
在线补充资料
本书中的所有程序都是使用Java 2软件开发工具包(J2SDK)1.4开发的。 可以从网站http://java.sun.com下载J2SDK和完整的API文档。
可以访问www.aw.com/cssupport得到本书所有例子的源代码。所有练习题的答案可提供给采用本书作为教材的教师。请与您当地的Addison-Wesley经销代理人联系以获得更多信息。