描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787302492139丛书名: 清华计算机图书译丛
? 易读性强,内容引人入胜,以读者易于理解的语言解释概念。? 深入涵盖所有重要主题,如软件开发生命周期、对象和类的标识、面向对象的图表、UML及其应用。? 采用实践方法介绍概念,包含丰富的应用场景和实际案例。? 在每章开始处提供概念图,让学生形象了解知识的层次结构。? 提供独有的渐进式练习题,按记住、理解、应用和分析4个层次循序渐进。? 讲述了如何将伪代码UML示例转换为编程示例。
读者始终保持阅读兴趣。本书涵盖了采用*版本UML 2编制的案例研究、
活动模型和诸多图表,同时进行了必要的拓展,不仅包括了构成课程的必要
元素,还提供了诸多教学特色,适合用作高等院校教材。
* 易读性强,内容引人入胜,以读者易于理解的语言解释概念。
* 涵盖所有重要主题,如软件开发生命周期、对象和类的标识、面向对
象的图表、UML及其应用。
* 采用实践方法介绍概念,包含丰富的应用场景和实际案例。
* 在每章开始处提供概念图,让学生形象了解知识的层次结构。
* 提供独有的渐进式练习题,按记住、理解、应用和分析4个层次循序
渐进。
* 讲述了如何将伪代码UML示例转换为编程示例。
目录
第1章 统一软件过程 1
1.1 软件开发过程基础 1
1.1.1
瀑布模型 2
1.1.2
增量模型 3
1.1.3
演化模型 3
1.1.4
敏捷模型 4
1.2
RUP简介 5
1.3 统一软件过程组件 5
1.4 统一过程模型的生命周期阶段 6
1.4.1
初始阶段 6
1.4.2
细化阶段 7
1.4.3
构造阶段 9
1.4.4
交付阶段 9
1.5 面向对象图在RUP中的应用 10
小结 11
多选题 11
练习 13
第2章 面向对象开发的理论基础 15
2.1 结构化方法和面向对象方法的对比 16
2.1.1
结构化方法 16
2.1.2
面向对象方法 18
2.2 软件开发过程中的面向对象 19
2.2.1
为什么需要面向对象方法 19
2.2.2
算法和面向对象方法在抽象上的区别 19
2.2.3
算法和面向对象方法在分解上的区别 19
2.2.4
算法和面向对象方法在层次上的区别 20
2.3 面向对象的特点 21
2.4 面向对象中的基本实体 21
2.4.1
什么是类 21
2.4.2
什么是对象 22
2.4.3
属性 23
2.4.4
方法 24
2.4.5
接口 25
2.4.6
包 26
2.4.7
组件 27
2.4.8
访问说明符/可见性控制 27
2.5 面向对象的构造 28
2.5.1
抽象 28
2.5.2
封装 29
2.5.3
信息隐藏 30
2.5.4
层次 31
2.5.5
多态 33
2.5.6
消息传递 34
2.6 选择面向对象开发的因素 35
2.7 案例研究 35
小结 41
多选题 42
练习 44
第3章 面向对象分析与设计中类和对象的识别 45
3.1 问题域的面向对象分析 46
3.2 用于类和对象识别的面向对象分析技术 49
3.2.1
基于抽象的分析 50
3.2.2
实体分析 51
3.2.3
基于场景的分析 51
3.2.4
基于操作的分析 53
3.2.5
基于问题域的分析 53
3.2.6
基于CRC卡的分析 55
3.2.7
基于数据流和控制流的分析 56
3.2.8
基于名词-动词的分析 57
3.3 问题域的面向对象设计 57
3.4 面向对象设计的设计原则 58
3.4.1
开闭原则(OCP) 58
3.4.2
Liskov替代原则(LSP) 59
3.4.3
依赖性倒置原则(DIP) 59
3.4.4
接口分离原则(ISP) 59
3.4.5
发布重用等效原则(REP) 60
3.4.6
共同封闭原则(CCP) 60
3.4.7
共同重用原则(CRP) 60
3.5 类和对象的识别和细化过程中的设计模式 61
3.5.1
设计模式介绍 61
3.5.2
设计模式——创建型 63
3.5.3
设计模式——结构型 66
3.5.4
设计模式——行为型 68
3.6
OOA技术的案例研究 72
小结 74
多选题 75
练习 80
第4章 UML建模 81
4.1 分析和设计阶段 82
4.1.1
问题领域理解 82
4.1.2
传统的分析和设计方法及模型 82
4.1.3
良好的分析具有的特点 84
4.1.4
传统方法的缺陷 85
4.2 基于UML的面向对象分析和设计 86
4.3 可视化建模 86
4.4 图形符号系统 87
4.4.1
Booch表示法 88
4.4.2
对象管理技术(OMT) 88
4.4.3
统一建模语言(UML) 88
4.5 将UML用作一个有效的建模工具 90
4.6 理解UML图 91
4.6.1
结构图 92
4.6.2
行为图 92
4.7 对OOA和OOD的支持 93
4.8
UML中的众多图表 94
4.9
UML的范围 95
4.9.1
已解决的问题 95
4.9.2
案例研究1 95
4.9.3
案例学习2 96
小结 96
多选题 97
练习 99
第5章 面向对象分析——基于场景的模型 100
5.1 用例分析 100
5.1.1
用例 100
5.1.2
用例的重要性 101
5.2 主用例图 101
5.3 次用例图 103
5.4 用例图中使用的符号 104
5.4.1
系统 104
5.4.2
参与者 105
5.4.3
用例 106
5.4.4
关系 106
5.5 用例图的目的 110
5.6 如何绘制用例图 111
5.7 案例研究 111
5.8 已解决的问题 118
小结 120
多选题 120
练习 125
第6章 面向对象设计——逻辑模型 127
6.1
UML类图 127
6.1.1
类实例 128
6.1.2
类图——结构化的表示 128
6.2 类图中使用的基本符号 128
6.2.1
类 128
6.2.2
抽象类 130
6.2.3
标准的类构造型 130
6.2.4
非标准的类构造型 131
6.2.5
类模板 132
6.2.6
接口 133
6.2.7
对象 134
6.2.8
数据类型 134
6.2.9
属性 136
6.2.10
分类器属性 136
6.2.11
关联属性 137
6.2.12
限定符 137
6.2.13
多重性 137
6.2.14
操作 138
6.2.15
抽象操作 140
6.2.16
约束 140
6.2.17
多重性 141
6.2.18
可见性 141
6.2.19
UML关联 142
6.2.20
关联终端 143
6.2.21
可导航性 144
6.2.22
不推荐的可导航性惯例 144
6.2.23
元数 145
6.2.24
共享聚合和复合聚合 146
6.2.25
关联类 147
6.2.26
链接 147
6.2.27
UML中的泛化 148
6.2.28
继承 148
6.2.29
UML中的依赖关系 149
6.2.30
使用 150
6.2.31
必需的接口 152
6.2.32
UML中的抽象 152
6.2.33
实现 153
6.2.34
接口实现 153
6.2.35
跟踪 154
6.3 目的 154
6.4 类图构造指南 154
6.4.1
在结构化视图中构建类图的清单 155
6.4.2
识别和建模类 155
6.4.3
识别和建模关联 156
6.4.4
定义属性 156
6.4.5
列出所需的查询和输入 157
6.4.6
制定查询和输入 157
6.4.7
进行信息分析 158
6.4.8
整合类图 159
6.4.9
验证类图 159
6.5 已解决的案例研究 159
小结 160
多选题 161
练习 163
第7章 交互图 167
7.1 交互图 167
7.1.1
序列图 168
7.1.2
协作图 182
7.1.3
决定交互图的范围 185
7.2 已解决的案例研究 186
小结 188
多选题 188
练习 190
第8章 面向对象设计——行为设计 194
8.1 状态图 194
8.1.1
状态图中使用的符号 195
8.1.2
状态图的作用 199
8.1.3
绘制状态图的指导原则 199
8.1.4
状态图的应用 199
8.1.5
案例研究——手机监控软件 200
8.2 活动图 202
8.2.1
活动图的类型 203
8.2.2
活动图中使用的符号 203
8.2.3
活动图的作用 210
8.2.4
绘制活动图的指导原则 210
8.2.5
活动图、序列图和状态图之间的对比 211
8.2.6
案例研究——手机监控软件 212
8.3 已解决的案例研究 214
小结 216
多选题 217
练习 220
第9章 面向对象设计——物理图 221
9.1 包图 222
9.1.1
包图中使用的表示法 222
9.1.2
包图的作用 226
9.1.3
绘制包图的指导方针 226
9.1.4
案例研究 227
9.2 组件图 228
9.2.1
组件图中使用的表示法 228
9.2.2
UML 2.0中的高级表示法 229
9.2.3
组件图的作用 231
9.2.4
绘制组件图的指导方针 231
9.2.5
案例研究——组件图 232
9.3 部署图 235
9.3.1
部署图中的表示法 235
9.3.2
部署图的作用 238
9.3.3
绘制部署图的指导方针 238
9.4 案例研究 239
9.5 已解决的案例研究 240
小结 241
多选题 242
练习 247
第10章 面向对象开发示例 248
10.1
在现实世界中应用类和对象 248
10.2
IT服务台 248
10.2.1
产品概述 248
10.2.2
项目的范围 249
10.2.3
组件 249
10.2.4
基于角色的特定要求 250
10.2.5
产品功能 251
10.2.6
用例图 251
10.2.7
类图 261
10.2.8
序列图 263
10.2.9
活动图 274
10.3
保险索赔管理系统 283
10.3.1
描述 283
10.3.2
功能需求 283
10.3.3
用例图 284
10.3.4
使用UML的逻辑设计 287
10.3.5
使用UML的行为设计 290
10.4
工作流管理系统 296
10.4.1
描述 296
10.4.2
产品功能 296
10.4.3
功能需求 297
10.4.4
用例图 298
10.4.5
使用UML的逻辑设计 303
10.4.6
行为模型——使用UML的交互图 304
10.4.7
使用UML的行为设计 312
10.4.8
包图 321
10.4.9
组件图 323
10.4.10
部署图 323
10.5
桌面应用程序/工具开发——PreClean工具 324
10.5.1
描述 324
10.5.2
功能需求 325
10.5.3
模块描述 325
10.5.4
用例图 328
10.5.5
使用UML的逻辑设计 331
10.5.6
使用UML的行为设计 336
10.5.7
包图 341
10.5.8
组件图 342
10.5.9
部署图 342
术语表 344
VI
UML面向对象分析与设计
VII
目录
前 言
一、简介
在当今世界,计算机化系统和软件已经变得密不可分,后者成为驱动前者的工具。遗
憾的是,软件并不能被所有人轻松利用。人们需要编写它、理解它、分析它、使用它和更
新它来应对未来版本的变更。正是这个人类和编程世界的交织把建模复杂系统摆到了构造
层面,其级别要高于“普通”的编程语言。这也提出了对方法学的需求,以此引导软件工
程师和编程人员处理建模过程本身。
为了设计一个高级建模方法,需要一种专家图表式推理。单靠图表或流程图的帮助来
进行解释并不够。图表语言都很重要,可以通过对验证和分析的计算机化支持来理解它们。
多年来,结构化分析(Structured Analysis,SA)和面向对象分析(Object Oriented
Analysis,OOA)被认为在高级方法中占主导地位。SA在20世纪70年代由DeMarco、
Yourdo等人提出,它基于以图形的方式将传统的过程化编程概念“提升”到建模级别。这
就要求通过功能分解和信息流来建模系统结构,并用数据流图进行描述。面向对象分析与
设计(也称为面向对象建模)在20世纪80年代后期问世。系统结构的基本思想是以图形
的方式将面向对象编程中的概念“提升”到建模级别。
现在,面向对象方法学已经成功地组合成通用的UML,目的是想结合各种面向对象建
模方法的优点。这是一个突破性的成果,因为越来越多的软件工程师现在声称有更多种类
的软件可以以面向对象方式开发和使用。
为了捕获系统结构,UML对类和对象采用了一种图表化语言,该语言基于实体关系方
法。对于早期阶段行为分析,它推荐了使用用例和序列图。而另一方面,对于行为的完整
构造规范,它采用了状态图,这样可以在上述可执行对象建模工作中进行修改。
伴随着近年来UML的流行浪潮,将会有大量书籍、报纸、报告、研讨会和工具来描
述、利用和说明UML。在目前市面上的众多图书中,本书凭借其组织和呈现思想的方式而
独树一帜。
二、关于本书
本书通过UML解释面向对象分析与设计的主题,同时通过对主题的创新方法来吸引
读者的兴趣。本书为读者提供了一些可以从理论上掌握并应用到现实生活中的章节内容。
系统分析和设计是在面向对象方法环境中必须采取的活动。前4章在此上下文中基于面向
开发范例进行信息系统的开发。
本书每一章的开头都有一个概念图以及学习目标,这清晰说明在后续章节中会介绍的
主题,同时也指出它们的重要性。这是一个额外的优势,因为它为面向对象的主题打下了
一个坚实的基础。章末的练习分为“牢记”“应用”“分析”“实践”部分,用来测试学生的
理解程度。第10章给出的已解决的示例既可帮助学生,也可帮助教师。他们所掌握的知识
可应用到所有应用程序领域。提供的示例并不是相近的示例集,而是选自不同的公司项目,
所以属于实践知识部分。因此,提供的解决方案可以用于任意相似类型的应用程序。这些
特色使得本书成为一种有关面向对象软件开发方法的全面而有帮助的资料。
本书对于学习“计算机科学”“信息技术”和“计算机应用”课程的学生来说是非常有
用的学习资料。它对于想理解业务信息系统如何开发的人或者想知道UML工具如何帮助
设计的编程人员来说也很有用。每天需要与系统开发人员沟通的业务分析师和客户同样可
参考本书。
本书介绍了UML图最实用的部分、每个图的作用、绘制它们的符号以及如何使用现
实生活中的案例研究来应用它们。UML为业务和技术方面的专业人员提供了一个共同基
础。在合适的地方提供的示例和案例研究对于建立通用语言非常实用和有帮助。它们还通
过分解图表和清晰解释为什么和如何使用图表描述关键业务系统。
三、本书特色
易于阅读、引人入胜和一致的语言。
深入覆盖了所有重要的主题,如软件开发生命周期、对象和类的识别、面向对象的
图、UML及其应用。
案例研究、示例和现实情形中应用的实用方法。
每章章首的概念图,使得学生可以形象地了解概念的层次结构。
独特的分级练习,分为“牢记”“理解”“应用”“分析”部分。
解释了如何将伪代码UML示例转换为编程示例。
四、本书组织结构
本书由10章组成。第1章介绍各种软件生命周期开发,特别是开发软件的统一软件过
程的重要性以及相关概念。第2章指出OOA区别于SA之处、选择面向对象方法的根据以
及类、抽象和实例。第3章解释如何进行现实世界的建模,以及识别系统中类和实例的OOA
和OOD部分概念。第4章全面讲述UML建模工具,并且与其他可视化建模工具作对比,
介绍其对面向对象软件开发的支持。第5~8章以系统的方式详细讨论UML中可用的各种
图表元素,也就是可用的符号,以及每种表示法的用法和应用。所有这些图都通过贯穿全
书的案例研究来解释,因此读者可以对所有UML图有更好的和完整的理解。第9章通过
案例研究讨论包图、组件图和部署图。第10章介绍4个特殊的案例研究,包括桌面应用程
序、内联网应用程序、客户机-服务器应用程序以及基于Web的应用程序。这些问题是从
现实项目中选取出来的,当学生在不同公司实习时可帮到他们。另外,对这些系统的完整
面向对象分析与设计(包括UML图集)也一并提供。
五、网络资源
学生和老师可通过http://www.mhhe.com/jeya_mala/ooad获取下列资源。
Rational
Rose Tool Kit——指导如何用于UML图(与书结合在一起)
按章节分类的测试
参考资料的链接
案例研究
PowerPoint幻灯片
作者视频的链接
作 者
II
UML面向对象分析与设计
III
前 言
面向对象(OO)的软件开发需要开发人员使用面向对象编程(OOP)技术编写程序。自然地,任何编程规程都需要事先做好成功的分析和设计。同样地,使用OOP开发软件,必须非常小心地进行面向对象分析(OOA)和面向对象设计(OOD)这两个重要的初步阶段。因为这两个阶段在识别给定问题域的类和对象方面起着至关重要的作用,涉及各种技术,所以本章将讨论这些技术的有效性。如图3.1所示。 图3.1 基于面向对象分析和设计的软件开发阶段
3.1 问题域的面向对象分析面向对象的程序由对象组成。对象是真实世界的一个实体,用于打包数据以及对该数据进行操作的方法或过程。在各种面向对象的编程范例中,这些数据和过程以不同的方式命名:在C 中,数据——成员数据;过程——成员函数。在Java中,数据——属性;过程——方法。在C#中,数据——属性、字段;过程——属性、方法和索引器。问题域中的每个对象将通过方法调用或消息传递相互协作。当一个对象通过来自另一对象的请求调用方法时,该操作由被调用的对象执行。调用的对象称为客户端,被调用的对象称为服务器。对象中更改属性值的操作是更改对象内部状态的唯一方法。当软件系统需要面向对象设计时,第一个任务是将系统分解成对象。由于面向对象的特点各异(例如封装、层次、依赖、聚合)以及诸如灵活性、性能、可扩展性、可重用性等质量属性,这个任务是非常困难的。因此,需要有效的面向对象分析来处理这个困难的活动。OOA过程涉及问题域中的类和对象的识别。用于识别对象和类的框架如图3.2所示。 图3.2 类和对象识别的OOA过程按照Booch的说法,通过发现和发明两个过程来进行对象和类的识别。发现的过程尝试找出问题域中已经存在的对象;而发明过程侧重于应用各种技术从现有的对象中找出新的对象。在图3.2所示的框架中,类和对象的识别是OOA过程中的第一个活动。一旦应用各种OOA技术完成了识别类和对象的初始集合,则下一个任务就是识别域中的类和对象之间的交互。这需要分析对象之间的消息传递,然后将特性(属性和操作)分配给具有明确定义边界的合适的类。一旦这些任务完成,就会得到一个明确定义的类集合。在下一个任务中会通过正式审查或头脑风暴会议的形式,验证这些收集到的实体的适用性、正确性和实用性。最后将根据会议的反馈意见来修正结果。如果需要再次进行识别过程,以找出域中新的类和对象,则重复以上的步骤。整个过程将不断重复,直到会议确认所识别的实体足以解决问题域。在本书的讨论中,问题域定义为“孩子手机监控软件”,这是为了完整了解OOA和OOD的基本概念。问题描述如下。要了解OOAD方法,让我们从一个任务开始,这个任务需要为一个系统构建设计元素,该系统可以由父母使用来监控孩子的手机使用情况以及孩子的活动。该软件可帮助家长确保他们的孩子在使用手机上网时是安全的。及时通知功能可让父母知道孩子的生活中发生了什么,并在问题发生之前及时阻止。还可以使用一个特殊功能,即了解移动设备的地理位置,如果孩子丢失或被绑架,这个功能就可以发挥作用。我们称这个设计的系统为“孩子手机监控软件”。这个系统的主要特征如下:① 监控和警报——短信、通话② 地理位置通知③ 应用程序阻塞④ 时间阻塞⑤ 联系人列表授权⑥ 报告生成为了使用软件支持的这些功能,父母必须在注册过程中将他们的手机号码与孩子的手机号码进行绑定。该软件需要同时在父母和孩子的手机中进行安装和配置,并且应该作为后台应用程序运行,以提供孩子手机使用情况的即时状态。系统描述 整个系统由两个主要组件构成。① 移动应用程序组件:涵盖通过手机控制/访问的功能。② 网络应用程序组件:涵盖从集中式服务器通过Web界面控制/访问的功能。1.移动应用程序组件移动应用程序组件中涉及的功能包括:① 短信监控器,对所有发送和接收的短信进行监控和提醒。② 通话监控器,对所有拨打的电话和已接/未接来电进行监控和提醒。③ 地理位置监控器,对被呼叫手机的地理位置进行监视和提醒。④ 应用程序阻塞器,将孩子手机上的新的和已有的应用程序阻止或者限制访问。⑤ 时间阻塞器,在特定时间段内禁止孩子的手机使用。⑥ 联系人授权器,在孩子的手机中创建和授权主联系人列表。这些单元的详细说明如下。(1)短信监控器该模块监视孩子手机中的短信相关事件,即发送或接收短信消息。我们可以设想这样的事件发生时,父母的手机将会收到即时文字提醒。这告知了家长短信的主要详细信息,如源/目的地电话号码、该消息的内容以及发送/接收的时间。这些详细信息也同时附加到中央服务器,在之后的“历史事件分析”中可以被二次使用。(2)通话监控器该模块监视孩子手机中发生的呼叫相关事件,即发出或接收呼叫以及未接来电的详细信息。只要手机通电就运行的后台应用程序用来监听空闲、被呼叫和挂机等各种状态的手机。任何这些状态发生,应用程序都会向父母的手机发送短信提醒,告知呼叫/接收者的移动号码、呼叫时间和呼叫持续时间等相关详细信息。对于未接来电,上述信息就不包括通话时间。如前所述,这些详细信息也同时附加到中央服务器,在之后的“历史事件分析”中可以被二次使用。(3)地理位置监控器该模块监视和报告孩子手机的地理位置,并在中央网络服务器中动态更新这个信息。只要手机开机就运行的后台应用程序用来监听孩子手机的位置变化,并将时间信息和地理位置信息在中央服务器中更新。在紧急情况下,如果孩子失踪或孩子有被绑架的可能,父母可以向孩子的手机发送请求,获知孩子的地理位置信息。对应的信息由中央服务器获得,并作为短信通过该单元发送至家长的手机。(4)应用程序阻塞器该模块监视所有应用程序的安装和配置,例如:① 社交网络应用程序(Facebook、Twitter、YouTube、MySpace等)② 手机游戏(《愤怒的小鸟》、《珠光宝气》等)③ 即时通讯应用程序(雅虎信使、G-Talk、Skype)④ Web浏览器⑤ 照相机一旦识别了这些应用程序,它们就立即被软件阻止,并且不能被访问。如果有必要,这些应用程序也可以通过密码保护来提供受限的访问。(5)时间阻塞器该模块指定特定时间段以限制孩子的电话使用。在这些时间段内,孩子将被允许拨打紧急电话号码和父母指定的其他重要号码。(6)联系人授权器该模块为孩子的手机创建主联系人列表。诸如电话号码、电子邮件、短信地址以及其他信息的细节可以存储在主列表中。这些是由父母批准的信息,并会在中央网络服务器中进行更新以供父母查阅。2.网络应用程序组件网络应用程序组件中涉及的功能包括:① 注册用户登录,注册用户登录并使用此软件的功能。② 短信历史,存储孩子手机上的任何发送和接收的短信的详细信息。③ 通话历史,存储孩子手机上的任何拨打的电话和已接/未接来电的详细信息。④ 地理位置历史,存储孩子手机的地理位置信息。⑤ 联系人监控器,由父母针对授权联系人列表将这些联系人标记为已批准或可疑的。⑥ 报告生成器,生成关于所有手机使用情况(如联系人更新、短信、电话和地理位置更新)的报告。所有上述单元都运行在中央网络服务器上,可以通过Web界面进行访问。(1)注册用户登录该模块在用户购买移动应用程序本身时会向用户(父母)提供登录凭据。用户应该使用该登录凭据来访问网络应用程序组件。
(2)短信历史该模块存储日期、时间、发送者/接收者手机号码、通过短信接收/发送的消息内容等信息。这就像一个短信消息的存储库,可以为父母提供各个方面(包括日期和时间、发件人/收件人等)的报告查询。(3)通话历史该模块存储日期、时间、呼叫者/接收者手机号码、任何拨出/被呼叫的通话持续时间和未接来电的信息。这就像一个通话信息的存储库,可以为父母提供各个方面(包括日期和时间、呼叫者/接收者等)的报告查询。(4)地理位置历史该模块存储地理位置、相关时间、孩子手机位置的变化等信息。它作为地理位置信息的存储库,可以在发现儿童丢失的紧急情况下向父母提供信息。(5)联系人监控器该模块通过Web界面向父母提供他们孩子的手机中的主联系人列表。父母可以将联系人标记为已批准或可疑的,以保护他们的孩子免受任何不良接触。该单元根据授权的联系方式提供所有通话和短信的自动交叉检查功能。(6)报告生成器该模块根据父母的需求生成各种不同的报告,覆盖基本的手机使用情况以及高级地理位置相关的查询。报告可能只是简单的“文字报告”,也可能是像“地图显示”这样的高级图像形式。下面,我们将看到如何应用面向对象的各种分析和设计技术来识别这个问题域的类和对象。3.2 用于类和对象识别的面向对象分析技术可以应用几种OOAD技术来识别对象,然后根据对象在给定问题域中的相似性将它们分组成类。相似性如下:① 实体相似性,如父母、孩子② 操作相似性,如监控器③ 基于服务的相似性,如用户账户、联系人④ 内部工作相似性,如通话监控器、短信监控器这一分组产生问题域中的必要实体,它们将作为解决方案域中的类和对象。可以通过以下系统的问题域分析技术获得这些相似性:① 抽象分析② 基于场景的分析③ 问题域分析④ 实体分析⑤ 基于操作的分析⑥ 基于CRC卡的分析⑦ 基于名词-动词的分析⑧ 基于数据流和控制流的分析如图3.3所示。 图3.3 基于OOA的技术3.2.1 基于抽象的分析这是只识别现实世界中的基本事物以确定实体的过程,涉及抽象的识别,而不识别详细的实现级细节。这些抽象包括问题域的实体集合中的相似进程、相似实体和相似任务。为了找出这些集合之间的相似之处,我们应用了一个分类过程。这个分类过程只考虑了这个时间点的基本要素,省略了所有不必要的东西,在一组项目事物与其他事物集合之间划了一条明确的界限。例如,考虑“孩子手机监控软件”这个问题域。问题域中存在诸如文本消息、音频消息、视频消息、基于电子名片的消息等集合。同样,在这个领域有几种互动的人物,包括父母、孩子、网络管理员等。这一领域发生着几种监控操作,如短信监控、通话监控、地理位置监控等。当这些实体在问题域中被识别出时,就需要去解决其中存在的相似性问题,以此识别它们之间的明确界定。从图3.4中可以看到,“用户账户”“人”“监控器”“消息”就是基于相似性的抽象划分出来的几个潜在的类。 图3.4 基于抽象分析的识别
3.2.2 实体分析实体的字典意思是“存在的物体”“事物”“身体”“生物”“个人”“有机体”或“物质”。这阐明了分析一个领域中存在的某些东西的概念。因此,通过“实体”,我们可以看出各种有形的东西、个体所扮演的角色以及提供功能和占领领域的物质。在面向对象中,通过这种实体分析来识别对象,可以使用以下类型的源来进行识别。① 有形的事物:物品、个人、地方等。② 个人所扮演的角色:操作员、收银员、医生、教师、管理员等。③ 占用领域空间的物质:账户、贷款、治疗、交易等。考虑“孩子手机监控软件”这个问题域。该系统可以通过实体分析进行分析。在分析结束时,可以列出以下实体,从而形成问题域中的对象。在下面给出的列表中,括号内的名称代表类。① 有形的事物:父母和孩子(“人”)、移动电话(“电话信息”)、网络管理员和父母(“用户账户”)、联系人更新报告、短信报告、通话报告、地理位置报告(“报告”)等。② 角色:父母和孩子(“人”)、移动电话(“电话信息”)、网络管理员和父母(“用户账户”)。③ 物质:短信消息、多媒体消息和电子名片消息(“消息”)、联系人列表(“联系人”)、授权审核、请求、联系人更新和其他手机活动(“服务”)。相似对象的集合被分组成类。因此,基于实体的分析揭示了问题域中各种对象和类的存在。这种方法的缺点是,实体的识别主要是由分析人员一个人完成的,从而结果仅表达个人的观点。因此,即使实体分析很简单,这种分析也不能保证揭示域中所有的对象和类。总而言之,该分析可以用作对象识别过程的起点。3.2.3 基于场景的分析这是识别问题域中类和对象的最重要的方法,为收集用户与系统功能的交互场景指明方向。其涉及的步骤如下:(1)与系统的最终用户/用户进行交互。(2)收集用户故事。(3)将用户故事划分为用例场景。(4)识别每个场景中的参与者和功能。 参与者可能是人、软件组件或者硬件组件。 功能只是系统中为参与者提供必要过程的功能组件。(5)一旦识别出参与者和功能,就将相似的参与者和相似的功能分组成类。独立的参与者和功能被视为对象。(6)重复上述步骤直到分析完所有的场景。例如,同样考虑“孩子手机监控软件”这个问题域。这个系统可能有如表3.1所示的一些场景。表3.1 系统场景描述场景 序号场 景描 述1父母向网站发送新的监控账户请求父母向网站发出的注册请求2为新账户的创建验证父母的主要信息验证信息3基于有效性的新账户创建如果注册有效,则创建新账户4短信监控器对所有发送和接收的短信进行监控和提醒5通话监控器对所有拨打的电话和已接/未接来电进行监控和提醒6地理位置监控器对被呼叫手机的地理位置进行监视和提醒7应用程序阻塞器将孩子手机上的新的和已有的应用程序阻止或者限制访问8时间阻塞器在特定时间段内禁止孩子的手机使用9联系人授权器在孩子的手机中创建和授权主联系人列表10注册用户登录注册用户登录并使用此软件的功能11短信历史存储孩子手机上的任何发送和接收的短信的详细信息12通话历史存储孩子手机上的任何拨打的电话和已接/未接来电的详细信息13地理位置历史器存储孩子手机的地理位置信息14联系人监控器由父母针对授权联系人列表将这些联系人标记为已批准或可疑的15报告生成器生成关于所有手机使用情况(如联系人更新、短信、电话和地理位置更新)的报告
考虑前两个场景:在场景1中,① 涉及的人:父母、网络管理员、应用程序数据库② 功能:新账户的请求、应用程序表单和文档提交在场景2中,① 涉及的人:父母、网络管理员、应用程序数据库② 功能:文档验证、报告验证状态从这两个场景中可以看出:① 系统中的对象有父母、父母个人的应用程序、与应用程序相关的文档、网络管理员以及通过或失败的报告。② 类有“人”“应用程序表单”“文档”“父母”和“报告”。③ 每个类相关的属性和功能如下。 网络管理员 属性:用户ID、密码、安全信息 功能:文档验证、用户ID和密码生成、报告生成 管理员(软件代码) 功能:通过/失败的报告状态生成 父母 属性:用户ID、个人信息 功能:新账户的请求、应用程序表单和文档提交 应用程序表单 属性:应用程序ID、个人信息 功能:增加新的应用程序信息和状态 文档 属性:应用程序ID和文档信息从上述分析中可以看出,有些类有着共同的一些属性和操作。这种情况下应该用层级关系来表示。例如,“父母”类可以是“应用程序表单”类(需要“父母”类的所有信息)的基类,“应用程序表单”类与使用“应用程序ID”这一属性(作为限定符属性)的“文档”类相关联。同样地,所有的场景都必须进行这样的分析,以便找出通过功能与系统交互的用户。这些被识别的对象和类的最终分组将提供域中对象和类的完整列表。3.2.4 基于操作的分析在一个系统中,被执行的操作描述了该系统的行为。要找出哪些实体负责在系统中执行这些对应的操作,就必须应用这种基于操作的分析技术。基于在软件中执行的这些操作,它们之间的相似性会被识别并分组为类。操作可能处于低级别或高级别。如果为了高级别操作的正常运行需要在较低级别执行某些操作,那么这些操作会被分组成类。无论何时,一旦需要执行这些操作集,就会调用这个类。例如,考虑对一个操作系统进行基于操作的分析。在该软件中,系统调用是一组较低级别的方法,每当执行特定的系统级别的操作时,这些方法将被调用。所有这些操作被合并为一个类,即系统调用库,而不是被看作不同的操作个体。在C (基于字符串的操作、基于数学的操作等)的.h文件中可以看到相似操作分组成类,Java中提供基本功能的API都是操作相似性的示例。在业务应用程序中完成的事务也可以分组并作为一个类。例如,在“孩子手机监控软件”中,要对每种消息类型和通话类型进行短信和通话的监控等操作。这两个操作可以放在与“消息(Message)”类和“通话(Calls)”类相关联的称为“监控器(Monitor)”的类中,而不是将这些操作作为消息类或通话类的一部分。类似地,在上述应用程序中,父母所需的所有服务都可以作为一个单独的类,即“服务(Services)”。这个类可能会有更改用户账户请求、更改联系人列表请求、报告请求等 操作。3.2.5 基于问题域的分析可以在领域专家的指导下分析问题域,找出其中的实体、过程和功能。这种分析可以用三种方法完成:① 与领域专家讨论② 分析相似类型的应用程序③ 分析相似类型的操作1.与领域专家讨论第一类方法涉及域分析的第一阶段,如图3.5所示。如果你希望在给定域中找到对象和功能,并且这个领域对你而言是全新的,那么就可以使用这种方法。领域专家是熟悉问题域的人,了解域的每个部分。他可以是某个楼层的人、操作员、主管或经理,或者是组织的首席执行官。 图3.5 与领域专家讨论2.分析相似类型的应用程序如果这个域已经存在一些类似的应用程序,那么可以应用第二种技术来查找其中的类和对象,如图3.6所示。 图3.6 基于现有应用程序的域分析3.分析相似类型的操作第三种类型的方法涉及在操作中查找对象和功能,如图3.7所示。如果你已经通过第一类方法探索了域的内容,但是在查找与特定操作相关的对象和类方面仍然存在困惑,那么可以使用这种方法。如果该域中的现有应用程序已经具有类似的操作,则可以将这些操作用作识别对象和类的基础,因为这些对象和类已经是现有操作的一部分。 图3.7 相似类型操作的分析例如,在“孩子手机监控软件”中,如果这个域对你而言是全新的,则可以进行以下几个步骤:(1)与领域专家讨论,找出域中的类和对象。(2)制定类和对象及其相关功能的基本列表。(3)通过与领域专家进行交互来优化列表。(4)分析域中已经存在的相似类型的应用程序,以找出所需的任何其他类和对象。(5)重复步骤(3),直到该列表包含域中所有必需的类和对象。例如,你被要求进行地理位置报告的操作。如果你不熟悉这个操作,那么可以查看在其他一些现有应用程序中已经存在的类似报告。在完成上述步骤之后,你还必须对你希望编码的特定操作执行以下步骤。(1)分析同一应用程序或其他现有应用程序中现有的类似操作。(2)找出这些现有操作包含的类和对象。(3)将新发现的类和对象集合附加到对象和类的列表中。(4)细化列表以避免实体的重复。因此,在基于域的分析方法中,我们可以通过三种方式找出域中的对象和类,即与领域专家讨论、基于相似应用程序的分析和基于相似操作的分析。3.2.6 基于CRC卡的分析CRC卡通常是3英寸×5英寸或者3英寸×7英寸大小的卡片,显示类-职责-协作关系。该卡为三个部分,类的名称在上半部分,第二部分又垂直分为两部分。其中,左半部分显示了类的职责,右半部分显示了与当前的类具有协作关系的类。如图3.8所示。 图3.8 CRC卡版式开发人员会在软件开发过程中使用CRC卡。一旦分配到整个项目的某个模块,他们就被要求单独准备这些卡片。每个开发人员必须完全分析他的模块,并尽可能多地准备与所识别的类相关的卡片。他们将为每张卡片增加索引,并在每张卡片中显示所协作的类。一旦完成任务,所有开发人员将被要求参加头脑风暴会议。在会议中,开发人员也要分析他人所识别的类,如果需要,所有开发人员的CRC卡需要互相协作来共同完成特定的任务。在这种情况下,这些卡片将使用新的协作类进行更新,如果需要,还可以删除现有的协作关系。例如,对于“孩子手机监控软件”中与系统的网络应用程序组件中“联系人监控”这一组件相关联的开发人员,其CRC卡需要和“用户访问(User Access)”“父母(Parent)”“联系人(Contacts)”“孩子(Child)”“监控器(Monitor)”和“管理员(Administrator)”这几个类进行交互。如图3.9所示,持有User Access类的CRC卡将具有与授权相关的一系列职责,并将显示与Parent类和Administrator类的协作关系。
User Access
Contacts职责协作关系
职责协作关系Authorize() Disp_msg()Parent Administrator
Add_contacts() Delete_ contacts() Update_contacts()Parent Child Monitor
图3.9 CRC卡例子类似地,Contacts类将有自己的一套职责,以及与Parent类、Child类和Monitor类的协作关系。通过使用这种分析,可以轻松地找到域中的类和对象,以及与域中其他类和对象的协作关系。3.2.7 基于数据流和控制流的分析如果你熟悉结构化分析技术并希望将其应用在OOAD的前端上,那么就可以使用这种基于数据流和控制流的分析技术。这种技术从数据流图(Data Flow Diagram, DFD)中进行分析,从中获得数据存储、数据源、处理和转换的过程——如变换中心和事务中心(从变换映射和事务映射中获得)。由于这些结果在系统中的存在性,因此可以将它们视为对象和类。在数据流分析中,也会使用数据字典查找域中的对象和类。例如,假设你参与设计“孩子手机监控软件”。你已经完成了这个软件的DFD。从这个DFD中,可以识别的实体有人数据源、联系人数据存储、监控过程、用户账户数据源、管理员数据源、报告生成过程等,现在将其转换成人、联系人、监控器、用户账户、管理员和报告这几个对象,然后放在类中以生成相似的对象。如果只有具有数据项的数据字典,字典中包括父母、孩子、联系人和管理员,就将这些简单地转换成对象和类。类似地,从控制流图(Control Flow Diagram, CFD)中进行分析,找出控制存储、控制过程和状态变化。然后这些已识别的部分将转换为给定域中的类和对象。在某些情况下,也会使用控制规范文档进行控制流分析,以找出域中存在的实体。例如在上面的应用程序中,可以产生一个CFD。现在,分析显示了以下几个部分:短信监控控制存储、监控控制流、报告生成控制存储等。这些部分表明了短信监控中的消息实体和父母实体、监控中的父母实体以及报告生成类中的管理员实体、父母实体和报告实体等的参与。这些实体就被识别为类和对象。但是,这种数据流和控制流分析并不是一种较好地在问题域中识别对象和类的方法。由于这种结构化分析技术的重点在于数据流和控制流,因此可能会有许多实体被忽略。而且,这种观点仅仅基于结构化的方法,永远不适合将设计转换为面向对象的方法。
3.2.8 基于名词-动词的分析这是识别域中的类和对象的一种非常简单的技术。该问题规范是以英文描述形式写成文本文档的。然后分析这个文档,找出其中的对象和类。在这个分析中,需要识别以下事项:① 专有名词② 常用名词③ 动词专有名词被视为对象,常用名词作为类,动词作为类中的操作。任何知道如何用英文描述形式叙述问题的人都可以应用此技术来找出给定问题中的类和对象。例如,考虑“孩子手机监控软件”,其英文描述如下:A person who wishes to monitor his/her child’s mobile phone activities should first become a member. Once, he/she has became a member, he/she will be allowed to monitor the calls and messages of the child’s mobile phone and can take reports based on the past history.根据以上的描述,可以得到下列推论:① Person——类② Child——类③ Member——类④ Calls——类⑤ Messages——类⑥ Monitor——操作⑦ Reports——操作但是,考虑一下下面这句话,这是上述说明的一部分:A member can contact the administrator for updating the child’s contact list updation.在上面的陈述中,contact既是动词也是名词。因此,名词动词分析中的主要问题是,一个名词可以被视为一个动词,一个动词也可以被视为一个名词。所以,该技术不是一个值得信赖的技术。3.3 问题域的面向对象设计面向对象设计(OOD)是根据面向对象分析(OOA)来识别类和对象的最重要的过程。它包含一些任务,目的是将问题域转换为具有数据结构和程序结构的类设计集合,以及具有操作细节的界面设计和抽象类设计。OOD中涉及的步骤有:(1)系统地分析问题域的功能、行为和数据。(2)识别所有的数据结构和操作。(3)将每个数据对象的内容定义为应用于其上的数据和操作。(4)区分对象设计后期阶段的低级数据设计。(5)将数据结构应用于相关的数据处理技术。(6)收集一组可重用数据对象作为可重用类库。(7)提供在编程语言中识别的抽象的规范和实现。一个好的设计具有以下一些属性:① 它必须既捕获隐含的需求,也捕获明确规定的需求。② 即使是不知道如何在系统上操作的新手用户也是很容易理解的。③ 它应该为软件的内部和外部工作提供一个明确的方法。④ 它必须提供一个草图,显示系统的外部可见行为,同时必须提供一个蓝图,显示要构建的系统的内部视图。⑤ 它应该作为系统分析师和系统开发人员的中间平台。在OOD中,设计过程从类的设计开始,然后进行接口、抽象、包、组件和整个系统的设计。过去几年的研究提出了各种设计原则。在OOD中应用的所有这些设计原则旨在提高可重用性和可扩展性。本节将讨论面向对象设计的设计原则列表:① 开闭原则(Open-Closed Principle, OCP)② Liskov替代原则(Liskov Substitution Principle, LSP)③ 依赖性倒置原则(Dependency Inversion Principle,DIP)④ 接口分离原则(Interface Segregation Principle, ISP)⑤ 发布重用等效原则(Release Reuse Equivalency Principle, REP)⑥ 共同封闭原则(Common Closure Principle, CCP)⑦ 共同重用原则(Common Reuse Principle, CRP)3.4 面向对象设计的设计原则3.4.1 开闭原则(OCP)根据Martin在2000年关于“设计原则和模式”的发言,一个模块应该对于扩展是开放的,但对于修改是关闭的。这意味着,一个类应该提供一种扩展其现有功能的方法,但不应该在其现有结构中进行修改。这个原则有助于设计师在他们的类设计过程中避免开发人员在其他开发人员工作时对基础类结构进行无意的修改。可以根据这种方法创建抽象类和接口,其中现有的类结构将不会被修改,但是可以使用基于预期功能的派生类来完成后期的扩展。例如,在“孩子手机监控软件”中,“监控器(Monitor)”类可以作为抽象类,或者作为可以由短信监控器类和通话监控器类按照自己的处理机制派生或实现的接口来提供。在这里,OCP建议为“监控器”类创建抽象类或接口,从中可以派生新类型的监控器,并且可以在派生类中提供自己的监控操作的实现。3.4.2 Liskov替代原则(LSP)按照Martin在2000年的说法,“子类应该是基类的替代”。LSP原则是由Barbar Liskov在1988年提出的,他期望建立派生类和基类之间的契约。即使使用派生类对象而不是基类对象,功能的实现也应当没有任何问题。例如,在前面讨论过的基于契约的编程中,派生类应该满足其一组使用某个类作为基类的前置条件,并且在派生类继承了基类之后,基类也应满足一组后置条件。例如,考虑“孩子手机监控软件”中相同的监控操作。从基类创建的派生类对象应该具有访问基类提供的方法以及派生类自己特有方法的权限。考虑以下C 代码:
class monitor{…}class sms_monitor : public monitor{…}class calls_monitor: public monitor{…}……void main(){monitor sms_mon=new sms_monitor();/* sms_mon is an object created from derived class sms_monitor and can access the methods of both base class employee and manager class*/…}
3.4.3 依赖性倒置原则(DIP)“取决于抽象而不是具体的实现”是Martin在2000年提出的指导原则。如果创建了具体的类,那么一旦需要修改类的实现,可重用性和可扩展性就成为需要解决的问题。抽象提供了可扩展性的机制,而无须修改整个代码。但具体的实现不具备这样的扩展性,因为其中包含了完整的实现代码。任何新的更正或更新都需要对实现代码进行完全的修改。例如,考虑“消息(message)”类。如果为这个类的实现创建了一个抽象类,那么任何新类型的消息(文本、音频、视频等)都可以在不改变类的实现代码的情况下被 创建。3.4.4 接口分离原则(ISP)这个原则着重于使用许多客户端特定的接口,而不是单一的通用接口。这提供了根据不同客户端需求设计不同接口的建议,这些客户端本质上需要进行特制而不是只提供单一的通用接口。例如,考虑“孩子手机监控软件”。报告的生成是根据不同的客户端需求为不同类型的报告分别提供接口,而不是提供一个通用接口。由于该系统的客户端“父母(Parent)”需要基本的手机活动(基于短信、基于通话、基于联系人列表)报告和地理位置报告等不同的报告,因此如果需要基于手机活动的基本报告,那么仅从通用报告中继承该接口并且仅实现它的方法。这就降低了各种报告访问的复杂性和混乱性。3.4.5 发布重用等效原则(REP)类的开发应该重点关注可重用性,而且也应该同样关注发布过程。类或组件的可重用性要求维护发布管理系统。基本上,配置管理系统支持在存储库中的开发过程中生成的每个项目(类、接口、抽象、组件、包等)的旧版本。后期如果需要,这些项目将重新用于当前版本。在某些情况下,可重用的类被分组为包,并在需要构建系统的新版本时导入。3.4.6 共同封闭原则(CCP)这个原则表示出类分组的高度凝聚性。一个包应该包含高度凝聚的类,这样对一个类的修改不会对其他包产生影响。这有助于开发人员重点关注同一个包中的类的复制效果,而不需要关注其他的包。由此可以很好地提高可重用性,加强版本管理。在OOD中,这个原则有助于将子系统划分为明确定义的包,包中具有相似的类或紧密连接的类的集合。例如,“孩子手机监控软件”含有两个包:通话监控器(Call Monitor),包含与通话、父母和孩子相关的类;应用程序阻塞器(Application Blocker),包含与应用程序、父母、配置信息和访问控制相关的类。3.4.7 共同重用原则(CRP)这个原则建议根据类的可重用性来包装类。当创建包时,那些可以重用来创建新版本的类应该放在一个包中,而不被重用的类将被分离出该组别。这改善了配置和版本管理的过程。例如,在“孩子手机监控软件”中,与各种不同的报告相关的类被放置在一个单独的包“报告(Reports)”中。这有助于在新版本需要时将新的报告添加到这个包中。在Java编程语言中,lang、sql、servlet等都是包,它们组合了相似功能的类,并且这些类具有更高级别的可重用性,可以改进可重用的组件。
3.5 类和对象的识别和细化过程中的设计模式3.5.1 设计模式介绍类和对象的识别这一难题可以通过称为设计模式的机制来解决。设计模式用于识别问题域中较为不可见的抽象和对象。尽管前面的章节已经讨论了各种识别技术,但是表示对象、过程或算法状态的对象本质上不会自己出现,不能通过先前讨论的技术来捕获。因此,由“四人组”描述的设计模式被广泛用于许多行业。对象通常代表从软件组件到硬件组件的一切事物。高度使用的设计模式决定了哪些被视为对象,哪些不被视为对象。设计模式也可以用来找出以下类型的对象:① 将较小的对象分组成高级对象。② 将较大的对象分解成几个较小的可管理对象。③ 从其他对象中创建对象。④ 作为工作对象的对象,用于实现一个或一组请求。因此,根据“四人组”的说法,应用设计模式的原因如下:① 通过明确指定一个类来创建一个对象② 某些操作的依赖性③ 硬件和软件平台的依赖性④ 对象职责和实现的依赖性⑤ 算法依赖性⑥ 耦合和内聚⑦ 通过子类提高可扩展性⑧ 修改类的困难基本上,大家对框架和模式存在很多困惑。框架和模式是不一样的,以下的内容将明确区分两者。1.框架框架是一组合作的类,为特定软件的类构造可重用的设计,为要开发的应用程序提供架构。它定义了整体结构,通过控制线程将系统划分为对象和类、职责、协作以及同步或异步操作。它们通过从框架中创建应用程序特定的子类来帮助开发特定目的的应用程序,例如WebSphere Application Developer、CAD软件等。框架捕获设计决策,提高了设计而非代码的可重用性。它们通常包含具体的子类,使用这些子类可以将应用程序创建为现成的组件。由于通过框架开发的应用程序具有相似的结构,因此它们更容易维护。框架和设计模式的区别如下:① 设计模式比框架更抽象。② 设计模式是比框架更小的架构元素。③ 设计模式比框架更通用。2.设计模式的类别根据“四人组”的设计模式这本书,应用设计模式在问题域中识别对象的目的分类 如下:① 创建型② 结构型③ 行为型创建型设计模式有:① 抽象工厂② 建造者③ 工厂方法④ 原型⑤ 单例结构型设计模式有:① 适配器② 桥接③ 组合④ 装饰器⑤ 外观⑥ 享元⑦ 代理行为型设计模式有:① 责任链② 命令③ 解释器④ 迭代器⑤ 中介者⑥ 备忘录⑦ 观察者⑧ 状态⑨ 模板方法⑩ 访问者这些设计模式有着不同的目标,以下章节将会详细介绍。
3.5.2 设计模式——创建型1.工厂方法它通过接口为客户端类提供创建对象的规定,但允许客户端决定哪个子类需要实例化。例如,假设你需要为父类“消息(message)”派生的不同类型的消息创建一个对象。工厂方法模式允许开发人员通过名为message_factory的接口创建自己需要的“消息”对象。这个接口包含一个由客户端创建请求对象的方法。根据传递给该方法的参数,创建适当的类的对象。代码如下:
public class message{int message_type, message_size;string time, date;message(){ }}public class text_message : message{ … …}public class video_message : message{ … …}public class message_factory{public message getMessage(int type, int size){if(type==1) return (new (text_message(size));else return (new (video_message(size));}}// Main Programvoid main(){message_factory mf=new message_factory();message m1= mf.getMessage(1, 300);message m2= mf.getMessage(2,1000);}
通过创建的message_factory类,完成不同类型的对象的创建。因此,工厂方法模式有助于创建一个允许客户端决定要实例化哪些子类的接口。
2.抽象工厂这个模式有助于提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。它提供了一种抽象类型的工厂。通过使用这种模式,可以创建不同的工厂,这些工厂可以用来创建自身类型的对象。例如,你需要为“孩子手机监控软件”开发一个应用程序,其中根据给出的类型信息将不同类型的监视操作创建为单独的类。在这里,monitortype和monitorfactory是需要创建的类,用来找出哪种类型的“监控器”应当被创建,以及每个类型的特定属性和功能。在这里,monitorfactory是工厂monitor的子工厂。通过使用这个工厂,可以调用monitor工厂,从而从sms_monitor类、call_monitor类或geoloc_monitor类创建不同类型的监控器实例,以此构造必要的监控类型的对象。例如,考虑以下代码:
monitor mon;monitorfactory mof=new monitorfactory();if (type==1) mon=mof.getMonitor(“SMS”);else if(type==2) mon=mof.getMonitor(“CALLS”);montype mt1=mon.getMonitorRange();montype mt2=mon.getMixedType();mt1.getMontype(); // this will return an montype object associated with”SMS”….. }3.建造者当从简单的对象创建复杂的对象时,这种模式有助于将复杂对象的构建与其表示分开,使得相同的构建过程可以创建不同的职责。例如,假设你参与了项目“孩子手机监控软件”的开发。你需要创建不同类型的用户,以“父母”和“管理员”的身份与系统进行交互,同时还要为用户提供不同的访问等级和权限。在这种情况下,需要通过使用usercreator和userbuilder这两个类创建user类的复杂 对象。
public class user{string uname=” “;string pwd=” “;public void setUser(string un, string pwd){this.uname=un;this.pwd=pwd;}}public abstract class usercreator{
评论
还没有评论。