UML关系图解

UML关系图解:以实例说明

概述

UML(统一建模语言)类图是描述系统中类和接口及其关系的有力工具。本文档通过一个简单的图书馆管理系统示例,解释UML类图中的各种关系符号及其含义。

基本符号

类 (Class)

classDiagram class Book { -String title -String author -int year +getTitle() String +setTitle(String) void }

类用矩形表示,分为三个部分:

  • 顶部:类名
  • 中间:属性(字段)
  • 底部:方法(操作)

访问修饰符用符号表示:

  • + 表示 public
  • - 表示 private
  • # 表示 protected
  • ~ 表示 package/default

类之间的关系

1. 继承/泛化 (Inheritance/Generalization)

继承关系用空心三角形箭头表示,指向父类。

classDiagram class LibraryItem { +String id +String title +checkOut() void +returnItem() void } class Book { +String author +int pages } class DVD { +int duration +String director } LibraryItem <|-- Book LibraryItem <|-- DVD

解释

  • Book 继承自 LibraryItem
  • DVD 继承自 LibraryItem
  • 子类继承父类的所有属性和方法

代码示例

typescript 复制代码
abstract class LibraryItem {
  id: string;
  title: string;

  checkOut(): void { /* ... */ }
  returnItem(): void { /* ... */ }
}

class Book extends LibraryItem {
  author: string;
  pages: number;
}

class DVD extends LibraryItem {
  duration: number;
  director: string;
}

2. 实现 (Implementation)

实现关系用空心三角形+虚线箭头表示,指向接口。

classDiagram class Searchable { <> +search(query: String) Item[] } class Catalog { -items: LibraryItem[] +addItem(item: LibraryItem) void } Searchable <|.. Catalog

解释

  • Catalog 实现了 Searchable 接口
  • 实现类必须提供接口中定义的所有方法

代码示例

typescript 复制代码
interface Searchable {
  search(query: string): LibraryItem[];
}

class Catalog implements Searchable {
  private items: LibraryItem[];

  search(query: string): LibraryItem[] {
    // 实现搜索逻辑
    return this.items.filter(item => item.title.includes(query));
  }

  addItem(item: LibraryItem): void {
    this.items.push(item);
  }
}

3. 关联 (Association)

关联关系用普通箭头表示,表示两个类之间有连接。

classDiagram class User { +String name +String id } class LibraryCard { +String cardNumber +Date expirationDate } User -- LibraryCard

解释

  • 用户和图书卡之间有关联关系
  • 双向关联:两个类都可以访问对方

代码示例

typescript 复制代码
class User {
  name: string;
  id: string;
  card: LibraryCard;
}

class LibraryCard {
  cardNumber: string;
  expirationDate: Date;
  owner: User;
}

4. 定向关联

关联可以是单向的,用单向箭头表示。

classDiagram class Book { +String title } class Author { +String name } Book --> Author

解释

  • 书籍知道它的作者是谁
  • 但作者不一定知道他写了哪些书

代码示例

typescript 复制代码
class Author {
  name: string;
}

class Book {
  title: string;
  author: Author; // Book引用Author
}

5. 聚合 (Aggregation)

聚合关系用空心菱形+箭头表示,表示"整体-部分"关系,但部分可以独立于整体存在。

classDiagram class Library { +String name +String location } class LibraryBranch { +String branchName +String address } Library o-- LibraryBranch

解释

  • 图书馆包含多个分馆
  • 分馆可以独立存在,即使主图书馆不存在

代码示例

typescript 复制代码
class LibraryBranch {
  branchName: string;
  address: string;
}

class Library {
  name: string;
  location: string;
  branches: LibraryBranch[] = [];

  addBranch(branch: LibraryBranch): void {
    this.branches.push(branch);
  }
}

6. 组合 (Composition)

组合关系用实心菱形+箭头表示,表示更强的"整体-部分"关系,部分不能独立于整体存在。

classDiagram class Book { +String title } class Chapter { +String title +int number } Book *-- Chapter

解释

  • 书籍由章节组成
  • 章节不能独立于书籍存在,删除书籍时章节也会被删除

代码示例

typescript 复制代码
class Chapter {
  title: string;
  number: number;

  constructor(title: string, number: number) {
    this.title = title;
    this.number = number;
  }
}

class Book {
  title: string;
  chapters: Chapter[] = [];

  constructor(title: string) {
    this.title = title;
  }

  addChapter(title: string): void {
    const number = this.chapters.length + 1;
    this.chapters.push(new Chapter(title, number));
  }
}

7. 依赖 (Dependency)

依赖关系用虚线箭头表示,表示一个类使用另一个类。

classDiagram class LibrarySystem { +generateReport() Report } class Report { +String content +Date generatedDate } LibrarySystem ..> Report

解释

  • 图书馆系统依赖于报告类
  • 图书馆系统使用报告类,但不存储报告对象

代码示例

typescript 复制代码
class Report {
  content: string;
  generatedDate: Date = new Date();
}

class LibrarySystem {
  generateReport(): Report {
    const report = new Report();
    report.content = "Library Status Report";
    return report;
  }
}

多重性 (Multiplicity)

关系线上的数字表示多重性,指示一个类的实例可以关联到另一个类的多少个实例。

classDiagram class User { +String name } class Book { +String title } User "1" -- "0..*" Book : borrows

常见多重性表示

  • 1 表示正好一个
  • 0..1 表示零个或一个
  • *0..* 表示零个或多个
  • 1..* 表示一个或多个
  • m..n 表示最少m个、最多n个

完整的示例:图书馆管理系统

下面是一个更完整的图书馆管理系统UML类图示例,展示了各种关系类型。

classDiagram class LibraryItem { <> +String id +String title +boolean isAvailable +checkOut() void +returnItem() void } class Book { +String author +int pages +String ISBN } class DVD { +int duration +String director } class Searchable { <> +search(query: String) LibraryItem[] } class Library { +String name +addItem(item: LibraryItem) void +removeItem(id: String) void } class LibraryBranch { +String branchName +String address } class User { +String name +String id +borrowItem(item: LibraryItem) void +returnItem(item: LibraryItem) void } class Librarian { +String employeeId +processReturn(item: LibraryItem) void } class Catalog { -items: LibraryItem[] +addItem(item: LibraryItem) void } class ReportGenerator { +generateBorrowingReport() Report } class Report { +String content +Date generatedDate } LibraryItem <|-- Book LibraryItem <|-- DVD Searchable <|.. Catalog User <|-- Librarian Library o-- LibraryBranch Library *-- Catalog Library "1" -- "0..*" LibraryItem User "1" -- "0..*" LibraryItem : borrows > ReportGenerator ..> Report Catalog "1" -- "*" LibraryItem

小结

UML类图中主要的关系类型及其符号为:

关系 符号 含义
继承/泛化 空心三角形实线箭头 ◁--- 子类继承父类
实现 空心三角形虚线箭头 ◁... 类实现接口
关联 普通箭头 ---> 两个类之间有联系
聚合 空心菱形+箭头 ◇--- 整体包含部分,但部分可独立存在
组合 实心菱形+箭头 ♦--- 整体包含部分,部分不可独立存在
依赖 虚线箭头 ...> 一个类使用另一个类
相关推荐
王伯爵6 小时前
Unified Modeling Language,统一建模语言
uml
cooldream20096 小时前
深入解析UML图:版本演变、静态图与动态图详解
uml·系统架构师
未定义.22110 小时前
UML-饮料自助销售系统(饮料已售完)序列图
设计模式·流程图·状态模式·软件工程·需求分析·uml
NiKo_W1 天前
头歌软件工程导论UML画图题(基于starUML)
软件工程·uml·实训
aiden:)1 天前
星巴克咖啡下单系统:UML 类图解析与代码实现
设计模式·软件工程·uml·装饰器模式
未定义.2213 天前
UML-银行取款序列图
设计模式·流程图·软件工程·需求分析·uml
郭涤生7 天前
UML组件图
笔记·uml·软件设计
郭涤生7 天前
UML对象图
笔记·架构·uml
光头颜7 天前
UML之序列图的参与者与生命线
软件工程·uml