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{ <<interface>> +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实现)
相关推荐
艾利克斯冰1 天前
Java设计模式详解-七大设计原则(持续更新中)
设计模式·uml·开闭原则
HEADKON1 天前
尼洛替尼300mg每日两次空腹服用治慢粒,QT延长风险高,低钾低镁需纠正后用药
uml
rolt3 天前
PlantUML描述《分析模式》第4章企业财务观察(2)
领域模型·架构师·uml
吴声子夜歌6 天前
PlantUML——状态图
uml·plantuml·状态图
吴声子夜歌6 天前
PlantUML——序列图
uml·plantuml·序列图
吴声子夜歌6 天前
PlantUML——活动图
uml·plantuml·活动图
吴声子夜歌7 天前
PlantUML——类图(一)
uml
吴声子夜歌7 天前
PlantUML——类图(二)
uml·plantuml·类图
吴声子夜歌7 天前
PlantUML——对象图
uml·plantuml·对象图
吴声子夜歌8 天前
PlantUML——用例图
uml·plantuml