目录
1、面向对象建模常见的关系
2、关系的组成元素
3、依赖关系
4、泛化关系
5、关联关系
关联的四种修饰
1.名称
2.角色
3.多重性
4.聚合
6、常用建模技术
6.1、对简单依赖建模
6.2、对单继承建模
6.3、对结构关系建模
1、面向对象建模常见的关系
依赖 (dependency)
它表示类之间的使用关系(包括精化、跟踪和绑定关系)。
例如,水管依赖热水器,对它们所运送的水进行加热。
泛化 (generalization)
它把一般类连接到它的特殊类,也称为超类/子类关系或父/子关系。
例如,观景窗是一种带有固定的大窗格的窗户,庭院窗是一种带有向两边开的窗格的窗户。
关联 (association)
是实例之间的结构关系。1对1、1对多、多对多等
例如,房间是由墙和一些其他事物组成的,墙上可以镶嵌门和窗,管道可以穿过墙体。
实现(realization)
它表示接口与类之间的关系 。(不作为后续重点)
其中的每一种关系都为组合抽象提供了不同的方法。
2、关系的组成元素
关系名、关系所连接的事物、关系的特性
3、依赖关系
说明一个事物(如类 Window)使用另一个事物(如类Event)的信息和服务,但反之未必。
在图形上,把依赖画成一条有向的虚线,指向被依赖的事物。
当要指明一个事物使用另一个事物时,就选用依赖。
在大多数情况下,在类与类之间用依赖指明一个类使用另一个类的操作,或者使用其他类所定义的变量和参量,
如果被使用的类发生变化,那么另一个类的操作也会受到影响,因为这个被使用的类此时可能表现
出不同的接口或行为。
在一般情况下,用衍型区别依赖的不同含义
4、泛化关系
是一般事物(称为超类或父类)和该事物的较为特殊的种类(称为子类或子)之间的关系。有时也
称泛化为“is-a-kind-of” 关系:
一个事物(如类BayWindow)是更一般的事物(如类 Window)的“一个种类”。泛化意味着子类的对象可以被用在父类的对象可能出现的任何地方,反之则不然。
换句话说,泛化意味着子类可以替换父类的声明。子类继承父类的特性,特别是父类的属性和操作。
若子类的一个操作的实现覆盖了父类的同样一个操作的实现,则这种情况称为多态性。其共同之处是,两个操作必须具有相同的特征标记(相同的名字和参数)。
在图形上,把泛化画成一条带有空心三角形大箭头的有向实线,指向父类,如图所示。当要表示父/子关系时,就使用泛化。
没有父类并且最少有一个子类的类称为根类或基类;
没有子类的类称为叶子类。
如果一个类只有一个父类,则说它使用了单继承;
如果一个类有多个父类,则说它使用了多继承。
5、关联关系
是一种结构关系,它指明一个事物的对象与另一个事物的对象间的联系。
给定一个连接两个类的关联,可以从一个类的对象联系到另一个类的对象。
关联的两端都连到同一个类是完全合法的。
从类的一个给定对象能连接到该类的其他对象。恰好连接两个类的关联叫做二元关联。尽管不太常见,但可以有连接多于两个类的关联,这种关联叫做n元关联。
在图形上,把关联画成一条连接相同类或不同类的实线。当要表示结构关系时,就使用关联。
关联的四种修饰
1.名称
关联可以有一个名称,用以描述该关系的性质。为了消除名称的歧义,可提供一个指出读名称方向的三角形,给名称一个方向
2.角色
当一个类参与了一个关联时,它就在这个关系中扮演了一个特定的角色。角色是关联中靠近它的一端的类对另一端的类呈现的面孔。可以显式地命名一个类在关联中所扮演的角色。
3.多重性
关联表示了对象间的结构关系。在很多建模问题中,说明一个关联的实例中有多少个相互连接的对象是很重要的。
一个(1)、零个或一个(0..1)、多个(0..*)、一个或多个(1..*)
一个整数范围(如2..5)
4.聚合
两个类之间的简单关联表示了两个同等地位的类之间的结构关系,这意味着这两个类在概念上是同级别的,一个类并不比另一个类更重要。
有时要对“整体/部分”关系建模,其中一个类描述了一个较大的事物(“整体”),它由较小的事物(“部分”)组成。这种关系称为聚合,它描述了“has-a”关系,意思是整体对象拥有部分对象。
其实聚合只是一种特殊的关联,它被表示为在整体的一端用一个空心菱形修饰的简单关联
空心菱形
6、常用建模技术
6.1、对简单依赖建模
是两个类之间的连接,其中的一个类只是使用另一个类作为它的操作参数。
创建一个依赖关系,从含有操作的类指向被该操作用来作为参数的类。
下图中显示了一个从CourseSchedule到Course的依赖,因为Course被用作CourseSchedule的操作add和remove的参数。
6.2、对单继承建模
在结构或行为上与其他的类相似的类。可以把这样的每一个类建模为独立的、不相关的抽象。但更好的方法是提取所有共同的结构特征和行为特征,并把它们提升到较为一般的类中,特殊类从中继承这些特征。
给定一组类,寻找两个或两个以上的类中的共同职责、属性和操作。
把这些共同的职责、属性和操作提升到较为一般的类中。如果需要,创建一个新类,用以指派这些元素
画出从每个特殊类到它的较一般的父类的泛化关系,用以表示较特殊的类继承较一般的类。
针对斜体的Security类、presentValue()方法
经常会遇到不完全的或不想让它有任何对象的非叶子类。通常把这样的类称为抽象类(abstract class)。
在UML中,通过把类名写为斜体,以指明这个类是抽象的,例如类 Security 就是如此。
同理,针对操作presentValue,它是不完全的,必须在较低的抽象层次用一定的方法实现
6.3、对结构关系建模
当用依赖或泛化关系建模时,可能是对表示了不同重要级别或不同抽象级别的类建模。给定两个类间的依赖,则一个类依赖另一个类,但后者没有前者的任何信息。给定两个类间的泛化关系,则子类从它的父类继承,但父类没有任何子类所特有的信息。简而言之,依赖和泛化关系都是不对称的。
当用关联关系建模时,是在对相互同等的两个类建模。给定两个类间的关联,则这两个类以某种方式相互依赖,并且常常从两边都可以导航。
依赖是使用关系,泛化是“is-a-kind-of”关系,而关联描述了类的对象之间相互作用的结构路径。
结构建模过程
关联关系
- 对于每一对类,如果需要从一个类的对象到另一个类的对象导航,就要在这两个类之间说明一个关联。这是关联的数据驱动观点。
- 对于每一对类,如果一个类的对象要与另一个类的对象相互交互,而后者不作为前者的过程局部变量或者操作参数,就要在这两个类间说明一个关联。这是关联的行为驱动观点。
- 对于这样的每一个关联,要说明其多重性(特别是当多重性不为*时,其中*是默认的多重性)和角色名(特别是在有助于解释模型的情况下)。
- 如果关联中的一个类与另一端的类相比,前者在结构或者组织上是一个整体,后者看起来像它的部分,则在靠近整体的一端用一个菱形对该关联进行修饰,从而把它标记为聚合。
- 怎样才能知道一个给定类的对象何时必须与另一个类的对象相互作用?答案是,CRC 卡和用况分析非常有助于考虑结构性和行为性脚本。在有两个或两个以上的类用数据关系进行交互的地方说明一个关联。
从该图的左下部开始,可以找到名称为Student、Course和Instructor的类。在Student和Course之间有一个关联,它描述了学生参加的课程。同时,每一名学生可以参加任意门数的课程,而每一门课程可以由任意名学生参加。类似地,在Course和Instructor之间也有一个关联,它描述了教师所教的课程。每一门课至少有一名教师,而每一名教师可以教零到多门课。每门课精确地属于一个系。
School和Student以及它和Department之间的关系有点不同。在这里可以看到聚合关系。一所学校可以有零到多名学生,一名学生可以是在一所或者多所学校注册的学员,一所学校可以有一个或多个系,每个系只能属于一所学校。可以不用聚合修
饰而用简单的关联,但通过说明School是整体,Student和Department是部分,可以说清楚在组织上哪个高于哪个。因此,学校在一定程度上由学生和学生所在的系来定义。类似地,实际上学生和系并不是与他们所属的学校无关,而是从他们的学校能得到他们的身份。
在Department和Instructor之间有两个关联。其中的一个关联说明可以指派一名教师到一个或多个系中,而一个系可以有一名或多名教师。由于在学校的组织结构中系比教师的层次要高,所以这要用聚合来建模。另一个关联表明一个系只能有一名教师是系主任。这种建模方式说明,一名教师最多是一个系的系主任,并且某些教师不是任何系的系主任。