UML 类图关系

UML 类图 RelationShip

UML类图几种关系的总结,泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖

在UML类图中,常见的有以下几种关系:


还需要说明的是, 关系并不是非此即彼的,语义上会有一些相似性,有些类之间存在多种关系。

泛化(Generalization)


【定义】:又称广义化。在抽象概念上萃取事物本质,并使其能够描述更大范围同类事物的行为(一般与特殊)。例如,将“大雁”归类(泛化)为“鸟类”,将“鸟类”泛化为“动物”。

当且仅当满足:

  1. 任何一个B概念的实例也是A概念的实例
  2. A概念的实例并不一定是B概念的实例

则可说“A是广义化之后的B”或“A是广义上的B”。

【箭头】:带三角箭头的实线,箭头指向父类,即B --> A。实际操作中完全被当成了继承来使用。。。

【图例】:
UML-Generaliza

【代码实现】:

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");}
}


从耦合性角度来讲,泛化(继承) > 实现 > 组合 > 聚合 > 关联 > 依赖
如果有错欢迎大家指正

参考

UML-wiki
类图-wiki
类图关系-知乎

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值