UML 类图 RelationShip
UML类图几种关系的总结,泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖
在UML类图中,常见的有以下几种关系:
文章目录
还需要说明的是, 关系并不是非此即彼的,语义上会有一些相似性,有些类之间存在多种关系。
泛化(Generalization)
【定义】:又称广义化。在抽象概念上萃取事物本质,并使其能够描述更大范围同类事物的行为(一般与特殊)。例如,将“大雁”归类(泛化)为“鸟类”,将“鸟类”泛化为“动物”。
当且仅当满足:
- 任何一个B概念的实例也是A概念的实例
- A概念的实例并不一定是B概念的实例
则可说“A是广义化之后的B”或“A是广义上的B”。
【箭头】:带三角箭头的实线,箭头指向父类,即B --> A。实际操作中完全被当成了继承来使用。。。
【图例】:
【代码实现】:
class Bird {
...
}
class WildGoose extends Bird {
...
}
实现(Realization)
【定义】:指的是一个class类实现interface接口(可以是多个)的功能
【箭头】:带三角箭头的虚线,箭头指向接口
【图例】:
【代码实现】:
public interface Player {
void play();
}
class MP3Player implements Player {
void player() {}
}
依赖(Dependency)
【定义】:一个类A在某些情况下使用另一个类B的功能或服务," … uses a …",但是并不持有对类B的引用,即类A没有直接的属性来存储对类B的实例的引用。类A需要使用类B的功能时,通过方法参数或局部变量等方式获取类B的服务(B的属性或方法)。
【箭头】:带燕尾箭头的虚线
【图例】:
【代码实现】:
public class Order {
// 不持有EmailService的实例属性,通过方法参数委托EmailService实例执行任务
// EmailService实例的变化会影响Order方法结果
public void sendEmailByService(EmailService emailService) {
emailService.sendEmail();
}
}
关联(Association)
【定义】:语义上是两个类之间、或类与接口之间一种强依赖关系,是一种长期的稳定的关系。关联可以是一对一,一对多,多对多,有点类似于ER图之间的实体关系。关联对象之间并不存在”拥有“的关系,即被关联对象并不依附于关联对象的存在而存在,两者逻辑上没有包含关系,彼此之间相对独立。
【箭头】:查阅资料说什么的都有,具体情况具体分析。EA中就是实线无箭头,实线加箭头都有,怎么用看情况。
另外的就是多重性的表达方面,比如0…*就表示0个或多个对象,0…1表示0个或一个对象,1就表示一个对象
【图例】:
一个学校可以有多个学生,多个老师,但是他们都是可以独立于学校而存在的,两者生命周期不同。
【代码实现】:
public class School {
// 学校与学生老师一对多
List<Teacher> teachers = new ArrayList<Teacher>();
List<Student> students = new ArrayList<Student>();
}
class Teacher {
// 学生老师多对多
List<Student> students = new ArrayList<Student>();
School school;
}
class Student {
List<Teacher> students = new ArrayList<Teacher>();
School school;
}
聚合(Aggregation)
【定义】:聚合相对于关联这种类与类之间的关系,更加强调整体与部分之间的关系,将整体与部分强耦合在一起,但是部分却可以脱离整体而存在,具体表现在生命周期的不统一,部分可以为多个整体共享。比如上面的关联的【图例】也可以表示聚合。
【箭头】:带空心菱形的实线,菱形指向整体。
【图例】:
【代码实现】:
class Professor {
Course course;
}
class Course {
List<Professor> professors = new ArrayList<Professor>();
}
组合(Composition)
【定义】:组合相对于聚合就是在整体与部分基础上的增强版。整体与部分不能分离,并且整体对象负责管理部分对象的生命周期,一旦整体销毁,部分也会销毁。gpt概括了以下特点:
整体对象拥有部分对象:整体对象包含了部分对象作为其组成部分。这意味着整体对象可以通过成员变量、属性或方法参数等方式持有部分对象的引用。
部分对象的生命周期与整体对象相关:部分对象的创建和销毁由整体对象负责。当整体对象被创建时,部分对象也会被创建;当整体对象被销毁时,部分对象 也会被销毁。
部分对象不能独立存在:部分对象没有独立存在的意义,它们的存在是为了服务于整体对象。通常情况下,部分对象的访问权限被限制在整体对象内部,外部 无法直接访问部分对象。
组合关系是一种强耦合关系:整体对象和部分对象之间具有紧密的关联,它们的生命周期和行为高度依赖彼此。整体对象对部分对象的操作和管理是直接的。
【箭头】:带实心菱形的实线,菱形指向整体。
【图例】:
【代码实现】:
public class Car {
// 表示组合关系,Car类负责创建和管理Engine对象。
private Engine engine;
public Car() {this.engine = new Engine();}
public void start() {engine.start();}
public void stop() {engine.stop();}
}
public class Engine {
// 单独的存在没有意义
public void start() {System.out.println("Engine started");}
public void stop() {System.out.println("Engine stopped");}
}
从耦合性角度来讲,泛化(继承) > 实现 > 组合 > 聚合 > 关联 > 依赖
如果有错欢迎大家指正