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类图中主要的关系类型及其符号为:
关系 | 符号 | 含义 |
---|---|---|
继承/泛化 | 空心三角形实线箭头 ◁--- | 子类继承父类 |
实现 | 空心三角形虚线箭头 ◁... | 类实现接口 |
关联 | 普通箭头 ---> | 两个类之间有联系 |
聚合 | 空心菱形+箭头 ◇--- | 整体包含部分,但部分可独立存在 |
组合 | 实心菱形+箭头 ♦--- | 整体包含部分,部分不可独立存在 |
依赖 | 虚线箭头 ...> | 一个类使用另一个类 |