使用Mermaid绘制UML类图
节点定义
类
基础类
TypeScript 定义:
class User {
public id: string;
public name: string;
public email: string;
constructor(id: string, name: string, email: string) {
this.id = id;
this.name = name;
this.email = email;
}
public getInfo(): string {
return `${this.name} (${this.email})`;
}
}
对应的 UML 类图:
Mermaid 语法:
classDiagram
class User {
id: string
name: string
email: string
constructor(id: string, name: string, email: string)
getInfo() string
}
抽象类
TypeScript 定义:
abstract class Animal {
protected name: string;
protected age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
abstract makeSound(): void;
public getInfo(): string {
return `${this.name}, ${this.age} years old`;
}
protected sleep(): void {
console.log(`${this.name} is sleeping`);
}
}
对应的 UML 类图:
Mermaid 语法:
classDiagram
class Animal {
<<abstract>>
name: string
age: number
constructor(name: string, age: number)
makeSound()* void
getInfo() string
sleep() void
}
泛型类
TypeScript 定义:
class Container<T> {
private items: T[] = [];
public add(item: T): void {
this.items.push(item);
}
public remove(item: T): boolean {
const index = this.items.indexOf(item);
if (index >1) {
this.items.splice(index, 1);
return true;
}
return false;
}
public get(index: number): T | undefined {
return this.items[index];
}
public size(): number {
return this.items.length;
}
}
class StringContainer extends Container<string> {
public join(separator: string = ','): string {
return this.items.join(separator);
}
}
对应的 UML 类图:
Mermaid 语法:
classDiagram
class Container~T~ {
T[] items
add(item: T) void
remove(item: T) boolean
get(index: number) T | undefined
size() number
}
class StringContainer {
join(separator: string) string
}
Container~T~ <|-- StringContainer
接口
基础接口
TypeScript 定义:
interface IVehicle {
brand: string;
model: string;
year: number;
start(): void;
stop(): void;
getInfo(): string;
}
对应的 UML 类图:
Mermaid 语法:
classDiagram
class IVehicle {
<<interface>>
brand: string
model: string
year: number
start() void
stop() void
getInfo() string
}
泛型接口
TypeScript 定义:
interface IRepository<T> {
save(entity: T): void;
findById(id: string): T | null;
findAll(): T[];
delete(id: string): boolean;
}
对应的 UML 类图:
Mermaid 语法:
classDiagram
class IRepository~T~ {
<<interface>>
save(entity: T) void
findById(id: string) T | null
findAll() T[]
delete(id: string) boolean
}
TypeScript 类型系统
联合类型和可选属性
TypeScript 定义:
class Product {
public id: string;
public name: string;
public price: number;
public description?: string; // 可选属性
public category: string | number; // 联合类型
public tags?: string[]; // 可选数组
public metadata?: Record<string, any>; // 可选对象
}
对应的 UML 类图:
Mermaid 语法:
classDiagram
class Product {
id: string
name: string
price: number
description?: string
category: string | number
tags?: string[]
metadata?: Record<string, any>
}
枚举类型
TypeScript 定义:
enum OrderStatus {
PENDING = 'pending',
PLACED = 'placed',
SHIPPED = 'shipped',
DELIVERED = 'delivered',
CANCELLED = 'cancelled'
}
enum UserRole {
ADMIN = 'admin',
USER = 'user',
MODERATOR = 'moderator',
GUEST = 'guest'
}
class Order {
public id: string;
public status: OrderStatus;
public userId: string;
public total: number;
constructor(id: string, userId: string, total: number) {
this.id = id;
this.userId = userId;
this.total = total;
this.status = OrderStatus.PENDING;
}
}
对应的 UML 类图:
Mermaid 语法:
classDiagram
class OrderStatus {
<<enumeration>>
PENDING
PLACED
SHIPPED
DELIVERED
CANCELLED
}
class UserRole {
<<enumeration>>
ADMIN
USER
MODERATOR
GUEST
}
class Order {
id: string
status: OrderStatus
userId: string
total: number
constructor(id: string, userId: string, total: number)
}
Order --> OrderStatus : has
节点关系
继承关系
用例场景: 动物分类系统 - 动物是一个抽象基类,定义了所有动物共有的属性和行为。狗和猫都继承自动物类,它们都有名字和年龄,都会发出声音,但具体的叫声不同。狗有独特的品种属性,猫有独特的颜色属性。
TypeScript 定义:
class Dog extends Animal {
private breed: string;
constructor(name: string, age: number, breed: string) {
super(name, age);
this.breed = breed;
}
public makeSound(): void {
console.log('Woof!');
}
public fetch(): void {
console.log(`${this.name} is fetching`);
}
}
class Cat extends Animal {
private color: string;
constructor(name: string, age: number, color: string) {
super(name, age);
this.color = color;
}
public makeSound(): void {
console.log('Meow!');
}
public climb(): void {
console.log(`${this.name} is climbing`);
}
}
对应的 UML 类图:
Mermaid 语法:
classDiagram
class Animal {
<<abstract>>
name: string
age: number
makeSound()* void
getInfo() string
}
class Dog {
breed: string
makeSound() void
fetch() void
}
class Cat {
color: string
makeSound() void
climb() void
}
Animal <|-- Dog
Animal <|-- Cat
实现关系
用例场景: 飞行器系统 - 定义了飞行接口,规定了所有飞行器都必须具备的飞行能力。鸟类和飞机都实现了这个接口,但它们的飞行方式和高度完全不同。鸟类是生物飞行,飞机是机械飞行,但它们都遵循相同的飞行协议。
TypeScript 定义:
interface IFlyable {
fly(): void;
getAltitude(): number;
}
class Bird implements IFlyable {
private species: string;
private altitude: number = 0;
constructor(species: string) {
this.species = species;
}
public fly(): void {
this.altitude = 100;
console.log(`${this.species} is flying`);
}
public getAltitude(): number {
return this.altitude;
}
}
class Airplane implements IFlyable {
private model: string;
private altitude: number = 0;
constructor(model: string) {
this.model = model;
}
public fly(): void {
this.altitude = 30000;
console.log(`${this.model} is flying`);
}
public getAltitude(): number {
return this.altitude;
}
}
对应的 UML 类图:
关联关系
用例场景: 学生选课系统 - 学生可以选择多门课程,每门课程也可以有多个学生。学生和课程之间是多对多的关联关系,学生可以随时选课或退课,课程也可以添加或移除学生。
TypeScript 定义:
class Student {
public id: string;
public name: string;
public courses: Course[] = [];
constructor(id: string, name: string) {
this.id = id;
this.name = name;
}
public enrollCourse(course: Course): void {
this.courses.push(course);
}
}
class Course {
public id: string;
public name: string;
public students: Student[] = [];
constructor(id: string, name: string) {
this.id = id;
this.name = name;
}
public addStudent(student: Student): void {
this.students.push(student);
}
}
对应的 UML 类图:
Mermaid 语法:
classDiagram
class Student {
id: string
name: string
courses: Course[]
enrollCourse(course: Course) void
}
class Course {
id: string
name: string
students: Student[]
addStudent(student: Student) void
}
Student --> Course : enrolls in
Course --> Student : has students
组合关系(强依赖)
用例场景: 汽车制造系统 - 汽车由发动机和轮子组成,这些部件是汽车的核心组成部分。发动机和轮子不能独立于汽车存在,当汽车被销毁时,这些部件也会被销毁。这体现了"整体与部分不可分离"的组合关系。
TypeScript 定义:
class Car {
public brand: string;
public model: string;
public engine: Engine;
public wheels: Wheel[];
constructor(brand: string, model: string) {
this.brand = brand;
this.model = model;
this.engine = new Engine(); // 组合:汽车拥有发动机
this.wheels = [
new Wheel(), new Wheel(),
new Wheel(), new Wheel()
]; // 组合:汽车拥有四个轮子
}
public start(): void {
this.engine.start();
}
}
class Engine {
public horsepower: number;
constructor() {
this.horsepower = 200;
}
public start(): void {
console.log('Engine started');
}
}
class Wheel {
public size: number;
constructor() {
this.size = 17;
}
}
对应的 UML 类图:
Mermaid 语法:
classDiagram
class Car {
brand: string
model: string
engine: Engine
wheels: Wheel[]
start() void
}
class Engine {
horsepower: number
start() void
}
class Wheel {
size: number
}
Car *-- Engine : has
Car *-- Wheel : has
聚合关系(弱依赖)
用例场景: 公司组织架构 - 部门包含多个员工,但员工可以调岗到其他部门,也可以离职。部门解散时,员工可以选择去其他部门或离开公司。这体现了"整体与部分可以分离"的聚合关系。
TypeScript 定义:
class Department {
public id: string;
public name: string;
public employees: Employee[] = [];
constructor(id: string, name: string) {
this.id = id;
this.name = name;
}
public addEmployee(employee: Employee): void {
this.employees.push(employee);
}
public removeEmployee(employee: Employee): void {
const index = this.employees.indexOf(employee);
if (index > -1) {
this.employees.splice(index, 1);
}
}
}
class Employee {
public id: string;
public name: string;
public department?: Department;
constructor(id: string, name: string) {
this.id = id;
this.name = name;
}
public assignToDepartment(department: Department): void {
this.department = department;
department.addEmployee(this);
}
}
对应的 UML 类图:
Mermaid 语法:
classDiagram
class Department {
id: string
name: string
employees: Employee[]
addEmployee(employee: Employee) void
removeEmployee(employee: Employee) void
}
class Employee {
id: string
name: string
department?: Department
assignToDepartment(department: Department) void
}
Department o-- Employee : contains
依赖关系
用例场景: 订单处理系统 - 订单服务在创建订单时需要临时使用验证器来验证订单数据,在发送通知时需要临时使用邮件通知器。这些依赖对象只在特定方法中使用,不是订单服务的持久属性。
TypeScript 定义:
class OrderService {
public createOrder(orderData: OrderData): Order {
const validator = new OrderValidator(); // 依赖:临时使用验证器
if (!validator.validate(orderData)) {
throw new Error('Invalid order data');
}
const order = new Order(orderData);
return order;
}
public sendNotification(order: Order): void {
const notifier = new EmailNotifier(); // 依赖:临时使用通知器
notifier.send(`Order ${order.id} created successfully`);
}
}
class OrderValidator {
public validate(orderData: OrderData): boolean {
// 验证逻辑
return orderData.items && orderData.items.length > 0;
}
}
class EmailNotifier {
public send(message: string): void {
console.log(`Email sent: ${message}`);
}
}
class Order {
public id: string;
public items: any[];
constructor(orderData: OrderData) {
this.id = Math.random().toString(36).substr(2, 9);
this.items = orderData.items;
}
}
interface OrderData {
items: any[];
}
对应的 UML 类图:
Mermaid 语法:
classDiagram
class OrderService {
createOrder(orderData: OrderData) Order
sendNotification(order: Order) void
}
class OrderValidator {
validate(orderData: OrderData) boolean
}
class EmailNotifier {
send(message: string) void
}
class Order {
id: string
items: any[]
}
OrderService ..> OrderValidator : uses
OrderService ..> EmailNotifier : uses
OrderService ..> Order : creates
多重关系示例
用例场景: 大学管理系统 - 这是一个复杂的业务系统,包含大学、院系、教授、学生、课程等多个实体。大学包含多个院系(聚合),院系雇佣多个教授(聚合),教授属于某个院系(关联),教授教授多门课程(关联),学生选修多门课程(关联),课程有多个学生(关联)。这个系统展示了多种关系类型的综合应用。
TypeScript 定义:
class University {
public name: string;
public departments: Department[] = [];
public students: Student[] = [];
constructor(name: string) {
this.name = name;
}
public addDepartment(department: Department): void {
this.departments.push(department);
}
public enrollStudent(student: Student): void {
this.students.push(student);
}
}
class Department {
public name: string;
public professors: Professor[] = [];
public courses: Course[] = [];
constructor(name: string) {
this.name = name;
}
public addProfessor(professor: Professor): void {
this.professors.push(professor);
}
public addCourse(course: Course): void {
this.courses.push(course);
}
}
class Professor {
public name: string;
public department?: Department;
public courses: Course[] = [];
constructor(name: string) {
this.name = name;
}
public teachCourse(course: Course): void {
this.courses.push(course);
}
}
class Student {
public name: string;
public courses: Course[] = [];
constructor(name: string) {
this.name = name;
}
public enrollCourse(course: Course): void {
this.courses.push(course);
}
}
class Course {
public name: string;
public professor?: Professor;
public students: Student[] = [];
constructor(name: string) {
this.name = name;
}
}
对应的 UML 类图:
Mermaid 语法:
classDiagram
class University {
name: string
departments: Department[]
students: Student[]
addDepartment(department: Department) void
enrollStudent(student: Student) void
}
class Department {
name: string
professors: Professor[]
courses: Course[]
addProfessor(professor: Professor) void
addCourse(course: Course) void
}
class Professor {
name: string
department?: Department
courses: Course[]
teachCourse(course: Course) void
}
class Student {
name: string
courses: Course[]
enrollCourse(course: Course) void
}
class Course {
name: string
professor?: Professor
students: Student[]
}
University o-- Department : contains
University o-- Student : enrolls
Department o-- Professor : employs
Department o-- Course : offers
Professor --> Department : belongs to
Professor --> Course : teaches
Student --> Course : enrolls in
Course --> Professor : taught by
Course --> Student : has students
语法要点总结
访问修饰符
+
表示 public(公开)-
表示 private(私有)#
表示 protected(受保护)
关系符号
<|--
继承关系(extends):子类继承父类<|..
实现关系(implements):类实现接口-->
关联关系:类之间的引用关系*--
组合关系:强依赖,整体与部分不可分离o--
聚合关系:弱依赖,整体与部分可以分离..>
依赖关系:临时使用,方法参数或局部变量
特殊标记
<<interface>>
接口<<abstract>>
抽象类<<enumeration>>
枚举*
抽象方法
类型语法
string
、number
、boolean
基本类型string[]
数组类型T
泛型类型string | number
联合类型string?
可选类型
总结
UML类图是项目代码结构梳理的重要工具,通过使用Mermaid,可以快速绘制出类图,放到markdown中。在如今的AI时代,你完全可以将各节点交给AI去分析,你只需要将分析结果整合到类图中,并进行人工校验即可。如果你在探索一个类似vscode的超大型复杂项目,那么UML类图可以代替你的大脑记忆项目各模块的关系和结构,让你能够腾出大脑去专门分析项目代码,理解项目结构,并进行系统复刻。