首先,看懂类图:
- 类(Class)
在面向对象(OO) 编程中,类是对现实世界中一组具有相同特征的物体的抽象。
- 接口(Interface)
接口是一种特殊的类,具有类的结构但不可被实例化,只可以被实现(继承)。在UML中,接口使用一个带有名称的小圆圈来进行表示。
类图之间的关系
1. 泛化(Generalization)
【泛化关系】:是一种继承关系,也称为“is-a-kind-of”关系,泛化关系用于描述父类与子类之间的关系,父类又称作基类或超类,子类又称作派生类。表示一般与特殊的关系,它指定了子类如何特化父类的所有特征和行为。例如:老虎是动物的一种,即有老虎的特性也有动物的共性。
【箭头指向】:带空心三角箭头的实线,箭头指向父类
【代码体现】:继承(extends)
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() {
}
}
2. 实现(Realization)
【实现关系】:是一种类与接口的关系,表示类是接口所有特征和行为的实现。接口之间也可以有与类之间关系类似的继承关系和依赖关系。
【箭头指向】:带三角箭头的虚线,箭头指向接口
【代码体现】:实现(implements)
public interface Vehicle {
public void move();
}
public class Ship implements Vehicle {
public void move() {
}
}
public class Car implements Vehicle {
public void move() {
}
}
3. 关联(Association)
【关联关系】:是一种拥有的关系,它使一个类知道另一个类的属性和方法;如:老师与学生,丈夫与妻子关联可以是双向的,也可以是单向的。双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。在使用类图表示关联关系时可以在关联线上标注角色名。
【箭头及指向】:带普通箭头的实心线,指向被拥有者
【代码体现】:成员变量
双向关联:
public class Customer{
private Product[] products;
}
public class Product {
private Customer customer;
}
单向关联:
public class Customer {
private Address address;
}
public class Address {
}
自关联: 在系统中可能会存在一些类的属性对象类型为该类本身,这种特殊的关联关系称为自关联。
public class Node {
private Node subNode;
}
多重性关联: 表示一个类的对象与另一个类的对象连接的个数。在UML中多重性关系可以直接在关联直线上增加一个数字表示与之对应的另一个类的对象的个数。
public class Form {
private Button buttons[];
}
public class Button {
}
4. 聚合(Aggregation)
【聚合关系】:表示整体与部分的关系,且部分可以脱离整体而独立存在。如车和轮胎是整体和部分的关系,轮胎离开车仍然可以存在。
聚合关系是关联关系的一种,是强的关联关系;关联和聚合在语法上无法区分,必须考察具体的逻辑关系。
【代码体现】:成员变量
【箭头及指向】:带空心菱形的实心线,菱形指向整体
public class Car {
private Engine engine;
public Car(Engine engine) {
this.engine = engine;
}
public void setEngine(Engine engine) {
this.engine = engine;
}
}
public class Engine {
}
5. 组合(Composition)
【组合关系】:是整体与部分的关系,但部分不能离开整体而单独存在。例如公司和部门是整体和部分的关系,没有公司就不存在部门。再比如人与心脏也是是整体和部分的关系,离开了人体心脏不能单独存在。
组合关系是关联关系的一种,是比聚合关系还要强的关联关系,组合关系中部分和整体具有统一的生命周期,一旦整体对象不存在,部分对象也将不存在,部分对象与整体对象之 间具有同生共死的关系。
【箭头及指向】:带实心菱形的实线,菱形指向整体
【代码体现】:成员变量
public class Head {
private Mouth mouth;
public Head() {
mouth = new Mouth();
}
}
public class Mouth {
}
6. 依赖(Dependency)
【依赖关系】:是一种使用的关系,即一个类的实现需要另一个类的协助,假设B类的变化引起了A类的变化,则说名A类依赖于B类。要尽量不使用双向的互相依赖。
【箭头及指向】:带箭头的虚线,由依赖的一方指向被依赖的一方
【代码表现】:局部变量、方法的参数或者对静态方法的调用
public class Driver {
public void drive(Car car) {
car.move();
}
}
public class Car {
public void move() {
}
}
各种关系的强弱顺序:
泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖
用一张图形象展示各种类图关系:
注:本文参考整理自UML图中类之间的关系和UML类图几种关系的总结