UML图中的六种关系,也是设计模式的6种关系
- 1、依赖
假设A类的变化引起B类的变化,则说明B类依赖于A类。
UML中使用虚线的箭头表示
Java的实现代码:
public class Driver {
public void driver(Car car) {
car.move();
}
}
public class Car {
public void move() {
System.out.println("向前走1000m");
}
}
- 2、关联
类之间的联系,如用户和订单,每个订单对应特定的客户,每个客户又可以对应一些特定的订单。
UML中使用直线的箭头表示
public class Customer {
private Address address;
}
public class Address {
}
- 3、继承
A是B和C类的父类,B,C具有公共类A,说明A是B,C的一般化。继承关系也称为泛化关系。
UML中使用直线的空心箭头表示
import lombok.Data;
@Data
public class Person {
public String name;
}
import lombok.Data;
@Data
public class Student extends Person{
private String name;
}
import lombok.Data;
@Data
public class Teacher extends Person{
public String name;
}
-
4、实现
用来规定接口和实现接口的类或者构建结构的关系,接口是操作的集合,而这些操作用于规定类或者构建的一种服务。
UML中使用虚线的空心箭头表示
-
5、聚合
表示整体和部分的关系,整体和部分是可以分开的。在聚合关系中,成员类是整体类的一部分,即成员对象是整个对象的一部分,
但是成员对象可以脱离整个对象独立存在。
UML中用空心菱形的直线表示。
- 6、组合
整体与部分的关系,当时整体与部分是不可以分开的
组合关系也是表示类之间的整体和部分的关系,但是组合关系中部分和整体具有统一的生存周期。一旦整体对象不存在,部分对象也不存在
部分对象与整体对象之间具有相同的生命周期。
在组合关系中,成员类是整体类的一部分,而且整体类可以控制成员类的生命周期,即成员类的存在依赖于整体类。
在UML中组合关系用带实心菱形的直线表示。
总结:
1、聚合与组合
(1)聚合与组合都是一种结合关系,只是额外具有整体-部分的意涵。
(2)部件的生命周期不同
聚合关系中,整件不会拥有部件的生命周期,所以整件删除时,部件不会被删除。再者,多个整件可以共享同一个部件。
组合关系中,整件拥有部件的生命周期,所以整件删除时,部件一定会跟着删除。而且,多个整件不可以同时间共享同一个部件。
(3)聚合关系是“has-a”关系,组合关系是“contains-a”关系。
2、关联和聚合
(1)表现在代码层面,和关联关系是一致的,只能从语义级别来区分。
(2)关联和聚合的区别主要在语义上,关联的两个对象之间一般是平等的,例如你是我的朋友,聚合则一般不是平等的。
(3)关联是一种结构化的关系,指一种对象和另一种对象有联系。
(4)关联和聚合是视问题域而定的,例如在关心汽车的领域里,轮胎是一定要组合在汽车类中的,因为它离开了汽车就没有意义了。但是在卖轮胎的店铺业务里,就算轮胎离开了汽车,它也是有意义的,这就可以用聚合了。
3、关联和依赖
(1)关联关系中,体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如我和我的朋友;这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的。
(2)依赖关系中,可以简单的理解,就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是B类的变化会影响到A。
综合比较
这几种关系都是语义级别的,所以从代码层面并不能完全区分各种关系;但总的来说,后几种关系所表现的强弱程度依次为:
组合>聚合>关联>依赖;