UML关系图解

117 阅读3分钟

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
  • 子类继承父类的所有属性和方法

代码示例

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 {
        <<interface>>
        +search(query: String) Item[]
    }
    class Catalog {
        -items: LibraryItem[]
        +addItem(item: LibraryItem) void
    }

    Searchable <|.. Catalog

解释

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

代码示例

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

解释

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

代码示例

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

解释

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

代码示例

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

解释

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

代码示例

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

解释

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

代码示例

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

解释

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

代码示例

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 {
        <<abstract>>
        +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 {
        <<interface>>
        +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类图中主要的关系类型及其符号为:

关系符号含义
继承/泛化空心三角形实线箭头 ◁—子类继承父类
实现空心三角形虚线箭头 ◁...类实现接口
关联普通箭头 —>两个类之间有联系
聚合空心菱形+箭头 ◇—整体包含部分,但部分可独立存在
组合实心菱形+箭头 ♦—整体包含部分,部分不可独立存在
依赖虚线箭头 ...>一个类使用另一个类