UML类图的几种关系

本文详细介绍了UML类图中的四种关系:泛化(继承)、实现(接口实现)、关联(包括自关联、单向关联、双向关联、多重性关联、聚合和组合)以及依赖。通过示例和UML图,展示了这些关系在实际编程中的应用,并提供了对应的Java代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在UML类图中,关系可以分为4种: 泛化, 实现, 关联 和 依赖。

关系名说明箭头及指向
泛化(Generalization)表示”类与类之间的继承关系”带三角箭头的实线,箭头指向父类
实现(Realization)表示”类与接口之间的实现”带三角箭头的虚线,箭头指向接口
关联(Association)表示”类与类之间的拥有关系”。即,一个类是另一个类的成员。关联又包括:自关联, 单向关联, 双向关联, 多重性关联, 组合, 聚合具体分情况
依赖(Dependency)表示”类与类之间的使用关系”。即,一个类是另一类的局部变量, 形式参数, 或者调用了静态方法/成员等带普通箭头的虚线,指向被使用者

泛化(Generalization)

示例:Fruit是”水果”;Apple是”苹果”,它继承了Fruit,是水果中的一种。
UML示例图:

对应的Java代码:

public class Fruit {
    private int price;
    public int getPrice() {
        return price;
    }
    public void setPrice(int price) {
        this.price = price;
    }
}
public class Apple extends Fruit {
}

实现(Realization)

示例:Runnable接口表示”一个任务”,TimeTask是”计时任务”,它实现了Runnable接口。
UML示例图:

对应的Java代码:

public interface Runnable {
    abstract public void run();
}
public class TimeTask implements Runnable{
    @Override
    public void run() {
    }
}

关联(Association)

自关联

关系说明: 一个类包含自己。
箭头及指向:带普通箭头的实心线,指向自己。
示例: Node是单向链表中的节点,它包含下一个节点的指针。
UML示例图:

对应的Java代码:

public class Node {
    private Node node;
}

单向关联

关系说明:”类A”中有”类B”成员变量,”类B”中没有”类A”成员变量.
箭头及指向:带普通单向箭头的实心线,指向被拥有者。
示例:Person表示”人”,IdCard表示”身份证信息”,身份证包括id和身份证编号num。一个人拥有唯一的身份证信息。
UML示例图:

对应的Java代码:

public class Person {
    private IdCard idcard;
}
public class IdCard {
    private int id;
    private String num;
}

双向关联

关系说明:”类A”中有”类B”成员变量,”类B”也有”类A”成员变量。
箭头及指向:带普通双向箭头的实心线或者不带箭头的实心线。
示例:Teacher表示”老师”,Student表示”学生”。老师可以有多个学生,学生也可以有多个老师。
UML示例图:

对应的Java代码:

public class Teacher {
    private Student student;
}
public class Student {
    private Teacher teacher;
}

多重性关联

多重性关联是两个类之间在关联对象上的数量关系。

表示方法说明
1..1表示另一个类的一个对象只与该类的一个对象有关系
0..*表示另一个类的一个对象与该类的零个或多个对象有关系
1..*表示另一个类的一个对象与该类的一个或多个对象有关系
0..1表示另一个类的一个对象没有或只与该类的一个对象有关系
m..n表示另一个类的一个对象与该类最少m,最多n个对象有关系(m≤n)

聚合

关系说明:聚合是整体与部分的关系。聚合关系是类与类之间关系比较密切的关联关系;要区分聚合和其它的关联关系,必须考察具体的逻辑关系。在聚合关系中,成员对象是整体对象的一部分,但是成员对象可以脱离整体对象独立存在。如车和轮胎是整体和部分的关系。
箭头及指向:带空心菱形的实心线,菱形指向整体。
示例:Car表示”汽车”,Tire表示”轮胎”,Engine表示”引擎”。”轮胎”和”引擎”本身是个独立个体。
UML示例图:

对应的Java代码:

public class Car {
    private Tire tire;
    private Engine engine;
}
public class Tire{
}

public class Engine {
}

组合

关系说明:组合是整体与部分的关系。组合关系是比聚合关系还要强的关联关系。但是在组合关系中整体对象可以控制成员对象的生命周期,一旦整体对象不存在,成员对象也将不存在,成员对象与整体对象之间具有同生共死的关系。例如,身体和鼻子,身体包括鼻子,鼻子不能脱离身体而独立存在。
箭头及指向:带实心菱形的实线,菱形指向整体。
示例:Body表示”身体”,Nose表示”鼻子”。身体包含鼻子,鼻子离不开身体。
UML示例图:

对应的Java代码:

public class Company {
    private Nose nose;

    private class Nose {
    }
}

依赖(Dependency)

关系说明:依赖是一种使用的关系。在需要表示一个事物使用另一个事物时使用依赖关系,尽量不使用双向的互相依赖。
箭头及指向:带箭头的虚线,指向被使用者。
示例:人过河。人是”Person”类,它包括过河函数acrossRiver(),acrossRiver()的参数是过河工具,返回值是过河时间。此处的过河工具是船,船对应的类是Boat。
UML示例图:

对应的Java代码:

public class Person {
    public int acrossRiver(Boat boat);
}
public class Boat {
}

参考资料

  1. UML系列03之 UML类图(二)
  2. UML类图几种关系的总结
### UML 中的关系及其代码实现 #### 继承 (Inheritance) 继承表示一种 "is-a" 的关系,在 Python 中可以通过 `class` 定义来体现这种父子之间的关联。 ```python class Animal: def speak(self): pass class Dog(Animal): # Dog is an Animal def speak(self): return "Woof!" ``` 子可以重写父的方法并调用其属性[^1]。 #### 聚合 (Aggregation) 聚合是一种弱的 “has-a” 关系,意味着整体对象拥有部分对象但是不控制它们的生命期。这通常通过组合实例变量完成: ```python class Department: def __init__(self, name): self.name = name self.employees = [] class Employee: def __init__(self, id, department=None): self.id = id self.department = department hr_dept = Department('HR') emp1 = Employee(101, hr_dept) print(emp1.department.name) # 输出 'HR' ``` 这里员工可以在创建时被分配给部门,也可以之后再设置所属部门[^2]。 #### 组合 (Composition) 组合也是一种强形式的 “has-a”,它暗示着当容器对象消失时组件也会随之销毁。Python 中可通过初始化参数传递依赖项: ```python from datetime import date class Address: def __init__(self, street, city): self.street = street self.city = city class Person: def __init__(self, name, birth_date, address_info): self.name = name self.birth_date = birth_date self.address = Address(*address_info) person = Person("Alice", date.today(), ("Main St.", "Wonderland")) del person # 当删除Person对象时Address也被自动清理 ``` 此例子展示了地址作为人的组成部分而存在;如果人不存在,则该特定住址也无意义[^3]。 #### 关联 (Association) 两个独立实体之间简单的双向或多向联系称为关联。此连接可能涉及多个角色或方向上的导航权限。 ```python class Teacher: def teach(self): print(f"{self} teaches.") class Student: teacher = None @classmethod def set_teacher(cls, tchr): cls.teacher = tchr t = Teacher() Student.set_teacher(t) s = Student() if s.teacher: s.teacher.teach() # 可能会打印出教师教课的信息 ``` 在这个场景下,学生和老师相互作用但彼此间并没有所有权的概念[^4]。 #### 依赖 (Dependency) 依赖是指一个使用另一个的服务或接口的情况,通常是临时性的交互而不是长期持有对方引用。 ```python def send_email(email_service, recipient, message): email_service.send(recipient=recipient, content=message) class EmailService: def send(self, **kwargs): print(f'Sending "{kwargs["content"]}" to {kwargs["recipient"]}.') email_svc = EmailService() send_email(email_svc, "example@example.com", "Hello!") ``` 函数 `send_email()` 对象仅在其内部短暂地利用到了邮件服务的功能[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值