UML 2.5 类图 6 种关系辨析:从代码反推 3 个实战案例 📅 2026/7/13 8:49:55 UML 2.5 类图 6 种关系辨析从代码反推 3 个实战案例在软件开发中类图是描述系统静态结构的重要工具。对于初学者来说理解类图中各种关系的区别往往是一个挑战。本文将采用代码反推的视角通过三个实战案例深入解析UML类图中六种核心关系的语义差异和代码表现。1. 类图关系基础六种核心关系解析类图中六种核心关系包括泛化、实现、关联、聚合、组合和依赖。这些关系在代码中有不同的表现形式理解它们的差异对设计良好的软件架构至关重要。1.1 泛化关系Generalization泛化关系表示类与类之间的继承关系是最容易理解的一种关系。在Java中它通过extends关键字实现// 父类 class Vehicle { void move() { System.out.println(Vehicle is moving); } } // 子类继承父类 class Car extends Vehicle { Override void move() { System.out.println(Car is driving); } }关键特征空心三角形箭头指向父类子类继承父类的属性和方法可以实现多态1.2 实现关系Realization实现关系表示类与接口之间的关系在Java中通过implements关键字实现// 接口定义 interface Drivable { void drive(); } // 类实现接口 class Sedan implements Drivable { Override public void drive() { System.out.println(Sedan is being driven); } }关键特征空心三角形虚线箭头指向接口类必须实现接口中定义的所有方法支持多接口实现1.3 关联关系Association关联关系表示类之间的长期、稳定的连接通常表现为成员变量class Teacher { private ListStudent students; public void addStudent(Student s) { students.add(s); } } class Student { private Teacher advisor; public void setAdvisor(Teacher t) { this.advisor t; } }关键特征普通实线箭头指向被关联方可以是单向或双向关联强度中等生命周期独立2. 整体-部分关系聚合与组合辨析聚合和组合都是特殊的关联关系表示整体与部分的关系但它们在生命周期管理上有重要区别。2.1 聚合关系Aggregation聚合表示has-a关系部分可以独立于整体存在class Department { private ListEmployee employees; public void addEmployee(Employee e) { employees.add(e); } public void removeEmployee(Employee e) { employees.remove(e); } } class Employee { // 员工可以独立于部门存在 }关键特征空心菱形箭头指向整体部分可以属于多个整体整体不控制部分的生命周期2.2 组合关系Composition组合是更强的聚合关系部分不能独立于整体存在class Car { private Engine engine; public Car() { this.engine new Engine(); // 引擎随车创建 } } class Engine { // 引擎不能独立于车存在 }关键特征实心菱形箭头指向整体部分只能属于一个整体整体控制部分的生命周期聚合与组合对比表特征聚合关系组合关系生命周期独立依赖整体多重性多对多一对一代码表现通过setter方法注入在构造函数中创建UML表示空心菱形实心菱形3. 依赖关系最弱但最常见依赖关系表示类之间的临时性关系通常表现为方法参数、局部变量或返回值class OrderProcessor { public void process(Order order) { // 使用Order对象 order.calculateTotal(); // 创建临时Logger对象 Logger logger new Logger(); logger.log(Order processed); } }关键特征虚线箭头指向被依赖方临时性关系不保持长期引用最常见的类关系类型4. 实战案例解析从代码到类图4.1 电商订单系统案例代码片段// 抽象基类 abstract class User { private String name; public abstract void login(); } // 具体实现 class Customer extends User { private ListOrder orders; Override public void login() { System.out.println(Customer login); } public void placeOrder(Order order) { orders.add(order); } } class Order { private ListOrderItem items; private Payment payment; public void addItem(Product p, int quantity) { items.add(new OrderItem(p, quantity)); } public void setPayment(Payment p) { this.payment p; } } class OrderItem { private Product product; private int quantity; public OrderItem(Product p, int q) { this.product p; this.quantity q; } }类图分析Customer与User泛化关系继承Customer与Order关联关系Order与OrderItem组合关系Order与Payment关联关系OrderItem与Product关联关系placeOrder方法参数依赖关系4.2 公司组织架构案例代码片段interface IEmployee { void work(); } class Department { private Manager manager; private ListStaff staffs; public Department(Manager m) { this.manager m; this.staffs new ArrayList(); } } class Manager implements IEmployee { public void work() { System.out.println(Managing department); } } class Staff implements IEmployee { private Computer computer; public Staff(Computer c) { this.computer c; } public void work() { computer.use(); } } class Computer { public void use() { System.out.println(Computer is being used); } }类图分析Manager/Staff与IEmployee实现关系Department与Manager组合关系Department与Staff聚合关系Staff与Computer关联关系4.3 车辆租赁系统案例代码片段class RentalSystem { public RentalContract rent(Vehicle v, Customer c, DateRange d) { return new RentalContract(v, c, d); } } abstract class Vehicle { public abstract void start(); } class Car extends Vehicle { private Engine engine; private ListWheel wheels; public Car() { this.engine new Engine(); this.wheels new ArrayList(); for(int i0; i4; i) { wheels.add(new Wheel()); } } Override public void start() { engine.ignite(); } } class RentalContract { private Vehicle vehicle; private Customer customer; private DateRange dateRange; public RentalContract(Vehicle v, Customer c, DateRange d) { this.vehicle v; this.customer c; this.dateRange d; } }类图分析Car与Vehicle泛化关系Car与Engine组合关系Car与Wheel组合关系RentalSystem与Vehicle/Customer依赖关系RentalContract与Vehicle/Customer关联关系5. 关系辨析决策树当不确定该使用哪种关系时可以按照以下决策流程进行判断是否是is-a关系是 → 泛化关系继承是否是接口实现是 → 实现关系是否是has-a关系是 → 进入整体-部分判断部分能否独立存在能 → 聚合关系不能 → 组合关系是否是临时性使用是 → 依赖关系以上都不是 → 关联关系实际应用技巧优先考虑语义而非语法组合关系通常表现为构造函数中创建部件对象聚合关系通常通过setter方法注入部件依赖关系最常见于方法参数和局部变量掌握这些关系的区别和应用场景能够帮助开发者设计出更加清晰、灵活的类结构为构建可维护的软件系统打下坚实基础。