类和类之间的关系是多样的,在UML中使用不同的形式来表示。常见的类与类之间的关系包括:关联关系、依赖关系、泛化关系(即继承关系)、接口与实现关系。
1.关联关系
关联关系通常用来表示一种包含(contains)或者有(has)的关系。contains与has的区别,我的理解是一种表达关联强弱的一种区别。contains表示两个类可以独立存在,也可以某一个类包含(使用)另一个类(的功能);而has表示一个类不可以独立于另一个而存在。
关联关系在实现时的表现通常是:B类作为A类的属性存在。
如:在一个登陆界面中有一个登陆按钮,其UML图示如下:
实现代码如下:
public class LoginForm {
private JButton loginButton; //定义为成员变量
……
}
public class JButton {
……
}
关联关系又包含如下几种:
(1)双向关联:
顾客购买并拥有商品、卖出的商品总是与某个顾客相关联。
注意上图中的”purchases”和”is sold to”靠近谁就表示谁。
实现代码如下:
public class Customer {
private Product[] products;
……
}
public class Product {
private Customer customer;
……
}
(2)单向关联
单向关联用带箭头的实线表示。如顾客拥有地址:
代码实现:
public class Customer {
private Address address;
……
}
public class Address {
……
}
(3)自关联
如链表中的节点与next的关系:
代码实现如下:
public class Node {
private Node subNode;
……
}
(4)多重关联
上面中的双向关联、单向关联、自关联都没有说明类与类之间关联的数量上的问题。这个多重关联就是用来说明两个关联对象在数量上的对应关系。
如:一个界面可以有0个或多个button,但是一个button只能在一个界面上。
注意上面的”1…1”与”0…*”靠近谁就表示谁。还要注意箭头。箭头指向者用来表示被拥有者。
代码实现如下:
public class Form {
private Button[] buttons; //定义一个集合对象
……
}
public class Button {
……
}
下面的聚合关系和组合关系都表示整体与部分的关系。其中聚合关系表示弱整体与部分的关系,组合强整体与部分的关系。其实也就是contains与has的关系。
(5)聚合关系
整体与部分可以独立存在。如汽车(car)与发动机(engine)的关系。通常用空心的菱形表示。
在代码实现时,对象通常作为构造方法、setter方法、业务方法的参数注入整体对象中。如:
public class Car {
private Engine engine;
//构造注入
public Car(Engine engine) {
this.engine = engine;
}
//设值注入
public void setEngine(Engine engine) {
this.engine = engine;
}
……
}
public class Engine {
……
}
(6)组合关系
部分只能依赖于整体存在,不可单独存在。在UML中,组合关系用实心菱形表示。Mouth只能依赖于Head而存在,Head没有了,Mouth自然也就消失了。
在代码实现时,对象通常在整体的构造方法中被new出来。如:
public class Head {
private Mouth mouth;
public Head() {
mouth = new Mouth(); //实例化成员类
}
……
}
public class Mouth {
……
}
注意,上面的对象总是作为另一个类的属性存在。