第 5章
类图和对象图
(class diagram & object
diagram)
制作 龙鹏飞
1.类的定义
Rumbaugh对类的定义是:
类是具有相似结构、行为和关系的一组对象的描述。
制作 龙鹏飞
+ A r e a ( ), d o u b l e
+ m _ r, d o u b l e
C i r c l e
+ A r e a ( ), d o u b l e
+ m _ h, d o u b l e
C y l i n d e r
+ S h a p e ( )
- m o v e ( )
# r e s i z e ( )
+ d i s p l a y ( )
+ G e t O b j e c t C o u n t ( )
- o r i g i n, P o i n t
# s i z e, d o u b l e
+ f i l l C o l o r, C o l o r
- c o u n t, i n t
c h a p t e r 5,, S h a p e
1)类的属性
属性描述格式:
[可视性 ]属性名 [,类型 ][[多重性 [次序 ]]][=初始
值 ][{特性 }]
size
+size
+size:Area
size:Area=(100,100)
+visible:boolean=false
colors:Color[3]
points:Point[2..* ordered]
name:String[0..1]{ReadOnly}
制作 龙鹏飞
2)类的操作
操作描述格式:
[可视性 ]操作名 [(参数列表 )][,返回类型 ][{特性 }]
getSize
+getSize()
+getSize():Area{query}
+setSize(cx:double,cy:double)
制作 龙鹏飞
2.类之间的关系
类之间的关系主要分 4类:
关联、聚合 /组合、泛化和依赖。
特殊的关联
制作 龙鹏飞
1)关联
关联是 模型元素间的一种语义联系,它是对
具有共同的结构特性、行为特性关系和语义的 链
(link)的 描述 。
链是一个实例,与对象是类的实例一样,链
是关联的实例,关联表示的是类之间的关系,而
链表示的是对象之间的关系。
制作 龙鹏飞

类、对象、关联、链之间关系:
制作 龙鹏飞
关 联 类
链 对 象
1
*
实 例
1
*
实 例
* 1,, *
相 关
* 2,, *
相 关
图与代码
关联图示:
public class A
{
}// END CLASS DEFINITION A
public class B
{
}// END CLASS DEFINITION B
public class C
{
private D theD;
}// END CLASS DEFINITION C
public class D
{
private C theC;
}// END CLASS DEFINITION D
public class E
{
private F theF;
}// END CLASS DEFINITION E
public class F
{
}// END CLASS DEFINITION F
制作 龙鹏飞A B
C D
- t h e A
1
- t h e B
1
- t h e C
1
- t h e D
1
E F
*
- t h e F
1
( 1)关联名
可给关联加上关联名,以说明关联的作用。
关联名通常是动词或动词短语。
作用:明确关联含义。“公司”类与“人”类之间
有多种含义,“人”类可是“公司”的客户、雇员
或所有者等,为了明确可加关联名,“雇佣”、“属
于”、“拥有”、“工作”等。
制作 龙鹏飞

关联名
制作 龙鹏飞公 司 2 人 2雇 佣
公 司 2 人 2
聘 请
人 3 公 司 3
工 作
( 2)关联角色
关联两端的类可以某种角色参与关联。
命名角色:用户定义角色名
默认角色:类名
角色多重性:一端类的一个对象,另一端
类可以有多少个对象参与关联。
表示,0..1 0..* (0..n,*) 1 (1..1)
1..* (1..n) 7 6..9
制作 龙鹏飞
图与代码
角色
制作 龙鹏飞
C o m p a n y P e r s o n
- e m p l o y e r
1
- e m p l o y e e
1,, *
public class Company
{
private System.Collections.ArrayList employee;
}// END CLASS DEFINITION Company
public class Person
{
private Company employer;
}// END CLASS DEFINITION Person
( 3)关联类
制作 龙鹏飞
public class Students
{}
public class Courses
{}
Students Courses
+result, float = 0
Results
*
+student
*
+course
public class Results
{
public float result = 0;
public Students student = null;
public Courses course = null;
}
( 4) 关联的约束
通过在关联上加上约束,
以加强关联的含义。
制作 龙鹏飞
A c c o u n t
P e r s o n
C o m r p o r a t i o n
{ X O R }
( 5) 限定关联
限定符的作用就是在给定关联一端的一个对象
和限定符值以后,可确定另一端的一个对象或对
象集。
制作 龙鹏飞
Bank
Account
Person
n
0..1
Bank
Account
Person
n
0..1
1..n
1
Bank
Person
*
*
Account

限定关联
制作 龙鹏飞
dir
file
1
*
dir
filename
file
1
1
( 6) 关联的种类
按照关联所连接的类的数量,关联可分为自返
关联、二元关联和 N元关联。
制作 龙鹏飞
人类
0..n
1
子女

年份类
运动员类运动队类
记录类
n
n
n
多边形类
点类
3,.n
1
代码 -1
代码 -1:自返关联
public class Person
{
Person Parent;
Person []Children;
//System.Collections.ArrayList Children;
......
}
制作 龙鹏飞
代码 -2
代码 -2:二元关联
public class Polygon
{
Point []Points;
//System.Collections.ArrayList Points;
......
}
public class Point
{
Polygon Owner;
......
}
制作 龙鹏飞
代码 -3
代码 -3,N元关

public class Year {
int year;
......
}
public class Team {
String teamName;
......
}
public class Player {
String PlayerName;
......
}
制作 龙鹏飞
public class Record {
Year year;
Team team;
Player player;
int result;
public Record(Year year,Team team,
Player player,int res)
{this.year=year; this.team=team;
this.player=player; result=res;
}
......
}
2)聚合 (aggregation)和组合
(composition)
聚合与组合的区别:
?聚合关系是,has-a”关系,组合关系是,contains-a”关系;
?聚合表示较弱的整体 /部分关系,组合表示较强的整体 /部分关系;
?聚合关系中,代表部分事物的对象可以属于多个聚合对象,具有共
享性,而组合关系中,代表部分事物的对象 不 可以属于多个聚合对象,
不 具有共享性;
?聚合关系中,代表整体事物的对象与代表部分事物的对象,有各自
独立的生存期,而组合关系中,有完全一致的生存期;
?在聚合 /组合关系实现中,可同样对待。
制作 龙鹏飞
组合 聚合 关联
2)聚合 (aggregation)和组合
(composition)
制作 龙鹏飞
D e p t
+ h i g h e r D e p t1
+ l o w e r D e p t s
*
组 合 关 系
国 家

直 辖 市
省 级 行 政 区
+ c o u n t r y1
+ p r o L e v e l*
C i r c l e
+ c o l o r
+ i s F i l l e d
S t y l e
R e c t a n g l e
聚 合 关 系
3)泛化关系 (generalization)
泛化关系定义了一般元素和特殊元素之间的分类
关系。类之间的泛化关系就是类之间继承关系。
泛化关系是,a-kind-of”关系。
UML中,有许多元素具有泛化关系:用例、参与
者、关联、包、组件、数据类型、接口、结点、
子系统、状态、信号、事件、协作等。
制作 龙鹏飞
组合 聚合 关联
3)泛化关系 (generalization)
类之间泛化关系是类之间继承关系:
?现代语言(如 Java,C#)中,子类继承父类,既
继承父类的属性和方法,还可以替换父类的属性
和方法,可以增加自己的属性和方法。它们是公
有继承,建议在 C++中也仅使用公有继承,这样
方可满足:父类可出现的地方,也适用子类。
?虽然子类对象集合小于父类对象集合,但子类
对象具有的功能比父类多。
制作 龙鹏飞
4)依赖关系 (dependency)
依赖关系,假设有两个元素 A和 B,如果修改元素
A的定义,可能会导致元素 B的定义需要修改,则
称元素 B依赖元素 A。
类之间的依赖关系表现为:
?一个类向另一类对象发送消息(如方法调用);
?一个类对象是另一个类的数据成员;
?一个类是另一个类的操作参数类型。
制作 龙鹏飞
4)依赖关系 (dependency)
制作 龙鹏飞
+ a d d ( i n c, C o u r s e ), i n t
+ r e m o v e ( i n c, C o u r s e ), i n t
S c h e d u l e
C o u r s e
3.派生属性和派生关联
1)派生属性
制作 龙鹏飞
2)派生关联
+ w e e k, i n t
+ d a y, i n t
+ l e s s o n, i n t
+ / i n d e x, i n t
课 堂
i n d e x = w e e k * 3 6 + d a y * 6 + l e s s o n
C o m p a n y D e p t
P e r s o n
1 *
1
*
W o r k F o r D e p a r t m e n t
1
*
/ W o r k F o r C o m p a n y
4.抽象类与接口
制作 龙鹏飞
抽象类、接口都是类的特殊形式。
?抽象类和接口是不能直接产生对象的类;
?抽象类中可以包含没有实现的操作,接口中的所有操
作没有实现;
?抽象类中可以有数据成员,但接口中没有数据成员。
C++中没有接口元素,Java中的接口可以包含数据成员,
C#中的接口符合标准的接口定义。
抽象类 接口类
4.抽象类与接口
制作 龙鹏飞
接口 3
< < i n t e r f a c e > >
接 口 1
接 口 2
< < i m p l e m e n t a t i o n c l a s s > >
C l a s s 1
C l a s s 2
C l a s s 3
C l a s s 4
5.构造型(版型,stereotype)
制作 龙鹏飞
构造型是 UML的 3种扩展机制之一。
构造型:就是在已有的构造块上派生出新构造块,新构
造块和特定问题域相关,赋予了特定含义。
构造型可应用于许多 UML元素,如:类、结点、组件、
注解、关系、包、操作等。
参与者 (actor)、接口 (interface)是类的构造型。
子系统 (subsystem)是包的构造型。
5.构造型(版型,stereotype)
制作 龙鹏飞
< < s u b s y s t e m > >
子 系 统 1
< < e x c e p t i o n > >
异 常 1
< < u t i l i t y > >
u t ilit y 1
C la s s 5
< < m e t a c l a s s > >
m e t a c la s s 1
6,边界类、控制类和实体类
制作 龙鹏飞
边界类
边界类位于系统与外界的交界处。如:窗体类、报表
类、描述通信协议的类、直接与外设交互的类、直接与
外部系统交互的类。
实体类
实体类描述要保存到持久存储体中的信息。如:数据库、
各种形式的数据文件中的信息。
控制类
控制类是主要负责其它类工作的类。如:主程序类、主
窗体类。
6,边界类、控制类和实体类
制作 龙鹏飞
边界类
实体类
控制类
class1
<<boundary>>
Class1 Class1
class1
<<entity>>
Class1 Class1
class1
<<control>>
Class1 Class1
7,类图
制作 龙鹏飞
类图
类加上它们之间的关系就构成了类图。
构成元素
类、接口、包、关系等元素。
7,类图
制作 龙鹏飞
类图层次
1、概念层( conceptual)
概念层类图描述问题域中的概念(事物),一般这些概
念与类有很自然的联系,但未必有直接的映射关系。
概念层的类图独立程序设计语言,类的描述可能会有少
量属性和操作名称。
7,类图
制作 龙鹏飞
类图层次
2、说明层( specification)
说明层描述软件的接口部分,而不是软件的实现部分。
接口可能因为实现环境等不同而有不同的实现。
主要列出属性和操作名称。
3、实现层( implementation)
实现层的类图将考虑类的实现问题,提供类的细节。
7,类图
制作 龙鹏飞
寻找类的方法
?根据用例描述中的名词确定类的候选者。
?使用 CRC分析法寻找类。 CRC是类( class)、职责
( responsibility)和协作( collaboration)的简称。 CRC分析法
根据类所要扮演的职责来确定类。
?根据边界类、控制类和实体类的划分来帮助发现系统中的类。
?对问题域进行分析,或利用已有的问题域分析结果得到类。
?参考设计模式来确定类。( 14章)
?根据软件开发过程提供的指导原则寻找类。( Rational Unified
Process)
7,类图
制作 龙鹏飞
建立类图的步骤
① 研究分析问题域,确定系统需求。
② 确定类,明确类的含义和职责,确定属性和操作。
③ 确定类之间的关系。
④ 细化类和类之间的关系,解决命名冲突、功能重复等问
题。
⑤ 绘制类图,并给元素必要的文字说明。
8,领域分析
制作 龙鹏飞
领域分析,即问题域分析
建立类图的过程就是对问题域及其解决方案的分析和设计过程。
类的获取是一个依赖于人的创造力的过程,有时需要与领域专家合作,
对研究领域进行仔细的分析,抽象出领域中的概念,定义其含义及
相互关系,分析出系统类,并用领域中的术语命名。
领域分析包括:
① 通过 对领域中的已有应用系统、理论、技术、开发历史等的 研究,
来标识、收集、组织、分析和表示 领域模型及软件体系结构的 过程 ;
② 对①的 结果 进行分析。
领域分析过程见 P64
9,OO设计的原则
制作 龙鹏飞
开闭原则 (Open/Closed Principle,OCP)
Liskov替换原则 (Liskov Substitution Principle,LSP)
依赖倒置原则 (Dependency InversionPrinciple,DIP)
接口分离原则 (Interface Segregation Principle,ISP)
9,OO设计的原则
制作 龙鹏飞
开闭原则 (Open/Closed Principle,OCP)
开闭原则指的是:一个模块在扩展性方面
应该是开放的,即尽量使模块可以扩展;在更
改性方面应该是封闭的,即在扩展时不需要对
模块的源代码进行修改。
?类的继承机制在模块的扩展方面提供了很好的
支持。
?接口技术、抽象机制和多态技术使得扩展不需
要改变模块的源代码。
9,OO设计的原则
制作 龙鹏飞
开闭原则 (Open/Closed Principle,OCP)
O u tp u t
+ P r i n t ( )
H p
+ P r i n t ( )
E p s o n
+ P r i n t ( )
C a n o n
O u t p u t
+ P r i n t ( )
H p
+ P r i n t ( )
< < i n t e r f a c e > >
I P r in t e r
+ P r i n t ( )
E p s o n
+ P r i n t ( )
C a n o n
9,OO设计的原则
制作 龙鹏飞
Liskov替换原则 (Liskov Substitution Principle,LSP)
这个原则是指:子类可以替换父类能出现的任何
地方。
要满足这个原则要求:父类拥有的属性和操作及
其访问属性在子类中被继承。(方法实现可不
一样)
9,OO设计的原则
制作 龙鹏飞
Liskov替换原则 (Liskov Substitution Principle,LSP)
C lie n t C la s s
+ O p ( )
B a s e C la s s
+ O p ( )
S u b C la s sC la s s A
9,OO设计的原则
制作 龙鹏飞
依赖倒置原则 (Dependency InversionPrinciple,DIP)
依赖关系应该是尽量依赖接口或 /和抽象类,而不
是依赖具体类。
9,OO设计的原则
制作 龙鹏飞
依赖倒置原则 (Dependency InversionPrinciple,DIP)
主 程 序
模 块 1 模 块 2 模 块 3
模 块 1 1 模 块 1 2
模 块 2 1 模 块 2 2
模 块 3 1 模 块 3 2
结构化设计中的依赖关系
越高层越抽象
越低层越具体
9,OO设计的原则
制作 龙鹏飞
依赖倒置原则 (Dependency InversionPrinciple,DIP)
面向对象设计中的依赖关系
M a i n
< < i n t e r f a c e > >
接 口 1
< < i n t e r f a c e > >
接 口 2
< < i n t e r f a c e > >
接 口 1 1
< < i n t e r f a c e > >
接 口 1 2
C l a s s 1 1 C l a s s 1 2 C l a s s 2
C l a s s 3 3
C l a s s 3
将 模 块 1 中 的 操 作
根 据 密 切 程 度 分 成 两 组
放 到 接 口 1 1 和 接 口 2 2 中
9,OO设计的原则
制作 龙鹏飞
接口分离原则是指避免设计与多个客户类有关的
接口。
接口分离原则 (Interface Segregation Principle,ISP)
+ O p F o r A ( )
+ O p F o r B ( )
+ O p F o r C ( )
< < i n t e r f a c e > >
S e r v i c e
C l a s s A
C l a s s B
C l a s s C
+ O p F o r A ( )
+ O p F o r B ( )
+ O p F o r C ( )
S e r v i c e I m p l
9,OO设计的原则
制作 龙鹏飞
接口分离原则 (Interface Segregation Principle,ISP)
+ O p F o r A ( )
< < i n t e r f a c e > >
S e r v i c e A
+ O p F o r B ( )
< < i n t e r f a c e > >
S e r v i c e B
+ O p F o r C ( )
+ O p ( )
< < i n t e r f a c e > >
S e r v i c e C
C l a s s A
C l a s s B
C l a s s C
+ O p F o r C ( )
+ O p ( )
+ O p F o r B ( )
+ O p F o r A ( )
S e r v i c e I m p l
如果 ClassB仅仅用 Op()则应将
Op()放在单独的接口中。
制作 龙鹏飞
部 门 A, D e p t
部 门 A 1, D e p t
部 门 A 1 1, D e p t
D e p t
+ H i g h e r1
+ L o w e r
*
+ H i g h e r
+ L o w e r
部 门 A 2, D e p t
+ H i g h e r
+ L o w e r
部 门 A 3, D e p t
+ H i g h e r
+ L o w e r
+ H i g h e r
+ L o w e r
P e r s o n
+ E m p l o y e r
1
+ E m p l o y e e
*
E m p l o y e e A, P e r s o n
+ E m p l o y e r
+ E m p l o y e e
E m p l o y e e B, P e r s o n
+ E m p l o y e r
+ E m p l o y e e
E m p l o y e e C, P e r s o n
+ E m p l o y e r
+ E m p l o y e e
10,



制作 龙鹏飞
实例图
软件输出文档建模
问题描述,
软件输出文档是类似 Microsoft Office Word所描
述的文档,每个文档由若干页组成,每页由若干段
组成,每段由一个或多个文字串、表格和 /或绘制盒
等类型项组成。其中文字串是段的主要成分,每个
文字项具有统一的风格;表格由按行列排列的单元
格组成,单元格内容由若干段组成;绘制盒是绘制
图形用的一个矩形区域,由可带附加文字的线条、
矩形、椭圆和 /或图像等类型项组成。文档及其页、
段、文字串、表格、表行、表列、表格单元、绘制
盒、线条、矩形、椭圆、图像等元素均具有各自独
立的风格(如字体、大小、颜色等)。
制作 龙鹏飞
实例图
软件输出文档建模
建模,
通过分析软件输出文档的基本元素和构成特点,
使用 UML技术和 Microsoft visio软件建模工具来建
立系统静态结构分析模型。模型由三个部分组成,
第一部分为基础部分,提供最基本的文档框架,如
图 1所示。第二部分为表格部分,提供表格结构,该
部分是第一部分的扩展,如图 2所示。第三部分为绘
制盒结构,该部分也是第一部分的扩展,如图 3所示。
这种划分方法符合软件可扩展要求,并且为软件未
来功能扩展打下了良好的基础。
制作 龙鹏飞
实例图 软件输出文档建模
图 1 软件输出文档模型 -基础部分( SoftDocs),
S o f t D o c
+ id [ 0,,1 ], strin g
Para g raph
+ P ar ent P age1
+ P ar agraph s*
+ id [ 0,,1 ], strin g
Item
+ P ar ent1
+ I tems *
+ id [ 0,,1 ], strin g
Pag e
S t y le
+ P ar ent 1 + P ages*
Pag eS et u p In f o
+ tex t[1], strin g
Tex t
+ S td S ty les*
制作 龙鹏飞
实例图 软件输出文档建模
图 2 软件输出文档模型 -表格部分( Tables):
T a bl e
Co l um nRo w
+Paren t1
+R o ws*
+Paren t1 +C o l u mn s *
+Paren t C o l u mn 1
+E x Parag rap h s *
E x P a ra g ra ph
+i d [0.,1 ], s t rin g
So ftDo cs,, It em
So ftDo cs,, St y l e
+i d [0.,1 ], s t rin g
So ftDo cs,, P a ra g ra ph
制作 龙鹏飞
实例图 软件输出文档建模
图 3 软件输出文档模型 -绘制盒部分( DrawingBoxs):
Ima g eB o x
Dra wing B o x
L i neB o x RectB o x
+i d [0,, 1 ], st rin g
+t ex t [0,, 1 ], st rin g
It emB o x
+Paren t1
+Item B o x s
*
E l l i pseB o x
+i d [0,, 1 ], st rin g
So ftDo cs:, It em So ftDo cs:, St y l e