00-设计模式系列之---30秒掌握UML类图核心要点

本设计模式系列旨在以循序渐进的方式,帮助读者全面掌握设计模式的核心思想及其实际应用。内容分为四个阶段:

UML类图
从基础入手,讲解 UML 类图的基本概念与用法,包括类间关系(如继承、组合、关联等)。通过实例分析,帮助读者理解如何用 UML 描述系统结构,为后续学习奠定基础。


设计原则
深入解析面向对象设计的七大原则(如单一职责原则、开闭原则等),指导读者编写高内聚、低耦合的代码,并为理解设计模式提供理论支撑。


设计模式
系统讲解常见设计模式,按创建型、结构型和行为型分类,结合 UML 类图与代码示例,分析其应用场景、优缺点及实现方法。


项目实战
通过真实项目案例,展示设计模式的实际应用(如单例管理配置、工厂动态创建对象等)。结合主流框架(如 Spring、MyBatis)分析其原理,帮助读者将理论转化为实践能力。
通过这四个阶段的学习,读者不仅能掌握设计模式的理论知识,还能灵活运用于实际项目中,提升代码质量与开发能力。无论初学者还是开发者,都能从中受益,进一步提高软件开发水平。

我们在阅读开源项目时,总是希望能比较高效的整理清楚项目中的各个类之间的关系,那么有没有相应的工具能高效、简洁的表示清楚类关系呢?UML类图就是一个可以帮我们解决此类问题的工具或者方法。

1. 什么是类图?

  • 定义:UML类图是一种静态结构图,用于描述系统的类、属性、操作(方法)以及类之间的关系。
  • 核心价值:高效梳理代码结构,可视化类之间的交互,提升代码可读性和设计质量。
  • 适用场景:阅读开源项目、系统设计、团队协作沟通。

2. 类图应用场景

  • 开发阶段:设计系统架构,明确类职责。
  • 文档化:为开源项目提供可维护的文档。
  • 逆向工程:通过代码生成类图(如IDEA插件)。
  • 业务建模:用类图描述业务实体关系(如电商系统中的订单-商品)。

3. 类图的核心组成

元素

符号/规则

示例

补充说明

类名

首字母大写

Animal

抽象类名用斜体

接口

<<interface>> + 接口名

<<Flyable>>

无属性,仅抽象方法

属性

可见性 名称: 类型 = 默认值

-name: String = "Unknown"

成员变量

操作(方法)

可见性 名称(参数:类型): 返回类型

+fly(speed: int): void

代表类提供的服务

可见性

+ (public) - (private) # (protected) ~ (package)

#age: int

控制访问权限

  • +表示公共属性或操作;
  • -表示私有属性或操作;
  • #表示受保护的属性或操作;
  • 〜表示包属性或操作。

4. 类关系

六种核心关系对比

关系类型

符号

方向

语义

代码体现

生命周期

继承

◁━ 实线 + 空心三角

子类 → 父类

is-a(泛化)

class Duck extends Bird

独立

实现

╌╌▷ 虚线 + 空心三角

实现类 → 接口

实现契约

class Plane implements Flyable

独立

关联

──> 实线箭头

持有类 → 被关联类

长期引用关系

成员变量 private Address address;

独立

聚合

◇━━ 实线 + 空心菱形

部分类 ← 整体类

has-a(弱拥有)

class Team { List<Member> members; }

部分可独立存在

组合

◆━━ 实线 + 实心菱形

部分类 ← 整体类

contains-a(强拥有)

class Car { Engine engine; }

部分随整体销毁

依赖

╌╌> 虚线箭头

使用类 → 被依赖类

临时使用

局部变量/参数/返回值

临时

关键区别

  • 聚合 vs 组合
    • 聚合:部分可独立存在(如教室学生,学生可离开教室)。
    • 组合:部分与整体共存亡(如公司部门,公司倒闭则部门消失)。
  • 关联 vs 依赖
    • 关联:长期持有对象引用(如用户拥有地址)。
    • 依赖:临时使用(如订单调用支付工具的方法)。

4.1. 继承(或泛化)

  • 表示一般与特殊的关系,是父类与子类之间的关系,是一种继承关系,是 is-a 的关系;
  • 继承关系采用空心三角形+实线来表示, 由派生类指向基类。

4.2. 实现

  • 是接口与实现类之间的关系。类实现了接口,类中的操作实现了接口中所声明的所有的抽象操作;
  • 实现接口采用空心三角形+虚线来表示,由类指向接口。

4.3. 关联

  • 是对象之间的一种引用关系,用于表示一类对象与另一类对象之间的联系;
  • 两个对等类之间的结构链接;
  • 关联关系采用实线箭头表示,箭头从使用类指向被关联的类。

4.4. 聚合

  • 表示一种弱的“拥有”关系,是整体和部分之间的关系,是 has-a 的关系;
  • 聚合关系是通过成员对象来实现的,其中成员对象是整体对象的一部分,但是成员对象可以脱离整体对象而独立存在;
  • 聚合关系采用空心菱形+实线表示,菱形端为整体对象。

4.5. 复合(或组合)

  • 表示一种强的“拥有”关系,体现了严格的部分和整体的关系,是contain-a的关系;
  • 整体对象和部分对象的声明周期一样,一旦整体对象不存在部分对象也将不存在,部分对象不能脱离整体对象而存在;
  • 复合关系采用实心菱形+实线表示,菱形端为整体对象。

4.6. 依赖

这种关系通常表现为局部变量方法返回值,方法的参数或者对某个方法的直接调用

  • 表示一种使用关系,是临时性的关联;
  • 依赖关系采用虚线箭头表示,箭头从使用类指向被依赖的类。

在 Java 类图中,依赖关系是一种比较常见的关系类型,表示一个类(或接口)使用了另一个类(或接口)的服务或功能,但并不持有对方的引用。下面列举了一些常见的依赖关系:

  1. 参数依赖

一个类的方法签名中包含另一个类的对象作为参数,表示这个类依赖于另一个类的实例。

public class ClassA {
    public void method(ClassB b) {
        // 使用 ClassB 的实例
    }
}
  1. 局部变量依赖

一个类中的方法内部定义了另一个类的对象作为局部变量,表示这个类依赖于另一个类的实例。

public class ClassA {
    public void method() {
        ClassB b = new ClassB();
        // 使用局部变量 b
    }
}
  1. 返回值依赖

一个类的方法返回了另一个类的对象,表示这个类依赖于另一个类的实例。

public class ClassA {
    public ClassB createObject() {
        return new ClassB();
    }
}

依赖关系是一种松耦合的关系,表示一个类对另一个类的使用,但并不是强关联,两者可以相互独立存在。

4.7. 类关系综合

5. 常见误区澄清

  • 箭头方向混淆:继承箭头指向父类,依赖箭头指向被依赖类
  • 组合误用:当部分可独立存在时,应用聚合而非组合。
  • 忽略可见性private属性不对外暴露,避免外部直接访问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值