UML类图关系

UML 类图中最常见的几种关系有:泛化(Generalization)、实现(Realization)、组合(Composition)、聚合(Aggregation)、关联(Association)和依赖(Dependency)。这些关系的强弱顺序为:泛化=实现 > 组合 > 聚合 > 关联 > 依赖。

泛化关系

泛化(Generalization)是一种继承关系,表示一般与特殊的关系,它指定了子类如何特化父类的所有特征和行为。

UML泛化(generalization)关系表示法为:空心三角形+实线。用mermaid表示为A <|-- B

例如:哺乳动物具有恒温、胎生、哺乳等生理特征,猫和牛都是哺乳动物,也都具有这些特征,但除此之外,猫会捉老鼠,牛会耕地。

classDiagram class MammalAnimal { +feature() } class Cat { +feature() +catchingMouse() } class Cattle { +feature() +farmland() } MammalAnimal <|-- Cat MammalAnimal <|-- Cattle

用Java语言表示为

java 复制代码
public class Cat extends MammalAnimal{
    ...
}
public class Cattle extends MammalAnimal{
    ...
}

实现关系

实现(realization)是一种类与接口的关系,表示类是接口所有特征和行为的实现。

UML实现(realization)关系表示法为:虚线+空心三角形。用mermaid表示为A..|>B(A实现了B)。

例如:蝙蝠也是哺乳动物,它除具有哺乳动物的一般特征之外,还会飞,我们可以定义一个IFlyable的接口,表示飞行的动作,而蝙蝠需要实现这个接口。

classDiagram class IFlyable{ <> +flying() } class Bat{ +flying() } IFlyable <|.. Bat

用Java语言表示为

java 复制代码
public interface IFlyable{
    void flying()
}
public class Bat implements IFlyable{
    @Override
    void flying(){
        ...
    }
}

组合关系

组合(composition)也表示整体与部分的关系,但部分离开整体后无法单独存在。因此,组合与聚合相比是一种更强的关系。

UML组合(composition)关系表示法为:实心菱形+实线。用mermaid表示为:A *--B(B是A的一部分)。

例如:我们的电脑由CPU、主板、硬盘、内存组成,电脑与CPU、主板、硬盘、内存是整体与部分的关系,但如果让CPU、主板等组件单独存在,就无法工作,因此没有意义。

classDiagram class Computer{ } class CPU{ } class Mainboard{ } class HardDisk{ } class MemeryCard{ } Computer *-- CPU Computer *-- Mainboard Computer *-- HardDisk Computer *-- MemeryCard

用Java语言表示为

java 复制代码
public class Computer{
    private Cpu cpu;
    private Mainboard mainboard;
    private HardDisk hardDisk;
    private Memery memery;
    
    public Computer(){
        cpu=new Cpu();
        mainboard=new Mainboard();
        hardDisk=new HardDisk();
        memery=new Memery();
    }
}

Computer类在实例化之前一定要先实例化其他部分。

聚合关系

聚合关系表示一种弱的拥有关系,即A对象可以拥有B对象,但B对象不是A对象的一部分。

聚合(aggregation)关系的UML表示法为:空心菱形+实线箭头。用mermaid表示为A o--> B

从逻辑上来说,停车场中有汽车,但汽车并不是停车场的一部分。汽车和停车场之间没有部分和整体之间的关系。

classDiagram class Parking { -ParkingSpacesNum -ExportsNum +Open() +Close() } class Car { -Engine +Run() -Stop() } Parking "1" o--> "*" Car

用Java语言表示为

java 复制代码
public class Parking{
    private List<Car> carList;
    
    public Parking(){
    
    }
}

Parking可先实例化,carList可有可无。

关联关系

实体之间的一个结构化关系表明对象之间是相互连接的。箭头可选,没有箭头则表示双向的关联关系,单箭头表示单向的关联关系。

UML关联(association)关系表示法为:实线+箭头。用mermaid表示为A --> B

例如:Employee可以有0个或更多的TimeCard对象。但是,每个TimeCard只从属于单独一个Employee。

classDiagram Employee "1" --> "0..*" TimeCard

用Java语言表示

java 复制代码
public class Employee{
    private TimeCard _tc;
    public void maintainTimeCard(){
        ...
    }
}

依赖关系

对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖于另一个对象的服务时,这两个对象之间主要体现为依赖关系。依赖关系具体表现在局部变量、方法的参数,以及对静态方法的调用上。

UML依赖(dependency)关系表示法为:虚线+箭头。用mermaid表示为A ..> B(A依赖于B)。

例如:动物有几大特征,如新陈代谢、繁殖、有生命。而动物要有生命力,就需要氧气、水及食物,也就是说,动物依赖于氧气和水。

classDiagram Animal ..> Water Animal ..> Oxygen

用Java语言表示为

java 复制代码
public abstract class Animal{
    public String Metabolism(Oxygen oxygen, Water water){
        ...
    }
}

参考资料

  • mermaid语法之类图
  • Java面向对象程序设计(第3版)
  • 人人都懂设计模式:从生活中领悟设计模式(Python实现)
相关推荐
Minilinux20184 小时前
工具使用系列之 PlantUML画UML时序图
uml·plantuml·统一建模语言·sequence·时序图
小湘西4 小时前
UML 用例图图中包含和扩展区别
uml·设计规范·设计语言
明洞日记4 小时前
【图解软考八股034】深入解析 UML:识别标准建模图示
c++·软件工程·软考·uml·面向对象·架构设计
奋斗的小方4 天前
01 一文读懂UML类图:核心概念与关系详解
java·uml
钝挫力PROGRAMER5 天前
UML构造块中的关系梳理
软件工程·uml
未来之窗软件服务5 天前
计算机等级考试—UML 核心图分类与图标对照表—东方仙盟练气期
uml·计算机软考·仙盟创梦ide·东方仙盟
rolt8 天前
质量需求当成愿景、伪创新的基本盘《软件方法》第2章
产品经理·uml·软件方法
rolt16 天前
利用AI识别损毁程度是愿景吗《软件方法》第2章
产品经理·需求分析·uml
rolt16 天前
[pdf]《软件方法》全流程引领AI-电子书共435页202601更新
产品经理·ddd·架构师·uml·领域驱动设计
:mnong16 天前
跟着《软件需求分析和设计实践指南》成长
学习·需求分析·uml·软件需求