I.总述和预备知识
常见的UML类图一共包含六种关系:关联(Association)、聚合(Aggregation)、组合(Composition)、泛化(Generalization)、依赖(Dependency)、实现(Realization)。
【预备知识】:关于类图的一般UML图示形式,做简单的概括介绍:
在UML类图中,类使用包含类名、属性(field) 和方法(method) 且带有分割线的矩形来表示,比如下图表示一个员工类,它包含name、age和email三个属性,以及modifyInfo()方法:
这其中,属性和方法前分符号代表了这些属性和方法的可见性。UML类图中表示可见性的符号有三种:
+:表示public
-: 表示private
#:表示protected(friendly也归入这类)
另外,对类名、属性和方法的命名也有要求:
?类名:类名中每一个单词的首字母均大写 (Employee)。
?属性和方法名:属性名和方法名的命名按照驼峰命名法,名称中的第一个单词全部小写,之后每个单词仅首字母大写(modifyInfo)。
最后,上面的这个UML的实例用Java代码表示为:
public class Employee {
private String name;
private int age;
private String email;
public void modifyInfo() {
......
}
}
下面从类图的六种关系逐一进行介绍。
II.关联(Association)关系
关联(Association)关系体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如用户和用户的地址。
这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的、关联可以是单向、双向的。
表现在代码层面,为被关联类B以类属性的形式出现在关联类A中,也可能是关联类A引用了一个类型为被关联类B的全局变量。
1??单向关联
??UML图演示:
以上是单向关联的实例,需要类Customer知道类Address,而不需要类Address知道类Customer,那么就是单向关联。在UML类图中,用实线连接有关联关系的对象所对应的类,并通过有无箭头、箭头的单双向区分不同的关联关系。
??Java代码演示:
public class Customer {
private Address address;
……
}
public class Address {
……
}
这里就是上述的:表现在代码层面为被关联类Address以类属性的形式出现在关联类Cusomer中。
2??双向关联
??UML图演示:
以上是双向关联的实例,类Customer需要知道类Product,而类Product也需要知道类Cusomer,那么这两个类就应该是双向关联的。
??Java代码演示:
public class Customer {
private Product[] products;
……
}
public class Product{
private Customer customer;
……
}
3??自关联
??UML图演示:
以上是自关联的实例,自关联体现为类的属性类型为类本身,如链表、树结构。
??Java代码演示:
public class Node {
private Node subNode;
……
}
4??多重性关联
??UML图演示:
以上是多重性关联的实例。多重性关联关系又称为重数性(Multiplicity)关联关系,表示两个关联对象在数量上的对应关系。在UML中,对象之间的多重性可以直接在关联直线上用一个数字或一个数字范围表示。
【补充】多重性与UML表示方式的对应关系:
UML表示方式 | 多重性 |
---|
1…1 | 表示另一个类的一个对象只与该类的一个对象有关系 | 0…* | 表示另一个类的一个对象只与该类的零个或多个对象有关系 | 1…* | 表示另一个类的一个对象只与该类的一个或多个对象有关系 | 0…1 | 表示另一个类的一个对象没有或只与该类的一个对象有关系 | m…n | 表示另一个类的一个对象与该类最少m,最多n个对象有关系 |
??Java代码演示:
public class Form {
private Button[] buttons;
……
}
public class Button {
…
}
III.聚合(Aggregation)关系
聚合(Aggregation)关系是关联关系的一种特例,体现的是整体与部分、拥有的关系,即has-a的关系。
此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享。比如计算机与CPU、车和引擎的关系等。
??UML图演示:
以上是聚合关系的实例。在UML中,聚合关系用带空心菱形的直线表示 ,整体指向部分,空心菱形靠近整体。
??Java代码演示:
public class Car {
private Engine engine;
public Car(Engine engine) {
this.engine = engine;
}
public void setEngine(Engine engine) {
this.engine = engine;
}
……
}
public class Engine {
……
}
表现在代码层面,和关联关系是一致的,只能从语义级别来区分。
IV.组合(Composition)关系
组合(Composition)关系也是关联关系的一种特例,体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合。
同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束。比如你的头和你的嘴巴。
??UML图演示:
以上是组合关系的实例,在UML中,组合关系用带实心菱形的直线表示,整体指向部分,实心菱形靠近整体。
??Java代码演示:
public class Head {
private Mouth mouth;
public Head() {
mouth = new Mouth();
}
……
}
public class Mouth {
……
}
表现在代码层面,和关联关系是一致的,只能从语义级别来区分。
V.泛化(Generalization)关系
泛化(Generalization)关系是一种继承关系,用于描述父类与子类之间的关系,父类又称为基类或超类,子类又称为派生类是一种继承关系。
它表示一般与特殊的关系,指定了子类如何特化父类的所有特征和行为。例如:学生和老师是人类的一种,即有学生、老师的特性也有人类的共性。
??UML图演示:
以上是泛化关系的实例,在UML中,泛化关系用带空心三角形的直线来表示,箭头指向父类。
??Java代码演示:
public class Person {
protected String name;
protected int age;
public void move() {
……
}
public void say() {
……
}
}
public class Student extends Person {
private String studentNo;
public void study() {
……
}
}
在代码实现时,使用面向对象的继承机制来实现泛化关系,在Java语言中使用extends关键字。
VI.依赖(Dependency)关系
依赖(Dependency)关系是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系,即一个类的实现需要另一个类的协助。
另外,在大多数情况下,依赖关系体现在某个类的方法使用另一个类的对象作为参数。
??UML图演示:
以上是依赖关系的实例,在UML中,依赖关系用带箭头的虚线表示,由依赖的一方指向被依赖的一方。
??Java代码演示:
public class Driver {
public void drive(Car car)
{
car.move();
}
……
}
public class Car {
public void move() {
......
}
……
}
代码中体现为在Driver类中的drive方法内使用了Car类的对象。
VII.实现(Realization)关系
实现(Realization)关系是一种类与接口的关系,表示类是接口所有特征和行为的实现。在这种关系中,类实现了接口,类中的操作实现了接口中声明的操作。
??UML图演示:
以上是实现关系的实例,在UML中,类与接口之间的实现关系用带空心三角形的虚线来表示,三角箭头指向接口。
??Java代码演示:
public interface Vehicle {
public void move();
}
public class Ship implements Vehicle {
public void move() {
……
}
}
public class Car implements Vehicle {
public void move() {
……
}
}
代码中,Java使用关键字interface定义接口类,并用关键字implements定义实现。
VIII.UML画法总结
类之间的关系 | UML画法 |
---|
关联关系 | 用实线连接,有无箭头表明单双向。 | 聚合关系 | 带空心菱形的直线表示 ,整体指向部分,空心菱形靠近整体。 | 组合关系 | 带实心菱形的直线表示,整体指向部分,实心菱形靠近整体。 | 泛化关系 | 带空心三角形的直线表示,箭头指向父类。 | 依赖关系 | 带箭头的虚线表示,由依赖的一方指向被依赖的一方。 | 实现关系 | 带空心三角形的虚线表示,三角箭头指向接口。 |
|