软件设计模式-第一课:基础知识了解
- 背景知识
-
- 面向对象的编程基础
- UML类图基础
-
- 类的表示方法
- 依赖(Dependency)
- 关联(Association)
- 聚合(Aggregation)
- 组合(Composition)
- [继承(Inheritance / Generalization)](#继承(Inheritance / Generalization))
- [实现(Realization / Implementation)](#实现(Realization / Implementation))
- 6种关系对比总表
- 软件设计原则
-
- [SRP 单一职责原则](#SRP 单一职责原则)
- [OCP 开闭原则](#OCP 开闭原则)
- [LSP 里氏替换原则](#LSP 里氏替换原则)
- [ISP 接口隔离原则](#ISP 接口隔离原则)
- [DIP 依赖倒置原则](#DIP 依赖倒置原则)
- [LoD 迪米特法则(最少知识原则)](#LoD 迪米特法则(最少知识原则))
- [CRP 合成复用原则](#CRP 合成复用原则)
- 七条原则对比总表
- 设计模式分类
-
- [创建型(5 种):解决"对象怎么创建"](#创建型(5 种):解决“对象怎么创建”)
- [结构型(7 种):解决"对象怎么组合"](#结构型(7 种):解决“对象怎么组合”)
- [行为型(11 种):解决"对象怎么交互"](#行为型(11 种):解决“对象怎么交互”)
背景知识
面向对象的编程基础
面向对象编程(Object-Oriented Programming,OOP)是一种以"对象"为核心来组织代码的编程范式。它的基础概念主要包括类、接口、继承、多态和封装。
#mermaid-svg-NtNGtFSJIWXYSlxy{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-NtNGtFSJIWXYSlxy .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-NtNGtFSJIWXYSlxy .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-NtNGtFSJIWXYSlxy .error-icon{fill:#552222;}#mermaid-svg-NtNGtFSJIWXYSlxy .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-NtNGtFSJIWXYSlxy .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-NtNGtFSJIWXYSlxy .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-NtNGtFSJIWXYSlxy .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-NtNGtFSJIWXYSlxy .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-NtNGtFSJIWXYSlxy .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-NtNGtFSJIWXYSlxy .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-NtNGtFSJIWXYSlxy .marker{fill:#333333;stroke:#333333;}#mermaid-svg-NtNGtFSJIWXYSlxy .marker.cross{stroke:#333333;}#mermaid-svg-NtNGtFSJIWXYSlxy svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-NtNGtFSJIWXYSlxy p{margin:0;}#mermaid-svg-NtNGtFSJIWXYSlxy .edge{stroke-width:3;}#mermaid-svg-NtNGtFSJIWXYSlxy .section--1 rect,#mermaid-svg-NtNGtFSJIWXYSlxy .section--1 path,#mermaid-svg-NtNGtFSJIWXYSlxy .section--1 circle,#mermaid-svg-NtNGtFSJIWXYSlxy .section--1 polygon,#mermaid-svg-NtNGtFSJIWXYSlxy .section--1 path{fill:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-NtNGtFSJIWXYSlxy .section--1 text{fill:#ffffff;}#mermaid-svg-NtNGtFSJIWXYSlxy .node-icon--1{font-size:40px;color:#ffffff;}#mermaid-svg-NtNGtFSJIWXYSlxy .section-edge--1{stroke:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-NtNGtFSJIWXYSlxy .edge-depth--1{stroke-width:17;}#mermaid-svg-NtNGtFSJIWXYSlxy .section--1 line{stroke:hsl(60, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-NtNGtFSJIWXYSlxy .disabled,#mermaid-svg-NtNGtFSJIWXYSlxy .disabled circle,#mermaid-svg-NtNGtFSJIWXYSlxy .disabled text{fill:lightgray;}#mermaid-svg-NtNGtFSJIWXYSlxy .disabled text{fill:#efefef;}#mermaid-svg-NtNGtFSJIWXYSlxy .section-0 rect,#mermaid-svg-NtNGtFSJIWXYSlxy .section-0 path,#mermaid-svg-NtNGtFSJIWXYSlxy .section-0 circle,#mermaid-svg-NtNGtFSJIWXYSlxy .section-0 polygon,#mermaid-svg-NtNGtFSJIWXYSlxy .section-0 path{fill:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-NtNGtFSJIWXYSlxy .section-0 text{fill:black;}#mermaid-svg-NtNGtFSJIWXYSlxy .node-icon-0{font-size:40px;color:black;}#mermaid-svg-NtNGtFSJIWXYSlxy .section-edge-0{stroke:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-NtNGtFSJIWXYSlxy .edge-depth-0{stroke-width:14;}#mermaid-svg-NtNGtFSJIWXYSlxy .section-0 line{stroke:hsl(240, 100%, 83.5294117647%);stroke-width:3;}#mermaid-svg-NtNGtFSJIWXYSlxy .disabled,#mermaid-svg-NtNGtFSJIWXYSlxy .disabled circle,#mermaid-svg-NtNGtFSJIWXYSlxy .disabled text{fill:lightgray;}#mermaid-svg-NtNGtFSJIWXYSlxy .disabled text{fill:#efefef;}#mermaid-svg-NtNGtFSJIWXYSlxy .section-1 rect,#mermaid-svg-NtNGtFSJIWXYSlxy .section-1 path,#mermaid-svg-NtNGtFSJIWXYSlxy .section-1 circle,#mermaid-svg-NtNGtFSJIWXYSlxy .section-1 polygon,#mermaid-svg-NtNGtFSJIWXYSlxy .section-1 path{fill:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-NtNGtFSJIWXYSlxy .section-1 text{fill:black;}#mermaid-svg-NtNGtFSJIWXYSlxy .node-icon-1{font-size:40px;color:black;}#mermaid-svg-NtNGtFSJIWXYSlxy .section-edge-1{stroke:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-NtNGtFSJIWXYSlxy .edge-depth-1{stroke-width:11;}#mermaid-svg-NtNGtFSJIWXYSlxy .section-1 line{stroke:hsl(260, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-NtNGtFSJIWXYSlxy .disabled,#mermaid-svg-NtNGtFSJIWXYSlxy .disabled circle,#mermaid-svg-NtNGtFSJIWXYSlxy .disabled text{fill:lightgray;}#mermaid-svg-NtNGtFSJIWXYSlxy .disabled text{fill:#efefef;}#mermaid-svg-NtNGtFSJIWXYSlxy .section-2 rect,#mermaid-svg-NtNGtFSJIWXYSlxy .section-2 path,#mermaid-svg-NtNGtFSJIWXYSlxy .section-2 circle,#mermaid-svg-NtNGtFSJIWXYSlxy .section-2 polygon,#mermaid-svg-NtNGtFSJIWXYSlxy .section-2 path{fill:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-NtNGtFSJIWXYSlxy .section-2 text{fill:#ffffff;}#mermaid-svg-NtNGtFSJIWXYSlxy .node-icon-2{font-size:40px;color:#ffffff;}#mermaid-svg-NtNGtFSJIWXYSlxy .section-edge-2{stroke:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-NtNGtFSJIWXYSlxy .edge-depth-2{stroke-width:8;}#mermaid-svg-NtNGtFSJIWXYSlxy .section-2 line{stroke:hsl(90, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-NtNGtFSJIWXYSlxy .disabled,#mermaid-svg-NtNGtFSJIWXYSlxy .disabled circle,#mermaid-svg-NtNGtFSJIWXYSlxy .disabled text{fill:lightgray;}#mermaid-svg-NtNGtFSJIWXYSlxy .disabled text{fill:#efefef;}#mermaid-svg-NtNGtFSJIWXYSlxy .section-3 rect,#mermaid-svg-NtNGtFSJIWXYSlxy .section-3 path,#mermaid-svg-NtNGtFSJIWXYSlxy .section-3 circle,#mermaid-svg-NtNGtFSJIWXYSlxy .section-3 polygon,#mermaid-svg-NtNGtFSJIWXYSlxy .section-3 path{fill:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-NtNGtFSJIWXYSlxy .section-3 text{fill:black;}#mermaid-svg-NtNGtFSJIWXYSlxy .node-icon-3{font-size:40px;color:black;}#mermaid-svg-NtNGtFSJIWXYSlxy .section-edge-3{stroke:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-NtNGtFSJIWXYSlxy .edge-depth-3{stroke-width:5;}#mermaid-svg-NtNGtFSJIWXYSlxy .section-3 line{stroke:hsl(120, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-NtNGtFSJIWXYSlxy .disabled,#mermaid-svg-NtNGtFSJIWXYSlxy .disabled circle,#mermaid-svg-NtNGtFSJIWXYSlxy .disabled text{fill:lightgray;}#mermaid-svg-NtNGtFSJIWXYSlxy .disabled text{fill:#efefef;}#mermaid-svg-NtNGtFSJIWXYSlxy .section-4 rect,#mermaid-svg-NtNGtFSJIWXYSlxy .section-4 path,#mermaid-svg-NtNGtFSJIWXYSlxy .section-4 circle,#mermaid-svg-NtNGtFSJIWXYSlxy .section-4 polygon,#mermaid-svg-NtNGtFSJIWXYSlxy .section-4 path{fill:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-NtNGtFSJIWXYSlxy .section-4 text{fill:black;}#mermaid-svg-NtNGtFSJIWXYSlxy .node-icon-4{font-size:40px;color:black;}#mermaid-svg-NtNGtFSJIWXYSlxy .section-edge-4{stroke:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-NtNGtFSJIWXYSlxy .edge-depth-4{stroke-width:2;}#mermaid-svg-NtNGtFSJIWXYSlxy .section-4 line{stroke:hsl(150, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-NtNGtFSJIWXYSlxy .disabled,#mermaid-svg-NtNGtFSJIWXYSlxy .disabled circle,#mermaid-svg-NtNGtFSJIWXYSlxy .disabled text{fill:lightgray;}#mermaid-svg-NtNGtFSJIWXYSlxy .disabled text{fill:#efefef;}#mermaid-svg-NtNGtFSJIWXYSlxy .section-5 rect,#mermaid-svg-NtNGtFSJIWXYSlxy .section-5 path,#mermaid-svg-NtNGtFSJIWXYSlxy .section-5 circle,#mermaid-svg-NtNGtFSJIWXYSlxy .section-5 polygon,#mermaid-svg-NtNGtFSJIWXYSlxy .section-5 path{fill:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-NtNGtFSJIWXYSlxy .section-5 text{fill:black;}#mermaid-svg-NtNGtFSJIWXYSlxy .node-icon-5{font-size:40px;color:black;}#mermaid-svg-NtNGtFSJIWXYSlxy .section-edge-5{stroke:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-NtNGtFSJIWXYSlxy .edge-depth-5{stroke-width:-1;}#mermaid-svg-NtNGtFSJIWXYSlxy .section-5 line{stroke:hsl(180, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-NtNGtFSJIWXYSlxy .disabled,#mermaid-svg-NtNGtFSJIWXYSlxy .disabled circle,#mermaid-svg-NtNGtFSJIWXYSlxy .disabled text{fill:lightgray;}#mermaid-svg-NtNGtFSJIWXYSlxy .disabled text{fill:#efefef;}#mermaid-svg-NtNGtFSJIWXYSlxy .section-6 rect,#mermaid-svg-NtNGtFSJIWXYSlxy .section-6 path,#mermaid-svg-NtNGtFSJIWXYSlxy .section-6 circle,#mermaid-svg-NtNGtFSJIWXYSlxy .section-6 polygon,#mermaid-svg-NtNGtFSJIWXYSlxy .section-6 path{fill:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-NtNGtFSJIWXYSlxy .section-6 text{fill:black;}#mermaid-svg-NtNGtFSJIWXYSlxy .node-icon-6{font-size:40px;color:black;}#mermaid-svg-NtNGtFSJIWXYSlxy .section-edge-6{stroke:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-NtNGtFSJIWXYSlxy .edge-depth-6{stroke-width:-4;}#mermaid-svg-NtNGtFSJIWXYSlxy .section-6 line{stroke:hsl(210, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-NtNGtFSJIWXYSlxy .disabled,#mermaid-svg-NtNGtFSJIWXYSlxy .disabled circle,#mermaid-svg-NtNGtFSJIWXYSlxy .disabled text{fill:lightgray;}#mermaid-svg-NtNGtFSJIWXYSlxy .disabled text{fill:#efefef;}#mermaid-svg-NtNGtFSJIWXYSlxy .section-7 rect,#mermaid-svg-NtNGtFSJIWXYSlxy .section-7 path,#mermaid-svg-NtNGtFSJIWXYSlxy .section-7 circle,#mermaid-svg-NtNGtFSJIWXYSlxy .section-7 polygon,#mermaid-svg-NtNGtFSJIWXYSlxy .section-7 path{fill:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-NtNGtFSJIWXYSlxy .section-7 text{fill:black;}#mermaid-svg-NtNGtFSJIWXYSlxy .node-icon-7{font-size:40px;color:black;}#mermaid-svg-NtNGtFSJIWXYSlxy .section-edge-7{stroke:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-NtNGtFSJIWXYSlxy .edge-depth-7{stroke-width:-7;}#mermaid-svg-NtNGtFSJIWXYSlxy .section-7 line{stroke:hsl(270, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-NtNGtFSJIWXYSlxy .disabled,#mermaid-svg-NtNGtFSJIWXYSlxy .disabled circle,#mermaid-svg-NtNGtFSJIWXYSlxy .disabled text{fill:lightgray;}#mermaid-svg-NtNGtFSJIWXYSlxy .disabled text{fill:#efefef;}#mermaid-svg-NtNGtFSJIWXYSlxy .section-8 rect,#mermaid-svg-NtNGtFSJIWXYSlxy .section-8 path,#mermaid-svg-NtNGtFSJIWXYSlxy .section-8 circle,#mermaid-svg-NtNGtFSJIWXYSlxy .section-8 polygon,#mermaid-svg-NtNGtFSJIWXYSlxy .section-8 path{fill:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-NtNGtFSJIWXYSlxy .section-8 text{fill:black;}#mermaid-svg-NtNGtFSJIWXYSlxy .node-icon-8{font-size:40px;color:black;}#mermaid-svg-NtNGtFSJIWXYSlxy .section-edge-8{stroke:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-NtNGtFSJIWXYSlxy .edge-depth-8{stroke-width:-10;}#mermaid-svg-NtNGtFSJIWXYSlxy .section-8 line{stroke:hsl(330, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-NtNGtFSJIWXYSlxy .disabled,#mermaid-svg-NtNGtFSJIWXYSlxy .disabled circle,#mermaid-svg-NtNGtFSJIWXYSlxy .disabled text{fill:lightgray;}#mermaid-svg-NtNGtFSJIWXYSlxy .disabled text{fill:#efefef;}#mermaid-svg-NtNGtFSJIWXYSlxy .section-9 rect,#mermaid-svg-NtNGtFSJIWXYSlxy .section-9 path,#mermaid-svg-NtNGtFSJIWXYSlxy .section-9 circle,#mermaid-svg-NtNGtFSJIWXYSlxy .section-9 polygon,#mermaid-svg-NtNGtFSJIWXYSlxy .section-9 path{fill:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-NtNGtFSJIWXYSlxy .section-9 text{fill:black;}#mermaid-svg-NtNGtFSJIWXYSlxy .node-icon-9{font-size:40px;color:black;}#mermaid-svg-NtNGtFSJIWXYSlxy .section-edge-9{stroke:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-NtNGtFSJIWXYSlxy .edge-depth-9{stroke-width:-13;}#mermaid-svg-NtNGtFSJIWXYSlxy .section-9 line{stroke:hsl(0, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-NtNGtFSJIWXYSlxy .disabled,#mermaid-svg-NtNGtFSJIWXYSlxy .disabled circle,#mermaid-svg-NtNGtFSJIWXYSlxy .disabled text{fill:lightgray;}#mermaid-svg-NtNGtFSJIWXYSlxy .disabled text{fill:#efefef;}#mermaid-svg-NtNGtFSJIWXYSlxy .section-10 rect,#mermaid-svg-NtNGtFSJIWXYSlxy .section-10 path,#mermaid-svg-NtNGtFSJIWXYSlxy .section-10 circle,#mermaid-svg-NtNGtFSJIWXYSlxy .section-10 polygon,#mermaid-svg-NtNGtFSJIWXYSlxy .section-10 path{fill:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-NtNGtFSJIWXYSlxy .section-10 text{fill:black;}#mermaid-svg-NtNGtFSJIWXYSlxy .node-icon-10{font-size:40px;color:black;}#mermaid-svg-NtNGtFSJIWXYSlxy .section-edge-10{stroke:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-NtNGtFSJIWXYSlxy .edge-depth-10{stroke-width:-16;}#mermaid-svg-NtNGtFSJIWXYSlxy .section-10 line{stroke:hsl(30, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-NtNGtFSJIWXYSlxy .disabled,#mermaid-svg-NtNGtFSJIWXYSlxy .disabled circle,#mermaid-svg-NtNGtFSJIWXYSlxy .disabled text{fill:lightgray;}#mermaid-svg-NtNGtFSJIWXYSlxy .disabled text{fill:#efefef;}#mermaid-svg-NtNGtFSJIWXYSlxy .section-root rect,#mermaid-svg-NtNGtFSJIWXYSlxy .section-root path,#mermaid-svg-NtNGtFSJIWXYSlxy .section-root circle,#mermaid-svg-NtNGtFSJIWXYSlxy .section-root polygon{fill:hsl(240, 100%, 46.2745098039%);}#mermaid-svg-NtNGtFSJIWXYSlxy .section-root text{fill:#ffffff;}#mermaid-svg-NtNGtFSJIWXYSlxy .section-root span{color:#ffffff;}#mermaid-svg-NtNGtFSJIWXYSlxy .section-2 span{color:#ffffff;}#mermaid-svg-NtNGtFSJIWXYSlxy .icon-container{height:100%;display:flex;justify-content:center;align-items:center;}#mermaid-svg-NtNGtFSJIWXYSlxy .edge{fill:none;}#mermaid-svg-NtNGtFSJIWXYSlxy .mindmap-node-label{dy:1em;alignment-baseline:middle;text-anchor:middle;dominant-baseline:middle;text-align:center;}#mermaid-svg-NtNGtFSJIWXYSlxy :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} C++ 面向对象
四大支柱
封装
private 藏数据
public 露接口
继承
public 继承 is-a
虚继承解决菱形
多态
静态: 重载/模板
动态: virtual 虚函数
抽象
纯虚函数 = 0
抽象类
两个关键机制
虚函数
virtual / override
vtable 动态绑定
虚析构
生命周期
构造/析构
RAII
类与对象(Class)
类是对象的模板或蓝图,用来描述一类事物共有的属性(数据)和行为(方法)。例如,"学生"这个类可以有姓名、学号等属性,以及选课、考试等行为。对象则是类的一个具体实例。类把数据和操作数据的方法组织在一起,是 OOP 的基本单位。
#mermaid-svg-3s8aGpzwRqRtbjD9{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-3s8aGpzwRqRtbjD9 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-3s8aGpzwRqRtbjD9 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-3s8aGpzwRqRtbjD9 .error-icon{fill:#552222;}#mermaid-svg-3s8aGpzwRqRtbjD9 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-3s8aGpzwRqRtbjD9 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-3s8aGpzwRqRtbjD9 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-3s8aGpzwRqRtbjD9 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-3s8aGpzwRqRtbjD9 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-3s8aGpzwRqRtbjD9 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-3s8aGpzwRqRtbjD9 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-3s8aGpzwRqRtbjD9 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-3s8aGpzwRqRtbjD9 .marker.cross{stroke:#333333;}#mermaid-svg-3s8aGpzwRqRtbjD9 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-3s8aGpzwRqRtbjD9 p{margin:0;}#mermaid-svg-3s8aGpzwRqRtbjD9 g.classGroup text{fill:#9370DB;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-3s8aGpzwRqRtbjD9 g.classGroup text .title{font-weight:bolder;}#mermaid-svg-3s8aGpzwRqRtbjD9 .cluster-label text{fill:#333;}#mermaid-svg-3s8aGpzwRqRtbjD9 .cluster-label span{color:#333;}#mermaid-svg-3s8aGpzwRqRtbjD9 .cluster-label span p{background-color:transparent;}#mermaid-svg-3s8aGpzwRqRtbjD9 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-3s8aGpzwRqRtbjD9 .cluster text{fill:#333;}#mermaid-svg-3s8aGpzwRqRtbjD9 .cluster span{color:#333;}#mermaid-svg-3s8aGpzwRqRtbjD9 .nodeLabel,#mermaid-svg-3s8aGpzwRqRtbjD9 .edgeLabel{color:#131300;}#mermaid-svg-3s8aGpzwRqRtbjD9 .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-3s8aGpzwRqRtbjD9 .label text{fill:#131300;}#mermaid-svg-3s8aGpzwRqRtbjD9 .labelBkg{background:#ECECFF;}#mermaid-svg-3s8aGpzwRqRtbjD9 .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-3s8aGpzwRqRtbjD9 .classTitle{font-weight:bolder;}#mermaid-svg-3s8aGpzwRqRtbjD9 .node rect,#mermaid-svg-3s8aGpzwRqRtbjD9 .node circle,#mermaid-svg-3s8aGpzwRqRtbjD9 .node ellipse,#mermaid-svg-3s8aGpzwRqRtbjD9 .node polygon,#mermaid-svg-3s8aGpzwRqRtbjD9 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-3s8aGpzwRqRtbjD9 .divider{stroke:#9370DB;stroke-width:1;}#mermaid-svg-3s8aGpzwRqRtbjD9 g.clickable{cursor:pointer;}#mermaid-svg-3s8aGpzwRqRtbjD9 g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-3s8aGpzwRqRtbjD9 g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-3s8aGpzwRqRtbjD9 .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-3s8aGpzwRqRtbjD9 .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-3s8aGpzwRqRtbjD9 .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-3s8aGpzwRqRtbjD9 .dashed-line{stroke-dasharray:3;}#mermaid-svg-3s8aGpzwRqRtbjD9 .dotted-line{stroke-dasharray:1 2;}#mermaid-svg-3s8aGpzwRqRtbjD9 #compositionStart,#mermaid-svg-3s8aGpzwRqRtbjD9 .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-3s8aGpzwRqRtbjD9 #compositionEnd,#mermaid-svg-3s8aGpzwRqRtbjD9 .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-3s8aGpzwRqRtbjD9 #dependencyStart,#mermaid-svg-3s8aGpzwRqRtbjD9 .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-3s8aGpzwRqRtbjD9 #dependencyStart,#mermaid-svg-3s8aGpzwRqRtbjD9 .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-3s8aGpzwRqRtbjD9 #extensionStart,#mermaid-svg-3s8aGpzwRqRtbjD9 .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-3s8aGpzwRqRtbjD9 #extensionEnd,#mermaid-svg-3s8aGpzwRqRtbjD9 .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-3s8aGpzwRqRtbjD9 #aggregationStart,#mermaid-svg-3s8aGpzwRqRtbjD9 .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-3s8aGpzwRqRtbjD9 #aggregationEnd,#mermaid-svg-3s8aGpzwRqRtbjD9 .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-3s8aGpzwRqRtbjD9 #lollipopStart,#mermaid-svg-3s8aGpzwRqRtbjD9 .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-3s8aGpzwRqRtbjD9 #lollipopEnd,#mermaid-svg-3s8aGpzwRqRtbjD9 .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-3s8aGpzwRqRtbjD9 .edgeTerminals{font-size:11px;line-height:initial;}#mermaid-svg-3s8aGpzwRqRtbjD9 .classTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-3s8aGpzwRqRtbjD9 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-3s8aGpzwRqRtbjD9 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-3s8aGpzwRqRtbjD9 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 实例化
实例化
Student
-string name
-string id
+Student(name, id)
+selectCourse()
+takeExam()
+getName() : string
zhangsan
+selectCourse()
+takeExam()
lisi
+selectCourse()
+takeExam()
C++对应的代码如下:
cpp
#include <iostream>
#include <string>
class Student {
private:
std::string name;
std::string id;
public:
Student(std::string name, std::string id) : name(name), id(id) {}
void selectCourse() {
std::cout << name << " 选课" << std::endl;
}
void takeExam() {
std::cout << name << " 考试" << std::endl;
}
std::string getName() {
return name;
}
};
int main() {
Student zhangsan("张三", "001");
Student lisi("李四", "002");
zhangsan.selectCourse();
lisi.takeExam();
return 0;
}
封装(Encapsulation)
封装指把数据和对数据的操作包装在类内部,并对外隐藏实现细节,只暴露必要的接口。通常通过访问修饰符(如 private、public)控制外部能否直接访问属性。封装的好处是降低耦合、提高安全性和可维护性。例如,把余额设为私有,只通过存款、取款方法修改,并且可以在方法内做校验。
#mermaid-svg-Ek9aIyDC21PiEne7{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Ek9aIyDC21PiEne7 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Ek9aIyDC21PiEne7 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Ek9aIyDC21PiEne7 .error-icon{fill:#552222;}#mermaid-svg-Ek9aIyDC21PiEne7 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Ek9aIyDC21PiEne7 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Ek9aIyDC21PiEne7 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Ek9aIyDC21PiEne7 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Ek9aIyDC21PiEne7 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Ek9aIyDC21PiEne7 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Ek9aIyDC21PiEne7 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Ek9aIyDC21PiEne7 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Ek9aIyDC21PiEne7 .marker.cross{stroke:#333333;}#mermaid-svg-Ek9aIyDC21PiEne7 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Ek9aIyDC21PiEne7 p{margin:0;}#mermaid-svg-Ek9aIyDC21PiEne7 g.classGroup text{fill:#9370DB;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-Ek9aIyDC21PiEne7 g.classGroup text .title{font-weight:bolder;}#mermaid-svg-Ek9aIyDC21PiEne7 .cluster-label text{fill:#333;}#mermaid-svg-Ek9aIyDC21PiEne7 .cluster-label span{color:#333;}#mermaid-svg-Ek9aIyDC21PiEne7 .cluster-label span p{background-color:transparent;}#mermaid-svg-Ek9aIyDC21PiEne7 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Ek9aIyDC21PiEne7 .cluster text{fill:#333;}#mermaid-svg-Ek9aIyDC21PiEne7 .cluster span{color:#333;}#mermaid-svg-Ek9aIyDC21PiEne7 .nodeLabel,#mermaid-svg-Ek9aIyDC21PiEne7 .edgeLabel{color:#131300;}#mermaid-svg-Ek9aIyDC21PiEne7 .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-Ek9aIyDC21PiEne7 .label text{fill:#131300;}#mermaid-svg-Ek9aIyDC21PiEne7 .labelBkg{background:#ECECFF;}#mermaid-svg-Ek9aIyDC21PiEne7 .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-Ek9aIyDC21PiEne7 .classTitle{font-weight:bolder;}#mermaid-svg-Ek9aIyDC21PiEne7 .node rect,#mermaid-svg-Ek9aIyDC21PiEne7 .node circle,#mermaid-svg-Ek9aIyDC21PiEne7 .node ellipse,#mermaid-svg-Ek9aIyDC21PiEne7 .node polygon,#mermaid-svg-Ek9aIyDC21PiEne7 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Ek9aIyDC21PiEne7 .divider{stroke:#9370DB;stroke-width:1;}#mermaid-svg-Ek9aIyDC21PiEne7 g.clickable{cursor:pointer;}#mermaid-svg-Ek9aIyDC21PiEne7 g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-Ek9aIyDC21PiEne7 g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-Ek9aIyDC21PiEne7 .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-Ek9aIyDC21PiEne7 .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-Ek9aIyDC21PiEne7 .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-Ek9aIyDC21PiEne7 .dashed-line{stroke-dasharray:3;}#mermaid-svg-Ek9aIyDC21PiEne7 .dotted-line{stroke-dasharray:1 2;}#mermaid-svg-Ek9aIyDC21PiEne7 #compositionStart,#mermaid-svg-Ek9aIyDC21PiEne7 .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-Ek9aIyDC21PiEne7 #compositionEnd,#mermaid-svg-Ek9aIyDC21PiEne7 .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-Ek9aIyDC21PiEne7 #dependencyStart,#mermaid-svg-Ek9aIyDC21PiEne7 .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-Ek9aIyDC21PiEne7 #dependencyStart,#mermaid-svg-Ek9aIyDC21PiEne7 .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-Ek9aIyDC21PiEne7 #extensionStart,#mermaid-svg-Ek9aIyDC21PiEne7 .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-Ek9aIyDC21PiEne7 #extensionEnd,#mermaid-svg-Ek9aIyDC21PiEne7 .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-Ek9aIyDC21PiEne7 #aggregationStart,#mermaid-svg-Ek9aIyDC21PiEne7 .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-Ek9aIyDC21PiEne7 #aggregationEnd,#mermaid-svg-Ek9aIyDC21PiEne7 .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-Ek9aIyDC21PiEne7 #lollipopStart,#mermaid-svg-Ek9aIyDC21PiEne7 .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-Ek9aIyDC21PiEne7 #lollipopEnd,#mermaid-svg-Ek9aIyDC21PiEne7 .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-Ek9aIyDC21PiEne7 .edgeTerminals{font-size:11px;line-height:initial;}#mermaid-svg-Ek9aIyDC21PiEne7 .classTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Ek9aIyDC21PiEne7 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Ek9aIyDC21PiEne7 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Ek9aIyDC21PiEne7 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} BankAccount
-double balance
+deposit(amount)
+withdraw(amount)
+getBalance() : double
balance 私有,只能通过 deposit、withdraw 修改,方法内可做校验。C++对应的代码如下:
cpp
class BankAccount {
private:
double balance; // 私有,外部不可直接访问
public:
void deposit(double amount) {
if (amount > 0) balance += amount;
}
void withdraw(double amount) {
if (amount > 0 && amount <= balance) balance -= amount;
}
double getBalance() const { return balance; }
};
继承(Inheritance)
继承允许一个类(子类)复用另一个类(父类)的属性和方法,并可以扩展或修改它们。继承体现"is-a"关系,比如"猫"是一种"动物"。继承提高了代码复用性,也便于建立层次化的类型体系。但过度使用继承会导致耦合过强,因此常建议优先组合而非继承。
#mermaid-svg-zIRsP9qd38oyNF9l{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-zIRsP9qd38oyNF9l .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-zIRsP9qd38oyNF9l .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-zIRsP9qd38oyNF9l .error-icon{fill:#552222;}#mermaid-svg-zIRsP9qd38oyNF9l .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-zIRsP9qd38oyNF9l .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-zIRsP9qd38oyNF9l .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-zIRsP9qd38oyNF9l .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-zIRsP9qd38oyNF9l .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-zIRsP9qd38oyNF9l .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-zIRsP9qd38oyNF9l .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-zIRsP9qd38oyNF9l .marker{fill:#333333;stroke:#333333;}#mermaid-svg-zIRsP9qd38oyNF9l .marker.cross{stroke:#333333;}#mermaid-svg-zIRsP9qd38oyNF9l svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-zIRsP9qd38oyNF9l p{margin:0;}#mermaid-svg-zIRsP9qd38oyNF9l g.classGroup text{fill:#9370DB;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-zIRsP9qd38oyNF9l g.classGroup text .title{font-weight:bolder;}#mermaid-svg-zIRsP9qd38oyNF9l .cluster-label text{fill:#333;}#mermaid-svg-zIRsP9qd38oyNF9l .cluster-label span{color:#333;}#mermaid-svg-zIRsP9qd38oyNF9l .cluster-label span p{background-color:transparent;}#mermaid-svg-zIRsP9qd38oyNF9l .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-zIRsP9qd38oyNF9l .cluster text{fill:#333;}#mermaid-svg-zIRsP9qd38oyNF9l .cluster span{color:#333;}#mermaid-svg-zIRsP9qd38oyNF9l .nodeLabel,#mermaid-svg-zIRsP9qd38oyNF9l .edgeLabel{color:#131300;}#mermaid-svg-zIRsP9qd38oyNF9l .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-zIRsP9qd38oyNF9l .label text{fill:#131300;}#mermaid-svg-zIRsP9qd38oyNF9l .labelBkg{background:#ECECFF;}#mermaid-svg-zIRsP9qd38oyNF9l .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-zIRsP9qd38oyNF9l .classTitle{font-weight:bolder;}#mermaid-svg-zIRsP9qd38oyNF9l .node rect,#mermaid-svg-zIRsP9qd38oyNF9l .node circle,#mermaid-svg-zIRsP9qd38oyNF9l .node ellipse,#mermaid-svg-zIRsP9qd38oyNF9l .node polygon,#mermaid-svg-zIRsP9qd38oyNF9l .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-zIRsP9qd38oyNF9l .divider{stroke:#9370DB;stroke-width:1;}#mermaid-svg-zIRsP9qd38oyNF9l g.clickable{cursor:pointer;}#mermaid-svg-zIRsP9qd38oyNF9l g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-zIRsP9qd38oyNF9l g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-zIRsP9qd38oyNF9l .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-zIRsP9qd38oyNF9l .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-zIRsP9qd38oyNF9l .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-zIRsP9qd38oyNF9l .dashed-line{stroke-dasharray:3;}#mermaid-svg-zIRsP9qd38oyNF9l .dotted-line{stroke-dasharray:1 2;}#mermaid-svg-zIRsP9qd38oyNF9l #compositionStart,#mermaid-svg-zIRsP9qd38oyNF9l .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-zIRsP9qd38oyNF9l #compositionEnd,#mermaid-svg-zIRsP9qd38oyNF9l .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-zIRsP9qd38oyNF9l #dependencyStart,#mermaid-svg-zIRsP9qd38oyNF9l .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-zIRsP9qd38oyNF9l #dependencyStart,#mermaid-svg-zIRsP9qd38oyNF9l .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-zIRsP9qd38oyNF9l #extensionStart,#mermaid-svg-zIRsP9qd38oyNF9l .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-zIRsP9qd38oyNF9l #extensionEnd,#mermaid-svg-zIRsP9qd38oyNF9l .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-zIRsP9qd38oyNF9l #aggregationStart,#mermaid-svg-zIRsP9qd38oyNF9l .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-zIRsP9qd38oyNF9l #aggregationEnd,#mermaid-svg-zIRsP9qd38oyNF9l .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-zIRsP9qd38oyNF9l #lollipopStart,#mermaid-svg-zIRsP9qd38oyNF9l .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-zIRsP9qd38oyNF9l #lollipopEnd,#mermaid-svg-zIRsP9qd38oyNF9l .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-zIRsP9qd38oyNF9l .edgeTerminals{font-size:11px;line-height:initial;}#mermaid-svg-zIRsP9qd38oyNF9l .classTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-zIRsP9qd38oyNF9l .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-zIRsP9qd38oyNF9l .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-zIRsP9qd38oyNF9l :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} public
public
Animal
#string name
+virtual speak()
+getName() : string
Dog
+speak()
+wagTail()
Cat
+speak()
+catchMouse()
cpp
class Animal {
protected:
std::string name;
public:
Animal(std::string n) : name(n) {}
virtual void speak() { std::cout << "..." << std::endl; }
virtual ~Animal() = default;
};
class Dog : public Animal {
public:
Dog(std::string n) : Animal(n) {}
void speak() override { std::cout << "汪汪" << std::endl; }
void wagTail() {}
};
class Cat : public Animal {
public:
Cat(std::string n) : Animal(n) {}
void speak() override { std::cout << "喵喵" << std::endl; }
void catchMouse() {}
};
多态(Polymorphism)
多态指同一操作作用于不同对象时,可以产生不同的行为。常见形式是父类引用指向子类对象,调用被重写的方法时,实际执行的是子类的实现。例如,动物类有"叫"的方法,狗和猫分别重写后,用动物类型调用时会发出不同声音。多态提高了程序的灵活性和可扩展性。
#mermaid-svg-NWxbDkKcTSmXIo71{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-NWxbDkKcTSmXIo71 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-NWxbDkKcTSmXIo71 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-NWxbDkKcTSmXIo71 .error-icon{fill:#552222;}#mermaid-svg-NWxbDkKcTSmXIo71 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-NWxbDkKcTSmXIo71 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-NWxbDkKcTSmXIo71 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-NWxbDkKcTSmXIo71 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-NWxbDkKcTSmXIo71 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-NWxbDkKcTSmXIo71 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-NWxbDkKcTSmXIo71 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-NWxbDkKcTSmXIo71 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-NWxbDkKcTSmXIo71 .marker.cross{stroke:#333333;}#mermaid-svg-NWxbDkKcTSmXIo71 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-NWxbDkKcTSmXIo71 p{margin:0;}#mermaid-svg-NWxbDkKcTSmXIo71 g.classGroup text{fill:#9370DB;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-NWxbDkKcTSmXIo71 g.classGroup text .title{font-weight:bolder;}#mermaid-svg-NWxbDkKcTSmXIo71 .cluster-label text{fill:#333;}#mermaid-svg-NWxbDkKcTSmXIo71 .cluster-label span{color:#333;}#mermaid-svg-NWxbDkKcTSmXIo71 .cluster-label span p{background-color:transparent;}#mermaid-svg-NWxbDkKcTSmXIo71 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-NWxbDkKcTSmXIo71 .cluster text{fill:#333;}#mermaid-svg-NWxbDkKcTSmXIo71 .cluster span{color:#333;}#mermaid-svg-NWxbDkKcTSmXIo71 .nodeLabel,#mermaid-svg-NWxbDkKcTSmXIo71 .edgeLabel{color:#131300;}#mermaid-svg-NWxbDkKcTSmXIo71 .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-NWxbDkKcTSmXIo71 .label text{fill:#131300;}#mermaid-svg-NWxbDkKcTSmXIo71 .labelBkg{background:#ECECFF;}#mermaid-svg-NWxbDkKcTSmXIo71 .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-NWxbDkKcTSmXIo71 .classTitle{font-weight:bolder;}#mermaid-svg-NWxbDkKcTSmXIo71 .node rect,#mermaid-svg-NWxbDkKcTSmXIo71 .node circle,#mermaid-svg-NWxbDkKcTSmXIo71 .node ellipse,#mermaid-svg-NWxbDkKcTSmXIo71 .node polygon,#mermaid-svg-NWxbDkKcTSmXIo71 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-NWxbDkKcTSmXIo71 .divider{stroke:#9370DB;stroke-width:1;}#mermaid-svg-NWxbDkKcTSmXIo71 g.clickable{cursor:pointer;}#mermaid-svg-NWxbDkKcTSmXIo71 g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-NWxbDkKcTSmXIo71 g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-NWxbDkKcTSmXIo71 .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-NWxbDkKcTSmXIo71 .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-NWxbDkKcTSmXIo71 .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-NWxbDkKcTSmXIo71 .dashed-line{stroke-dasharray:3;}#mermaid-svg-NWxbDkKcTSmXIo71 .dotted-line{stroke-dasharray:1 2;}#mermaid-svg-NWxbDkKcTSmXIo71 #compositionStart,#mermaid-svg-NWxbDkKcTSmXIo71 .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-NWxbDkKcTSmXIo71 #compositionEnd,#mermaid-svg-NWxbDkKcTSmXIo71 .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-NWxbDkKcTSmXIo71 #dependencyStart,#mermaid-svg-NWxbDkKcTSmXIo71 .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-NWxbDkKcTSmXIo71 #dependencyStart,#mermaid-svg-NWxbDkKcTSmXIo71 .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-NWxbDkKcTSmXIo71 #extensionStart,#mermaid-svg-NWxbDkKcTSmXIo71 .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-NWxbDkKcTSmXIo71 #extensionEnd,#mermaid-svg-NWxbDkKcTSmXIo71 .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-NWxbDkKcTSmXIo71 #aggregationStart,#mermaid-svg-NWxbDkKcTSmXIo71 .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-NWxbDkKcTSmXIo71 #aggregationEnd,#mermaid-svg-NWxbDkKcTSmXIo71 .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-NWxbDkKcTSmXIo71 #lollipopStart,#mermaid-svg-NWxbDkKcTSmXIo71 .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-NWxbDkKcTSmXIo71 #lollipopEnd,#mermaid-svg-NWxbDkKcTSmXIo71 .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-NWxbDkKcTSmXIo71 .edgeTerminals{font-size:11px;line-height:initial;}#mermaid-svg-NWxbDkKcTSmXIo71 .classTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-NWxbDkKcTSmXIo71 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-NWxbDkKcTSmXIo71 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-NWxbDkKcTSmXIo71 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Animal
+virtual speak()
Dog
+speak() : 汪汪
Cat
+speak() : 喵喵
cpp
Animal* a = new Dog("旺财");
a->speak(); // 输出:汪汪
Animal* b = new Cat("咪咪");
b->speak(); // 输出:喵喵
delete a;
delete b;
C++ 中多态依赖 虚函数(virtual)。父类指针/引用指向子类对象时,调用虚函数会执行子类实现,这叫动态绑定。若 speak() 不加 virtual,则按指针类型调用,无法实现多态。
接口(Interface)
接口定义一组方法签名,规定"能做什么",但不关心"怎么做"。实现接口的类必须提供这些方法的具体实现。接口常用于解耦和实现多态,一个类可以实现多个接口,从而具备多种能力。与抽象类相比,接口更侧重行为契约,抽象类更侧重代码复用和部分实现。C++ 没有专门的 关键字interface,通常用纯虚函数 + 抽象类模拟接口。
#mermaid-svg-TceXEz6wtjZPpQaM{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-TceXEz6wtjZPpQaM .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-TceXEz6wtjZPpQaM .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-TceXEz6wtjZPpQaM .error-icon{fill:#552222;}#mermaid-svg-TceXEz6wtjZPpQaM .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-TceXEz6wtjZPpQaM .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-TceXEz6wtjZPpQaM .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-TceXEz6wtjZPpQaM .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-TceXEz6wtjZPpQaM .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-TceXEz6wtjZPpQaM .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-TceXEz6wtjZPpQaM .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-TceXEz6wtjZPpQaM .marker{fill:#333333;stroke:#333333;}#mermaid-svg-TceXEz6wtjZPpQaM .marker.cross{stroke:#333333;}#mermaid-svg-TceXEz6wtjZPpQaM svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-TceXEz6wtjZPpQaM p{margin:0;}#mermaid-svg-TceXEz6wtjZPpQaM g.classGroup text{fill:#9370DB;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-TceXEz6wtjZPpQaM g.classGroup text .title{font-weight:bolder;}#mermaid-svg-TceXEz6wtjZPpQaM .cluster-label text{fill:#333;}#mermaid-svg-TceXEz6wtjZPpQaM .cluster-label span{color:#333;}#mermaid-svg-TceXEz6wtjZPpQaM .cluster-label span p{background-color:transparent;}#mermaid-svg-TceXEz6wtjZPpQaM .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-TceXEz6wtjZPpQaM .cluster text{fill:#333;}#mermaid-svg-TceXEz6wtjZPpQaM .cluster span{color:#333;}#mermaid-svg-TceXEz6wtjZPpQaM .nodeLabel,#mermaid-svg-TceXEz6wtjZPpQaM .edgeLabel{color:#131300;}#mermaid-svg-TceXEz6wtjZPpQaM .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-TceXEz6wtjZPpQaM .label text{fill:#131300;}#mermaid-svg-TceXEz6wtjZPpQaM .labelBkg{background:#ECECFF;}#mermaid-svg-TceXEz6wtjZPpQaM .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-TceXEz6wtjZPpQaM .classTitle{font-weight:bolder;}#mermaid-svg-TceXEz6wtjZPpQaM .node rect,#mermaid-svg-TceXEz6wtjZPpQaM .node circle,#mermaid-svg-TceXEz6wtjZPpQaM .node ellipse,#mermaid-svg-TceXEz6wtjZPpQaM .node polygon,#mermaid-svg-TceXEz6wtjZPpQaM .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-TceXEz6wtjZPpQaM .divider{stroke:#9370DB;stroke-width:1;}#mermaid-svg-TceXEz6wtjZPpQaM g.clickable{cursor:pointer;}#mermaid-svg-TceXEz6wtjZPpQaM g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-TceXEz6wtjZPpQaM g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-TceXEz6wtjZPpQaM .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-TceXEz6wtjZPpQaM .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-TceXEz6wtjZPpQaM .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-TceXEz6wtjZPpQaM .dashed-line{stroke-dasharray:3;}#mermaid-svg-TceXEz6wtjZPpQaM .dotted-line{stroke-dasharray:1 2;}#mermaid-svg-TceXEz6wtjZPpQaM #compositionStart,#mermaid-svg-TceXEz6wtjZPpQaM .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-TceXEz6wtjZPpQaM #compositionEnd,#mermaid-svg-TceXEz6wtjZPpQaM .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-TceXEz6wtjZPpQaM #dependencyStart,#mermaid-svg-TceXEz6wtjZPpQaM .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-TceXEz6wtjZPpQaM #dependencyStart,#mermaid-svg-TceXEz6wtjZPpQaM .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-TceXEz6wtjZPpQaM #extensionStart,#mermaid-svg-TceXEz6wtjZPpQaM .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-TceXEz6wtjZPpQaM #extensionEnd,#mermaid-svg-TceXEz6wtjZPpQaM .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-TceXEz6wtjZPpQaM #aggregationStart,#mermaid-svg-TceXEz6wtjZPpQaM .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-TceXEz6wtjZPpQaM #aggregationEnd,#mermaid-svg-TceXEz6wtjZPpQaM .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-TceXEz6wtjZPpQaM #lollipopStart,#mermaid-svg-TceXEz6wtjZPpQaM .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-TceXEz6wtjZPpQaM #lollipopEnd,#mermaid-svg-TceXEz6wtjZPpQaM .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-TceXEz6wtjZPpQaM .edgeTerminals{font-size:11px;line-height:initial;}#mermaid-svg-TceXEz6wtjZPpQaM .classTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-TceXEz6wtjZPpQaM .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-TceXEz6wtjZPpQaM .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-TceXEz6wtjZPpQaM :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} <<interface>>
Flyable
+virtual fly() : = 0
<<interface>>
Swimmable
+virtual swim() : = 0
Duck
+fly()
+swim()
cpp
class Flyable {
public:
virtual void fly() = 0; // 纯虚函数
virtual ~Flyable() = default;
};
class Swimmable {
public:
virtual void swim() = 0;
virtual ~Swimmable() = default;
};
class Duck : public Flyable, public Swimmable {
public:
void fly() override { std::cout << "鸭子在飞" << std::endl; }
void swim() override { std::cout << "鸭子在游" << std::endl; }
};
含纯虚函数的类是抽象类,不能实例化。Duck 必须实现所有纯虚函数才能创建对象。C++ 支持多继承,所以一个类可以实现多个"接口"。
UML类图基础
UML 类图描述类的静态结构以及类与类之间的关系。在 C++ 中,这 6 种关系不仅体现在图形符号上,更直接映射到代码写法、内存布局、所有权、以及生命周期。下面逐一讲解,每种关系都给出 UML 符号、C++ 代码和判断要点。
#mermaid-svg-wr2TgeoBEpQMmJED{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-wr2TgeoBEpQMmJED .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-wr2TgeoBEpQMmJED .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-wr2TgeoBEpQMmJED .error-icon{fill:#552222;}#mermaid-svg-wr2TgeoBEpQMmJED .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-wr2TgeoBEpQMmJED .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-wr2TgeoBEpQMmJED .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-wr2TgeoBEpQMmJED .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-wr2TgeoBEpQMmJED .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-wr2TgeoBEpQMmJED .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-wr2TgeoBEpQMmJED .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-wr2TgeoBEpQMmJED .marker{fill:#333333;stroke:#333333;}#mermaid-svg-wr2TgeoBEpQMmJED .marker.cross{stroke:#333333;}#mermaid-svg-wr2TgeoBEpQMmJED svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-wr2TgeoBEpQMmJED p{margin:0;}#mermaid-svg-wr2TgeoBEpQMmJED g.classGroup text{fill:#9370DB;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-wr2TgeoBEpQMmJED g.classGroup text .title{font-weight:bolder;}#mermaid-svg-wr2TgeoBEpQMmJED .cluster-label text{fill:#333;}#mermaid-svg-wr2TgeoBEpQMmJED .cluster-label span{color:#333;}#mermaid-svg-wr2TgeoBEpQMmJED .cluster-label span p{background-color:transparent;}#mermaid-svg-wr2TgeoBEpQMmJED .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-wr2TgeoBEpQMmJED .cluster text{fill:#333;}#mermaid-svg-wr2TgeoBEpQMmJED .cluster span{color:#333;}#mermaid-svg-wr2TgeoBEpQMmJED .nodeLabel,#mermaid-svg-wr2TgeoBEpQMmJED .edgeLabel{color:#131300;}#mermaid-svg-wr2TgeoBEpQMmJED .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-wr2TgeoBEpQMmJED .label text{fill:#131300;}#mermaid-svg-wr2TgeoBEpQMmJED .labelBkg{background:#ECECFF;}#mermaid-svg-wr2TgeoBEpQMmJED .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-wr2TgeoBEpQMmJED .classTitle{font-weight:bolder;}#mermaid-svg-wr2TgeoBEpQMmJED .node rect,#mermaid-svg-wr2TgeoBEpQMmJED .node circle,#mermaid-svg-wr2TgeoBEpQMmJED .node ellipse,#mermaid-svg-wr2TgeoBEpQMmJED .node polygon,#mermaid-svg-wr2TgeoBEpQMmJED .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-wr2TgeoBEpQMmJED .divider{stroke:#9370DB;stroke-width:1;}#mermaid-svg-wr2TgeoBEpQMmJED g.clickable{cursor:pointer;}#mermaid-svg-wr2TgeoBEpQMmJED g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-wr2TgeoBEpQMmJED g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-wr2TgeoBEpQMmJED .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-wr2TgeoBEpQMmJED .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-wr2TgeoBEpQMmJED .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-wr2TgeoBEpQMmJED .dashed-line{stroke-dasharray:3;}#mermaid-svg-wr2TgeoBEpQMmJED .dotted-line{stroke-dasharray:1 2;}#mermaid-svg-wr2TgeoBEpQMmJED #compositionStart,#mermaid-svg-wr2TgeoBEpQMmJED .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-wr2TgeoBEpQMmJED #compositionEnd,#mermaid-svg-wr2TgeoBEpQMmJED .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-wr2TgeoBEpQMmJED #dependencyStart,#mermaid-svg-wr2TgeoBEpQMmJED .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-wr2TgeoBEpQMmJED #dependencyStart,#mermaid-svg-wr2TgeoBEpQMmJED .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-wr2TgeoBEpQMmJED #extensionStart,#mermaid-svg-wr2TgeoBEpQMmJED .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-wr2TgeoBEpQMmJED #extensionEnd,#mermaid-svg-wr2TgeoBEpQMmJED .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-wr2TgeoBEpQMmJED #aggregationStart,#mermaid-svg-wr2TgeoBEpQMmJED .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-wr2TgeoBEpQMmJED #aggregationEnd,#mermaid-svg-wr2TgeoBEpQMmJED .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-wr2TgeoBEpQMmJED #lollipopStart,#mermaid-svg-wr2TgeoBEpQMmJED .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-wr2TgeoBEpQMmJED #lollipopEnd,#mermaid-svg-wr2TgeoBEpQMmJED .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-wr2TgeoBEpQMmJED .edgeTerminals{font-size:11px;line-height:initial;}#mermaid-svg-wr2TgeoBEpQMmJED .classTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-wr2TgeoBEpQMmJED .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-wr2TgeoBEpQMmJED .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-wr2TgeoBEpQMmJED :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} <<dependency>>
依赖
参数/局部变量
<<association>>
关联
成员指针/引用
<<aggregation>>
聚合
指针容器不拥有
<<composition>>
组合
值成员/unique_ptr
<<inheritance>>
继承
public is-a
<<realization>>
实现
纯虚函数接口
关系由弱到强:依赖 < 关联 < 聚合 < 组合 < 继承 ≈ 实现。
类的表示方法
#mermaid-svg-jQaHdEKF1sQ6n1VO{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-jQaHdEKF1sQ6n1VO .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-jQaHdEKF1sQ6n1VO .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-jQaHdEKF1sQ6n1VO .error-icon{fill:#552222;}#mermaid-svg-jQaHdEKF1sQ6n1VO .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-jQaHdEKF1sQ6n1VO .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-jQaHdEKF1sQ6n1VO .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-jQaHdEKF1sQ6n1VO .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-jQaHdEKF1sQ6n1VO .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-jQaHdEKF1sQ6n1VO .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-jQaHdEKF1sQ6n1VO .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-jQaHdEKF1sQ6n1VO .marker{fill:#333333;stroke:#333333;}#mermaid-svg-jQaHdEKF1sQ6n1VO .marker.cross{stroke:#333333;}#mermaid-svg-jQaHdEKF1sQ6n1VO svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-jQaHdEKF1sQ6n1VO p{margin:0;}#mermaid-svg-jQaHdEKF1sQ6n1VO g.classGroup text{fill:#9370DB;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-jQaHdEKF1sQ6n1VO g.classGroup text .title{font-weight:bolder;}#mermaid-svg-jQaHdEKF1sQ6n1VO .cluster-label text{fill:#333;}#mermaid-svg-jQaHdEKF1sQ6n1VO .cluster-label span{color:#333;}#mermaid-svg-jQaHdEKF1sQ6n1VO .cluster-label span p{background-color:transparent;}#mermaid-svg-jQaHdEKF1sQ6n1VO .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-jQaHdEKF1sQ6n1VO .cluster text{fill:#333;}#mermaid-svg-jQaHdEKF1sQ6n1VO .cluster span{color:#333;}#mermaid-svg-jQaHdEKF1sQ6n1VO .nodeLabel,#mermaid-svg-jQaHdEKF1sQ6n1VO .edgeLabel{color:#131300;}#mermaid-svg-jQaHdEKF1sQ6n1VO .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-jQaHdEKF1sQ6n1VO .label text{fill:#131300;}#mermaid-svg-jQaHdEKF1sQ6n1VO .labelBkg{background:#ECECFF;}#mermaid-svg-jQaHdEKF1sQ6n1VO .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-jQaHdEKF1sQ6n1VO .classTitle{font-weight:bolder;}#mermaid-svg-jQaHdEKF1sQ6n1VO .node rect,#mermaid-svg-jQaHdEKF1sQ6n1VO .node circle,#mermaid-svg-jQaHdEKF1sQ6n1VO .node ellipse,#mermaid-svg-jQaHdEKF1sQ6n1VO .node polygon,#mermaid-svg-jQaHdEKF1sQ6n1VO .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-jQaHdEKF1sQ6n1VO .divider{stroke:#9370DB;stroke-width:1;}#mermaid-svg-jQaHdEKF1sQ6n1VO g.clickable{cursor:pointer;}#mermaid-svg-jQaHdEKF1sQ6n1VO g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-jQaHdEKF1sQ6n1VO g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-jQaHdEKF1sQ6n1VO .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-jQaHdEKF1sQ6n1VO .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-jQaHdEKF1sQ6n1VO .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-jQaHdEKF1sQ6n1VO .dashed-line{stroke-dasharray:3;}#mermaid-svg-jQaHdEKF1sQ6n1VO .dotted-line{stroke-dasharray:1 2;}#mermaid-svg-jQaHdEKF1sQ6n1VO #compositionStart,#mermaid-svg-jQaHdEKF1sQ6n1VO .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-jQaHdEKF1sQ6n1VO #compositionEnd,#mermaid-svg-jQaHdEKF1sQ6n1VO .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-jQaHdEKF1sQ6n1VO #dependencyStart,#mermaid-svg-jQaHdEKF1sQ6n1VO .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-jQaHdEKF1sQ6n1VO #dependencyStart,#mermaid-svg-jQaHdEKF1sQ6n1VO .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-jQaHdEKF1sQ6n1VO #extensionStart,#mermaid-svg-jQaHdEKF1sQ6n1VO .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-jQaHdEKF1sQ6n1VO #extensionEnd,#mermaid-svg-jQaHdEKF1sQ6n1VO .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-jQaHdEKF1sQ6n1VO #aggregationStart,#mermaid-svg-jQaHdEKF1sQ6n1VO .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-jQaHdEKF1sQ6n1VO #aggregationEnd,#mermaid-svg-jQaHdEKF1sQ6n1VO .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-jQaHdEKF1sQ6n1VO #lollipopStart,#mermaid-svg-jQaHdEKF1sQ6n1VO .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-jQaHdEKF1sQ6n1VO #lollipopEnd,#mermaid-svg-jQaHdEKF1sQ6n1VO .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-jQaHdEKF1sQ6n1VO .edgeTerminals{font-size:11px;line-height:initial;}#mermaid-svg-jQaHdEKF1sQ6n1VO .classTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-jQaHdEKF1sQ6n1VO .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-jQaHdEKF1sQ6n1VO .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-jQaHdEKF1sQ6n1VO :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Student
-string name
-string id
+selectCourse()
+takeExam()
- 第一格:类名
- 第二格:属性(- private,+ public,# protected)
- 第三格:方法
依赖(Dependency)
含义:一个类临时使用另一个类,是最弱的关系。表现为方法参数、局部变量、返回值、静态调用。用一下就释放,不长期持有。
UML 符号:虚线箭头,指向被依赖方。
#mermaid-svg-SD2ow2Q1eY0b5yRM{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-SD2ow2Q1eY0b5yRM .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-SD2ow2Q1eY0b5yRM .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-SD2ow2Q1eY0b5yRM .error-icon{fill:#552222;}#mermaid-svg-SD2ow2Q1eY0b5yRM .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-SD2ow2Q1eY0b5yRM .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-SD2ow2Q1eY0b5yRM .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-SD2ow2Q1eY0b5yRM .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-SD2ow2Q1eY0b5yRM .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-SD2ow2Q1eY0b5yRM .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-SD2ow2Q1eY0b5yRM .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-SD2ow2Q1eY0b5yRM .marker{fill:#333333;stroke:#333333;}#mermaid-svg-SD2ow2Q1eY0b5yRM .marker.cross{stroke:#333333;}#mermaid-svg-SD2ow2Q1eY0b5yRM svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-SD2ow2Q1eY0b5yRM p{margin:0;}#mermaid-svg-SD2ow2Q1eY0b5yRM g.classGroup text{fill:#9370DB;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-SD2ow2Q1eY0b5yRM g.classGroup text .title{font-weight:bolder;}#mermaid-svg-SD2ow2Q1eY0b5yRM .cluster-label text{fill:#333;}#mermaid-svg-SD2ow2Q1eY0b5yRM .cluster-label span{color:#333;}#mermaid-svg-SD2ow2Q1eY0b5yRM .cluster-label span p{background-color:transparent;}#mermaid-svg-SD2ow2Q1eY0b5yRM .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-SD2ow2Q1eY0b5yRM .cluster text{fill:#333;}#mermaid-svg-SD2ow2Q1eY0b5yRM .cluster span{color:#333;}#mermaid-svg-SD2ow2Q1eY0b5yRM .nodeLabel,#mermaid-svg-SD2ow2Q1eY0b5yRM .edgeLabel{color:#131300;}#mermaid-svg-SD2ow2Q1eY0b5yRM .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-SD2ow2Q1eY0b5yRM .label text{fill:#131300;}#mermaid-svg-SD2ow2Q1eY0b5yRM .labelBkg{background:#ECECFF;}#mermaid-svg-SD2ow2Q1eY0b5yRM .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-SD2ow2Q1eY0b5yRM .classTitle{font-weight:bolder;}#mermaid-svg-SD2ow2Q1eY0b5yRM .node rect,#mermaid-svg-SD2ow2Q1eY0b5yRM .node circle,#mermaid-svg-SD2ow2Q1eY0b5yRM .node ellipse,#mermaid-svg-SD2ow2Q1eY0b5yRM .node polygon,#mermaid-svg-SD2ow2Q1eY0b5yRM .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-SD2ow2Q1eY0b5yRM .divider{stroke:#9370DB;stroke-width:1;}#mermaid-svg-SD2ow2Q1eY0b5yRM g.clickable{cursor:pointer;}#mermaid-svg-SD2ow2Q1eY0b5yRM g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-SD2ow2Q1eY0b5yRM g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-SD2ow2Q1eY0b5yRM .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-SD2ow2Q1eY0b5yRM .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-SD2ow2Q1eY0b5yRM .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-SD2ow2Q1eY0b5yRM .dashed-line{stroke-dasharray:3;}#mermaid-svg-SD2ow2Q1eY0b5yRM .dotted-line{stroke-dasharray:1 2;}#mermaid-svg-SD2ow2Q1eY0b5yRM #compositionStart,#mermaid-svg-SD2ow2Q1eY0b5yRM .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-SD2ow2Q1eY0b5yRM #compositionEnd,#mermaid-svg-SD2ow2Q1eY0b5yRM .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-SD2ow2Q1eY0b5yRM #dependencyStart,#mermaid-svg-SD2ow2Q1eY0b5yRM .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-SD2ow2Q1eY0b5yRM #dependencyStart,#mermaid-svg-SD2ow2Q1eY0b5yRM .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-SD2ow2Q1eY0b5yRM #extensionStart,#mermaid-svg-SD2ow2Q1eY0b5yRM .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-SD2ow2Q1eY0b5yRM #extensionEnd,#mermaid-svg-SD2ow2Q1eY0b5yRM .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-SD2ow2Q1eY0b5yRM #aggregationStart,#mermaid-svg-SD2ow2Q1eY0b5yRM .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-SD2ow2Q1eY0b5yRM #aggregationEnd,#mermaid-svg-SD2ow2Q1eY0b5yRM .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-SD2ow2Q1eY0b5yRM #lollipopStart,#mermaid-svg-SD2ow2Q1eY0b5yRM .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-SD2ow2Q1eY0b5yRM #lollipopEnd,#mermaid-svg-SD2ow2Q1eY0b5yRM .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-SD2ow2Q1eY0b5yRM .edgeTerminals{font-size:11px;line-height:initial;}#mermaid-svg-SD2ow2Q1eY0b5yRM .classTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-SD2ow2Q1eY0b5yRM .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-SD2ow2Q1eY0b5yRM .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-SD2ow2Q1eY0b5yRM :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 依赖
Driver
+drive(Car& car)
Car
+start()
cpp
class Car {
public:
void start() {}
};
class Driver {
public:
void drive(Car& car) { // Car 作为参数,临时使用
car.start();
}
void test() {
Car c; // 局部变量,函数结束即销毁
c.start();
}
};
C++ 特征:
- 不做成员变量,生命周期只在方法内。
- 头文件用前向声明即可,不必 include。
cpp
// Driver.h
class Car; // 前向声明
class Driver {
public:
void drive(Car& car);
};
关联(Association)
个类长期持有另一个类的指针/引用,是"知道"关系,但两者生命周期独立。UML 符号:实线箭头,可标多重性(1、0...1、*)。
#mermaid-svg-74Gg8fsLHnHbDgWF{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-74Gg8fsLHnHbDgWF .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-74Gg8fsLHnHbDgWF .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-74Gg8fsLHnHbDgWF .error-icon{fill:#552222;}#mermaid-svg-74Gg8fsLHnHbDgWF .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-74Gg8fsLHnHbDgWF .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-74Gg8fsLHnHbDgWF .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-74Gg8fsLHnHbDgWF .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-74Gg8fsLHnHbDgWF .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-74Gg8fsLHnHbDgWF .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-74Gg8fsLHnHbDgWF .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-74Gg8fsLHnHbDgWF .marker{fill:#333333;stroke:#333333;}#mermaid-svg-74Gg8fsLHnHbDgWF .marker.cross{stroke:#333333;}#mermaid-svg-74Gg8fsLHnHbDgWF svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-74Gg8fsLHnHbDgWF p{margin:0;}#mermaid-svg-74Gg8fsLHnHbDgWF g.classGroup text{fill:#9370DB;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-74Gg8fsLHnHbDgWF g.classGroup text .title{font-weight:bolder;}#mermaid-svg-74Gg8fsLHnHbDgWF .cluster-label text{fill:#333;}#mermaid-svg-74Gg8fsLHnHbDgWF .cluster-label span{color:#333;}#mermaid-svg-74Gg8fsLHnHbDgWF .cluster-label span p{background-color:transparent;}#mermaid-svg-74Gg8fsLHnHbDgWF .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-74Gg8fsLHnHbDgWF .cluster text{fill:#333;}#mermaid-svg-74Gg8fsLHnHbDgWF .cluster span{color:#333;}#mermaid-svg-74Gg8fsLHnHbDgWF .nodeLabel,#mermaid-svg-74Gg8fsLHnHbDgWF .edgeLabel{color:#131300;}#mermaid-svg-74Gg8fsLHnHbDgWF .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-74Gg8fsLHnHbDgWF .label text{fill:#131300;}#mermaid-svg-74Gg8fsLHnHbDgWF .labelBkg{background:#ECECFF;}#mermaid-svg-74Gg8fsLHnHbDgWF .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-74Gg8fsLHnHbDgWF .classTitle{font-weight:bolder;}#mermaid-svg-74Gg8fsLHnHbDgWF .node rect,#mermaid-svg-74Gg8fsLHnHbDgWF .node circle,#mermaid-svg-74Gg8fsLHnHbDgWF .node ellipse,#mermaid-svg-74Gg8fsLHnHbDgWF .node polygon,#mermaid-svg-74Gg8fsLHnHbDgWF .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-74Gg8fsLHnHbDgWF .divider{stroke:#9370DB;stroke-width:1;}#mermaid-svg-74Gg8fsLHnHbDgWF g.clickable{cursor:pointer;}#mermaid-svg-74Gg8fsLHnHbDgWF g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-74Gg8fsLHnHbDgWF g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-74Gg8fsLHnHbDgWF .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-74Gg8fsLHnHbDgWF .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-74Gg8fsLHnHbDgWF .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-74Gg8fsLHnHbDgWF .dashed-line{stroke-dasharray:3;}#mermaid-svg-74Gg8fsLHnHbDgWF .dotted-line{stroke-dasharray:1 2;}#mermaid-svg-74Gg8fsLHnHbDgWF #compositionStart,#mermaid-svg-74Gg8fsLHnHbDgWF .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-74Gg8fsLHnHbDgWF #compositionEnd,#mermaid-svg-74Gg8fsLHnHbDgWF .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-74Gg8fsLHnHbDgWF #dependencyStart,#mermaid-svg-74Gg8fsLHnHbDgWF .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-74Gg8fsLHnHbDgWF #dependencyStart,#mermaid-svg-74Gg8fsLHnHbDgWF .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-74Gg8fsLHnHbDgWF #extensionStart,#mermaid-svg-74Gg8fsLHnHbDgWF .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-74Gg8fsLHnHbDgWF #extensionEnd,#mermaid-svg-74Gg8fsLHnHbDgWF .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-74Gg8fsLHnHbDgWF #aggregationStart,#mermaid-svg-74Gg8fsLHnHbDgWF .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-74Gg8fsLHnHbDgWF #aggregationEnd,#mermaid-svg-74Gg8fsLHnHbDgWF .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-74Gg8fsLHnHbDgWF #lollipopStart,#mermaid-svg-74Gg8fsLHnHbDgWF .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-74Gg8fsLHnHbDgWF #lollipopEnd,#mermaid-svg-74Gg8fsLHnHbDgWF .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-74Gg8fsLHnHbDgWF .edgeTerminals{font-size:11px;line-height:initial;}#mermaid-svg-74Gg8fsLHnHbDgWF .classTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-74Gg8fsLHnHbDgWF .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-74Gg8fsLHnHbDgWF .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-74Gg8fsLHnHbDgWF :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 关联
Student
-vector<Course*> courses
Course
-string name
cpp
class Course {
std::string name;
};
class Student {
private:
std::vector<Course*> courses; // 成员指针,长期持有
public:
void addCourse(Course* c) { courses.push_back(c); }
};
C++ 特征:
- 用成员指针或引用,不用值成员(值成员会变成组合)。
- 不负责 delete 对方,只持有引用。
- 文件用前向声明,cpp 里再 include。
聚合(Aggregation)
弱的"整体---部分"关系(has-a)。部分可以独立于整体存在,生命周期不绑定。UML 符号:空心菱形 + 实线,菱形在整体一侧。
#mermaid-svg-mYImIvWpZrn25zEF{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-mYImIvWpZrn25zEF .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-mYImIvWpZrn25zEF .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-mYImIvWpZrn25zEF .error-icon{fill:#552222;}#mermaid-svg-mYImIvWpZrn25zEF .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-mYImIvWpZrn25zEF .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-mYImIvWpZrn25zEF .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-mYImIvWpZrn25zEF .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-mYImIvWpZrn25zEF .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-mYImIvWpZrn25zEF .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-mYImIvWpZrn25zEF .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-mYImIvWpZrn25zEF .marker{fill:#333333;stroke:#333333;}#mermaid-svg-mYImIvWpZrn25zEF .marker.cross{stroke:#333333;}#mermaid-svg-mYImIvWpZrn25zEF svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-mYImIvWpZrn25zEF p{margin:0;}#mermaid-svg-mYImIvWpZrn25zEF g.classGroup text{fill:#9370DB;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-mYImIvWpZrn25zEF g.classGroup text .title{font-weight:bolder;}#mermaid-svg-mYImIvWpZrn25zEF .cluster-label text{fill:#333;}#mermaid-svg-mYImIvWpZrn25zEF .cluster-label span{color:#333;}#mermaid-svg-mYImIvWpZrn25zEF .cluster-label span p{background-color:transparent;}#mermaid-svg-mYImIvWpZrn25zEF .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-mYImIvWpZrn25zEF .cluster text{fill:#333;}#mermaid-svg-mYImIvWpZrn25zEF .cluster span{color:#333;}#mermaid-svg-mYImIvWpZrn25zEF .nodeLabel,#mermaid-svg-mYImIvWpZrn25zEF .edgeLabel{color:#131300;}#mermaid-svg-mYImIvWpZrn25zEF .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-mYImIvWpZrn25zEF .label text{fill:#131300;}#mermaid-svg-mYImIvWpZrn25zEF .labelBkg{background:#ECECFF;}#mermaid-svg-mYImIvWpZrn25zEF .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-mYImIvWpZrn25zEF .classTitle{font-weight:bolder;}#mermaid-svg-mYImIvWpZrn25zEF .node rect,#mermaid-svg-mYImIvWpZrn25zEF .node circle,#mermaid-svg-mYImIvWpZrn25zEF .node ellipse,#mermaid-svg-mYImIvWpZrn25zEF .node polygon,#mermaid-svg-mYImIvWpZrn25zEF .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-mYImIvWpZrn25zEF .divider{stroke:#9370DB;stroke-width:1;}#mermaid-svg-mYImIvWpZrn25zEF g.clickable{cursor:pointer;}#mermaid-svg-mYImIvWpZrn25zEF g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-mYImIvWpZrn25zEF g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-mYImIvWpZrn25zEF .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-mYImIvWpZrn25zEF .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-mYImIvWpZrn25zEF .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-mYImIvWpZrn25zEF .dashed-line{stroke-dasharray:3;}#mermaid-svg-mYImIvWpZrn25zEF .dotted-line{stroke-dasharray:1 2;}#mermaid-svg-mYImIvWpZrn25zEF #compositionStart,#mermaid-svg-mYImIvWpZrn25zEF .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-mYImIvWpZrn25zEF #compositionEnd,#mermaid-svg-mYImIvWpZrn25zEF .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-mYImIvWpZrn25zEF #dependencyStart,#mermaid-svg-mYImIvWpZrn25zEF .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-mYImIvWpZrn25zEF #dependencyStart,#mermaid-svg-mYImIvWpZrn25zEF .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-mYImIvWpZrn25zEF #extensionStart,#mermaid-svg-mYImIvWpZrn25zEF .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-mYImIvWpZrn25zEF #extensionEnd,#mermaid-svg-mYImIvWpZrn25zEF .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-mYImIvWpZrn25zEF #aggregationStart,#mermaid-svg-mYImIvWpZrn25zEF .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-mYImIvWpZrn25zEF #aggregationEnd,#mermaid-svg-mYImIvWpZrn25zEF .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-mYImIvWpZrn25zEF #lollipopStart,#mermaid-svg-mYImIvWpZrn25zEF .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-mYImIvWpZrn25zEF #lollipopEnd,#mermaid-svg-mYImIvWpZrn25zEF .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-mYImIvWpZrn25zEF .edgeTerminals{font-size:11px;line-height:initial;}#mermaid-svg-mYImIvWpZrn25zEF .classTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-mYImIvWpZrn25zEF .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-mYImIvWpZrn25zEF .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-mYImIvWpZrn25zEF :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 聚合
ClassRoom
-vector<reference_wrapper<Student>> students
+addStudent(Student& s)
+showStudents()
Student
-string name
+Student(string n)
+getName() : string
cpp
#include <iostream>
#include <vector>
#include <functional> // reference_wrapper
#include <string>
class Student {
private:
std::string name;
public:
Student(const std::string& n) : name(n) {}
std::string getName() const { return name; }
~Student() {
std::cout << "学生 " << name << " 销毁\n";
}
};
class ClassRoom {
private:
std::vector<std::reference_wrapper<Student>> students; // 聚合:持有引用
public:
void addStudent(Student& s) {
students.push_back(s); // 存引用,必须有效
}
void showStudents() const {
std::cout << "班级学生:";
for (const Student& s : students) { // 隐式转换回 Student&
std::cout << s.getName() << " ";
}
std::cout << "\n";
}
~ClassRoom() {
students.clear(); // 只清空引用列表,不销毁学生
std::cout << "班级销毁(学生仍在)\n";
}
};
int main() {
Student s1("张三");
Student s2("李四");
{
ClassRoom room;
room.addStudent(s1); // 传引用
room.addStudent(s2);
room.showStudents();
} // room 销毁,学生仍存在
std::cout << "张三、李四仍然存在\n";
return 0;
}
C++ 特征:
- 用裸指针或 reference_wrapper,不用 unique_ptr(因为不拥有)。
- 整体销毁时,不销毁部分。
- 部分可以在整体之外独立创建和销毁。
组合(Composition)
强的"整体---部分"关系(contains-a)。部分不能独立于整体存在,生命周期完全绑定。UML 符号:实心菱形 + 实线,菱形在整体一侧。
#mermaid-svg-8iUaXJ2UzKt0CJGc{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-8iUaXJ2UzKt0CJGc .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-8iUaXJ2UzKt0CJGc .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-8iUaXJ2UzKt0CJGc .error-icon{fill:#552222;}#mermaid-svg-8iUaXJ2UzKt0CJGc .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-8iUaXJ2UzKt0CJGc .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-8iUaXJ2UzKt0CJGc .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-8iUaXJ2UzKt0CJGc .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-8iUaXJ2UzKt0CJGc .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-8iUaXJ2UzKt0CJGc .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-8iUaXJ2UzKt0CJGc .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-8iUaXJ2UzKt0CJGc .marker{fill:#333333;stroke:#333333;}#mermaid-svg-8iUaXJ2UzKt0CJGc .marker.cross{stroke:#333333;}#mermaid-svg-8iUaXJ2UzKt0CJGc svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-8iUaXJ2UzKt0CJGc p{margin:0;}#mermaid-svg-8iUaXJ2UzKt0CJGc g.classGroup text{fill:#9370DB;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-8iUaXJ2UzKt0CJGc g.classGroup text .title{font-weight:bolder;}#mermaid-svg-8iUaXJ2UzKt0CJGc .cluster-label text{fill:#333;}#mermaid-svg-8iUaXJ2UzKt0CJGc .cluster-label span{color:#333;}#mermaid-svg-8iUaXJ2UzKt0CJGc .cluster-label span p{background-color:transparent;}#mermaid-svg-8iUaXJ2UzKt0CJGc .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-8iUaXJ2UzKt0CJGc .cluster text{fill:#333;}#mermaid-svg-8iUaXJ2UzKt0CJGc .cluster span{color:#333;}#mermaid-svg-8iUaXJ2UzKt0CJGc .nodeLabel,#mermaid-svg-8iUaXJ2UzKt0CJGc .edgeLabel{color:#131300;}#mermaid-svg-8iUaXJ2UzKt0CJGc .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-8iUaXJ2UzKt0CJGc .label text{fill:#131300;}#mermaid-svg-8iUaXJ2UzKt0CJGc .labelBkg{background:#ECECFF;}#mermaid-svg-8iUaXJ2UzKt0CJGc .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-8iUaXJ2UzKt0CJGc .classTitle{font-weight:bolder;}#mermaid-svg-8iUaXJ2UzKt0CJGc .node rect,#mermaid-svg-8iUaXJ2UzKt0CJGc .node circle,#mermaid-svg-8iUaXJ2UzKt0CJGc .node ellipse,#mermaid-svg-8iUaXJ2UzKt0CJGc .node polygon,#mermaid-svg-8iUaXJ2UzKt0CJGc .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-8iUaXJ2UzKt0CJGc .divider{stroke:#9370DB;stroke-width:1;}#mermaid-svg-8iUaXJ2UzKt0CJGc g.clickable{cursor:pointer;}#mermaid-svg-8iUaXJ2UzKt0CJGc g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-8iUaXJ2UzKt0CJGc g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-8iUaXJ2UzKt0CJGc .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-8iUaXJ2UzKt0CJGc .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-8iUaXJ2UzKt0CJGc .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-8iUaXJ2UzKt0CJGc .dashed-line{stroke-dasharray:3;}#mermaid-svg-8iUaXJ2UzKt0CJGc .dotted-line{stroke-dasharray:1 2;}#mermaid-svg-8iUaXJ2UzKt0CJGc #compositionStart,#mermaid-svg-8iUaXJ2UzKt0CJGc .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-8iUaXJ2UzKt0CJGc #compositionEnd,#mermaid-svg-8iUaXJ2UzKt0CJGc .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-8iUaXJ2UzKt0CJGc #dependencyStart,#mermaid-svg-8iUaXJ2UzKt0CJGc .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-8iUaXJ2UzKt0CJGc #dependencyStart,#mermaid-svg-8iUaXJ2UzKt0CJGc .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-8iUaXJ2UzKt0CJGc #extensionStart,#mermaid-svg-8iUaXJ2UzKt0CJGc .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-8iUaXJ2UzKt0CJGc #extensionEnd,#mermaid-svg-8iUaXJ2UzKt0CJGc .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-8iUaXJ2UzKt0CJGc #aggregationStart,#mermaid-svg-8iUaXJ2UzKt0CJGc .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-8iUaXJ2UzKt0CJGc #aggregationEnd,#mermaid-svg-8iUaXJ2UzKt0CJGc .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-8iUaXJ2UzKt0CJGc #lollipopStart,#mermaid-svg-8iUaXJ2UzKt0CJGc .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-8iUaXJ2UzKt0CJGc #lollipopEnd,#mermaid-svg-8iUaXJ2UzKt0CJGc .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-8iUaXJ2UzKt0CJGc .edgeTerminals{font-size:11px;line-height:initial;}#mermaid-svg-8iUaXJ2UzKt0CJGc .classTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-8iUaXJ2UzKt0CJGc .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-8iUaXJ2UzKt0CJGc .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-8iUaXJ2UzKt0CJGc :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 组合
Person
-Heart heart
+live()
Heart
+beat()
值成员:
cpp
#include <iostream>
class Heart {
public:
void beat() { std::cout << "心跳\n"; }
};
class Person {
private:
Heart heart; // 值成员,随 Person 构造/析构
public:
void live() {
std::cout << "人活着\n";
heart.beat(); // 直接使用
}
};
int main() {
Person p;
p.live();
// p 离开作用域,heart 自动销毁
}
unique_ptr:
cpp
#include <iostream>
#include <memory>
class Heart {
public:
void beat() { std::cout << "心跳\n"; }
};
class Person {
private:
std::unique_ptr<Heart> heart;
public:
Person() : heart(std::make_unique<Heart>()) {}
void live() {
std::cout << "人活着\n";
heart->beat(); // 用 ->
}
};
int main() {
Person p;
p.live();
// p 销毁,heart 自动 delete
}
C++ 特征:
- 值成员:对象内存内嵌,随整体一起分配/释放。
- unique_ptr:独占所有权,整体销毁时自动销毁部分。
- 部分不能脱离整体存在,生命周期完全绑定。
继承(Inheritance / Generalization)
"is-a" 关系,子类继承父类,复用并扩展。UML 符号:空心三角箭头 + 实线,箭头指向父类。
#mermaid-svg-8XBVNLZEgOgMwQ2G{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-8XBVNLZEgOgMwQ2G .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-8XBVNLZEgOgMwQ2G .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-8XBVNLZEgOgMwQ2G .error-icon{fill:#552222;}#mermaid-svg-8XBVNLZEgOgMwQ2G .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-8XBVNLZEgOgMwQ2G .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-8XBVNLZEgOgMwQ2G .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-8XBVNLZEgOgMwQ2G .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-8XBVNLZEgOgMwQ2G .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-8XBVNLZEgOgMwQ2G .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-8XBVNLZEgOgMwQ2G .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-8XBVNLZEgOgMwQ2G .marker{fill:#333333;stroke:#333333;}#mermaid-svg-8XBVNLZEgOgMwQ2G .marker.cross{stroke:#333333;}#mermaid-svg-8XBVNLZEgOgMwQ2G svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-8XBVNLZEgOgMwQ2G p{margin:0;}#mermaid-svg-8XBVNLZEgOgMwQ2G g.classGroup text{fill:#9370DB;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-8XBVNLZEgOgMwQ2G g.classGroup text .title{font-weight:bolder;}#mermaid-svg-8XBVNLZEgOgMwQ2G .cluster-label text{fill:#333;}#mermaid-svg-8XBVNLZEgOgMwQ2G .cluster-label span{color:#333;}#mermaid-svg-8XBVNLZEgOgMwQ2G .cluster-label span p{background-color:transparent;}#mermaid-svg-8XBVNLZEgOgMwQ2G .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-8XBVNLZEgOgMwQ2G .cluster text{fill:#333;}#mermaid-svg-8XBVNLZEgOgMwQ2G .cluster span{color:#333;}#mermaid-svg-8XBVNLZEgOgMwQ2G .nodeLabel,#mermaid-svg-8XBVNLZEgOgMwQ2G .edgeLabel{color:#131300;}#mermaid-svg-8XBVNLZEgOgMwQ2G .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-8XBVNLZEgOgMwQ2G .label text{fill:#131300;}#mermaid-svg-8XBVNLZEgOgMwQ2G .labelBkg{background:#ECECFF;}#mermaid-svg-8XBVNLZEgOgMwQ2G .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-8XBVNLZEgOgMwQ2G .classTitle{font-weight:bolder;}#mermaid-svg-8XBVNLZEgOgMwQ2G .node rect,#mermaid-svg-8XBVNLZEgOgMwQ2G .node circle,#mermaid-svg-8XBVNLZEgOgMwQ2G .node ellipse,#mermaid-svg-8XBVNLZEgOgMwQ2G .node polygon,#mermaid-svg-8XBVNLZEgOgMwQ2G .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-8XBVNLZEgOgMwQ2G .divider{stroke:#9370DB;stroke-width:1;}#mermaid-svg-8XBVNLZEgOgMwQ2G g.clickable{cursor:pointer;}#mermaid-svg-8XBVNLZEgOgMwQ2G g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-8XBVNLZEgOgMwQ2G g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-8XBVNLZEgOgMwQ2G .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-8XBVNLZEgOgMwQ2G .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-8XBVNLZEgOgMwQ2G .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-8XBVNLZEgOgMwQ2G .dashed-line{stroke-dasharray:3;}#mermaid-svg-8XBVNLZEgOgMwQ2G .dotted-line{stroke-dasharray:1 2;}#mermaid-svg-8XBVNLZEgOgMwQ2G #compositionStart,#mermaid-svg-8XBVNLZEgOgMwQ2G .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-8XBVNLZEgOgMwQ2G #compositionEnd,#mermaid-svg-8XBVNLZEgOgMwQ2G .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-8XBVNLZEgOgMwQ2G #dependencyStart,#mermaid-svg-8XBVNLZEgOgMwQ2G .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-8XBVNLZEgOgMwQ2G #dependencyStart,#mermaid-svg-8XBVNLZEgOgMwQ2G .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-8XBVNLZEgOgMwQ2G #extensionStart,#mermaid-svg-8XBVNLZEgOgMwQ2G .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-8XBVNLZEgOgMwQ2G #extensionEnd,#mermaid-svg-8XBVNLZEgOgMwQ2G .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-8XBVNLZEgOgMwQ2G #aggregationStart,#mermaid-svg-8XBVNLZEgOgMwQ2G .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-8XBVNLZEgOgMwQ2G #aggregationEnd,#mermaid-svg-8XBVNLZEgOgMwQ2G .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-8XBVNLZEgOgMwQ2G #lollipopStart,#mermaid-svg-8XBVNLZEgOgMwQ2G .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-8XBVNLZEgOgMwQ2G #lollipopEnd,#mermaid-svg-8XBVNLZEgOgMwQ2G .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-8XBVNLZEgOgMwQ2G .edgeTerminals{font-size:11px;line-height:initial;}#mermaid-svg-8XBVNLZEgOgMwQ2G .classTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-8XBVNLZEgOgMwQ2G .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-8XBVNLZEgOgMwQ2G .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-8XBVNLZEgOgMwQ2G :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 继承
继承
Animal
+virtual speak()
Dog
+speak()
Cat
+speak()
cpp
class Animal {
public:
virtual void speak() {}
virtual ~Animal() = default; // 基类析构必须 virtual
};
class Dog : public Animal { // public 继承 is-a
public:
void speak() override {}
};
C++ 特征:
- public 继承:is-a,可用父类指针指向子类,实现多态。
- protected/private 继承:不是 is-a,而是"用父类实现",实践中很少用,优先用组合替代。
- 基类析构函数必须是 virtual,否则 delete 父类指针时子类资源泄漏。
- 支持多重继承,菱形问题用虚继承解决。
实现(Realization / Implementation)
类实现接口,接口只定义行为契约,类提供具体实现。属于"can-do"关系。UML 符号:空心三角箭头 + 虚线,箭头指向接口。
#mermaid-svg-ZmK1TTjciBwLdvXm{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ZmK1TTjciBwLdvXm .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ZmK1TTjciBwLdvXm .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ZmK1TTjciBwLdvXm .error-icon{fill:#552222;}#mermaid-svg-ZmK1TTjciBwLdvXm .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ZmK1TTjciBwLdvXm .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ZmK1TTjciBwLdvXm .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ZmK1TTjciBwLdvXm .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ZmK1TTjciBwLdvXm .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ZmK1TTjciBwLdvXm .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ZmK1TTjciBwLdvXm .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ZmK1TTjciBwLdvXm .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ZmK1TTjciBwLdvXm .marker.cross{stroke:#333333;}#mermaid-svg-ZmK1TTjciBwLdvXm svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ZmK1TTjciBwLdvXm p{margin:0;}#mermaid-svg-ZmK1TTjciBwLdvXm g.classGroup text{fill:#9370DB;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-ZmK1TTjciBwLdvXm g.classGroup text .title{font-weight:bolder;}#mermaid-svg-ZmK1TTjciBwLdvXm .cluster-label text{fill:#333;}#mermaid-svg-ZmK1TTjciBwLdvXm .cluster-label span{color:#333;}#mermaid-svg-ZmK1TTjciBwLdvXm .cluster-label span p{background-color:transparent;}#mermaid-svg-ZmK1TTjciBwLdvXm .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ZmK1TTjciBwLdvXm .cluster text{fill:#333;}#mermaid-svg-ZmK1TTjciBwLdvXm .cluster span{color:#333;}#mermaid-svg-ZmK1TTjciBwLdvXm .nodeLabel,#mermaid-svg-ZmK1TTjciBwLdvXm .edgeLabel{color:#131300;}#mermaid-svg-ZmK1TTjciBwLdvXm .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-ZmK1TTjciBwLdvXm .label text{fill:#131300;}#mermaid-svg-ZmK1TTjciBwLdvXm .labelBkg{background:#ECECFF;}#mermaid-svg-ZmK1TTjciBwLdvXm .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-ZmK1TTjciBwLdvXm .classTitle{font-weight:bolder;}#mermaid-svg-ZmK1TTjciBwLdvXm .node rect,#mermaid-svg-ZmK1TTjciBwLdvXm .node circle,#mermaid-svg-ZmK1TTjciBwLdvXm .node ellipse,#mermaid-svg-ZmK1TTjciBwLdvXm .node polygon,#mermaid-svg-ZmK1TTjciBwLdvXm .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ZmK1TTjciBwLdvXm .divider{stroke:#9370DB;stroke-width:1;}#mermaid-svg-ZmK1TTjciBwLdvXm g.clickable{cursor:pointer;}#mermaid-svg-ZmK1TTjciBwLdvXm g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-ZmK1TTjciBwLdvXm g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-ZmK1TTjciBwLdvXm .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-ZmK1TTjciBwLdvXm .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-ZmK1TTjciBwLdvXm .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-ZmK1TTjciBwLdvXm .dashed-line{stroke-dasharray:3;}#mermaid-svg-ZmK1TTjciBwLdvXm .dotted-line{stroke-dasharray:1 2;}#mermaid-svg-ZmK1TTjciBwLdvXm #compositionStart,#mermaid-svg-ZmK1TTjciBwLdvXm .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-ZmK1TTjciBwLdvXm #compositionEnd,#mermaid-svg-ZmK1TTjciBwLdvXm .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-ZmK1TTjciBwLdvXm #dependencyStart,#mermaid-svg-ZmK1TTjciBwLdvXm .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-ZmK1TTjciBwLdvXm #dependencyStart,#mermaid-svg-ZmK1TTjciBwLdvXm .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-ZmK1TTjciBwLdvXm #extensionStart,#mermaid-svg-ZmK1TTjciBwLdvXm .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-ZmK1TTjciBwLdvXm #extensionEnd,#mermaid-svg-ZmK1TTjciBwLdvXm .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-ZmK1TTjciBwLdvXm #aggregationStart,#mermaid-svg-ZmK1TTjciBwLdvXm .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-ZmK1TTjciBwLdvXm #aggregationEnd,#mermaid-svg-ZmK1TTjciBwLdvXm .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-ZmK1TTjciBwLdvXm #lollipopStart,#mermaid-svg-ZmK1TTjciBwLdvXm .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-ZmK1TTjciBwLdvXm #lollipopEnd,#mermaid-svg-ZmK1TTjciBwLdvXm .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-ZmK1TTjciBwLdvXm .edgeTerminals{font-size:11px;line-height:initial;}#mermaid-svg-ZmK1TTjciBwLdvXm .classTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ZmK1TTjciBwLdvXm .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ZmK1TTjciBwLdvXm .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ZmK1TTjciBwLdvXm :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 实现
<<interface>>
Flyable
+fly()
Bird
+fly()
cpp
class Flyable { // C++ 的"接口"
public:
virtual void fly() = 0; // 纯虚函数
virtual ~Flyable() = default;
};
class Bird : public Flyable { // 实现接口
public:
void fly() override { /* ... */ }
};
C++ 特征:
- 用纯虚函数 = 0 定义接口。
- 含纯虚函数的类是抽象类,不能实例化。
- 子类必须实现所有纯虚函数才能实例化。
- C++ 没有 interface 关键字,接口就是"只有纯虚函数的抽象类"。
- 一个类可以继承多个接口,实现多种能力。
6种关系对比总表
| 关系 | UML 符号 | C++ 代码特征 | 所有权 | 生命周期 | 头文件 |
|---|---|---|---|---|---|
| 依赖 | 虚线箭头 | 参数/局部变量 | 无 | 临时 | 前向声明 |
| 关联 | 实线箭头 | 成员 T* / T& | 无 | 独立 | 前向声明 |
| 聚合 | 空心菱形 | vector<T*>/reference_wrapper<T*> | 无 | 独立 | 前向声明 |
| 组合 | 实心菱形 | T 值 / unique_ptr | 有 | 绑定 | 需完整定义 |
| 继承 | 实线空心三角 | class B : public A | - | - | 需完整定义 |
| 实现 | 虚线空心三角 | class B : public Interface | - | - | 需完整定义 |
软件设计原则
国内常说的"设计模式六大/七大原则",它包含了SOLID 五原则和LoD以及CRP两个补充原则:
#mermaid-svg-ZUW42Z0RX43IH1NX{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ZUW42Z0RX43IH1NX .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ZUW42Z0RX43IH1NX .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ZUW42Z0RX43IH1NX .error-icon{fill:#552222;}#mermaid-svg-ZUW42Z0RX43IH1NX .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ZUW42Z0RX43IH1NX .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ZUW42Z0RX43IH1NX .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ZUW42Z0RX43IH1NX .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ZUW42Z0RX43IH1NX .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ZUW42Z0RX43IH1NX .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ZUW42Z0RX43IH1NX .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ZUW42Z0RX43IH1NX .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ZUW42Z0RX43IH1NX .marker.cross{stroke:#333333;}#mermaid-svg-ZUW42Z0RX43IH1NX svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ZUW42Z0RX43IH1NX p{margin:0;}#mermaid-svg-ZUW42Z0RX43IH1NX .edge{stroke-width:3;}#mermaid-svg-ZUW42Z0RX43IH1NX .section--1 rect,#mermaid-svg-ZUW42Z0RX43IH1NX .section--1 path,#mermaid-svg-ZUW42Z0RX43IH1NX .section--1 circle,#mermaid-svg-ZUW42Z0RX43IH1NX .section--1 polygon,#mermaid-svg-ZUW42Z0RX43IH1NX .section--1 path{fill:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-ZUW42Z0RX43IH1NX .section--1 text{fill:#ffffff;}#mermaid-svg-ZUW42Z0RX43IH1NX .node-icon--1{font-size:40px;color:#ffffff;}#mermaid-svg-ZUW42Z0RX43IH1NX .section-edge--1{stroke:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-ZUW42Z0RX43IH1NX .edge-depth--1{stroke-width:17;}#mermaid-svg-ZUW42Z0RX43IH1NX .section--1 line{stroke:hsl(60, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-ZUW42Z0RX43IH1NX .disabled,#mermaid-svg-ZUW42Z0RX43IH1NX .disabled circle,#mermaid-svg-ZUW42Z0RX43IH1NX .disabled text{fill:lightgray;}#mermaid-svg-ZUW42Z0RX43IH1NX .disabled text{fill:#efefef;}#mermaid-svg-ZUW42Z0RX43IH1NX .section-0 rect,#mermaid-svg-ZUW42Z0RX43IH1NX .section-0 path,#mermaid-svg-ZUW42Z0RX43IH1NX .section-0 circle,#mermaid-svg-ZUW42Z0RX43IH1NX .section-0 polygon,#mermaid-svg-ZUW42Z0RX43IH1NX .section-0 path{fill:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-ZUW42Z0RX43IH1NX .section-0 text{fill:black;}#mermaid-svg-ZUW42Z0RX43IH1NX .node-icon-0{font-size:40px;color:black;}#mermaid-svg-ZUW42Z0RX43IH1NX .section-edge-0{stroke:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-ZUW42Z0RX43IH1NX .edge-depth-0{stroke-width:14;}#mermaid-svg-ZUW42Z0RX43IH1NX .section-0 line{stroke:hsl(240, 100%, 83.5294117647%);stroke-width:3;}#mermaid-svg-ZUW42Z0RX43IH1NX .disabled,#mermaid-svg-ZUW42Z0RX43IH1NX .disabled circle,#mermaid-svg-ZUW42Z0RX43IH1NX .disabled text{fill:lightgray;}#mermaid-svg-ZUW42Z0RX43IH1NX .disabled text{fill:#efefef;}#mermaid-svg-ZUW42Z0RX43IH1NX .section-1 rect,#mermaid-svg-ZUW42Z0RX43IH1NX .section-1 path,#mermaid-svg-ZUW42Z0RX43IH1NX .section-1 circle,#mermaid-svg-ZUW42Z0RX43IH1NX .section-1 polygon,#mermaid-svg-ZUW42Z0RX43IH1NX .section-1 path{fill:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-ZUW42Z0RX43IH1NX .section-1 text{fill:black;}#mermaid-svg-ZUW42Z0RX43IH1NX .node-icon-1{font-size:40px;color:black;}#mermaid-svg-ZUW42Z0RX43IH1NX .section-edge-1{stroke:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-ZUW42Z0RX43IH1NX .edge-depth-1{stroke-width:11;}#mermaid-svg-ZUW42Z0RX43IH1NX .section-1 line{stroke:hsl(260, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-ZUW42Z0RX43IH1NX .disabled,#mermaid-svg-ZUW42Z0RX43IH1NX .disabled circle,#mermaid-svg-ZUW42Z0RX43IH1NX .disabled text{fill:lightgray;}#mermaid-svg-ZUW42Z0RX43IH1NX .disabled text{fill:#efefef;}#mermaid-svg-ZUW42Z0RX43IH1NX .section-2 rect,#mermaid-svg-ZUW42Z0RX43IH1NX .section-2 path,#mermaid-svg-ZUW42Z0RX43IH1NX .section-2 circle,#mermaid-svg-ZUW42Z0RX43IH1NX .section-2 polygon,#mermaid-svg-ZUW42Z0RX43IH1NX .section-2 path{fill:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-ZUW42Z0RX43IH1NX .section-2 text{fill:#ffffff;}#mermaid-svg-ZUW42Z0RX43IH1NX .node-icon-2{font-size:40px;color:#ffffff;}#mermaid-svg-ZUW42Z0RX43IH1NX .section-edge-2{stroke:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-ZUW42Z0RX43IH1NX .edge-depth-2{stroke-width:8;}#mermaid-svg-ZUW42Z0RX43IH1NX .section-2 line{stroke:hsl(90, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-ZUW42Z0RX43IH1NX .disabled,#mermaid-svg-ZUW42Z0RX43IH1NX .disabled circle,#mermaid-svg-ZUW42Z0RX43IH1NX .disabled text{fill:lightgray;}#mermaid-svg-ZUW42Z0RX43IH1NX .disabled text{fill:#efefef;}#mermaid-svg-ZUW42Z0RX43IH1NX .section-3 rect,#mermaid-svg-ZUW42Z0RX43IH1NX .section-3 path,#mermaid-svg-ZUW42Z0RX43IH1NX .section-3 circle,#mermaid-svg-ZUW42Z0RX43IH1NX .section-3 polygon,#mermaid-svg-ZUW42Z0RX43IH1NX .section-3 path{fill:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-ZUW42Z0RX43IH1NX .section-3 text{fill:black;}#mermaid-svg-ZUW42Z0RX43IH1NX .node-icon-3{font-size:40px;color:black;}#mermaid-svg-ZUW42Z0RX43IH1NX .section-edge-3{stroke:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-ZUW42Z0RX43IH1NX .edge-depth-3{stroke-width:5;}#mermaid-svg-ZUW42Z0RX43IH1NX .section-3 line{stroke:hsl(120, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-ZUW42Z0RX43IH1NX .disabled,#mermaid-svg-ZUW42Z0RX43IH1NX .disabled circle,#mermaid-svg-ZUW42Z0RX43IH1NX .disabled text{fill:lightgray;}#mermaid-svg-ZUW42Z0RX43IH1NX .disabled text{fill:#efefef;}#mermaid-svg-ZUW42Z0RX43IH1NX .section-4 rect,#mermaid-svg-ZUW42Z0RX43IH1NX .section-4 path,#mermaid-svg-ZUW42Z0RX43IH1NX .section-4 circle,#mermaid-svg-ZUW42Z0RX43IH1NX .section-4 polygon,#mermaid-svg-ZUW42Z0RX43IH1NX .section-4 path{fill:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-ZUW42Z0RX43IH1NX .section-4 text{fill:black;}#mermaid-svg-ZUW42Z0RX43IH1NX .node-icon-4{font-size:40px;color:black;}#mermaid-svg-ZUW42Z0RX43IH1NX .section-edge-4{stroke:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-ZUW42Z0RX43IH1NX .edge-depth-4{stroke-width:2;}#mermaid-svg-ZUW42Z0RX43IH1NX .section-4 line{stroke:hsl(150, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-ZUW42Z0RX43IH1NX .disabled,#mermaid-svg-ZUW42Z0RX43IH1NX .disabled circle,#mermaid-svg-ZUW42Z0RX43IH1NX .disabled text{fill:lightgray;}#mermaid-svg-ZUW42Z0RX43IH1NX .disabled text{fill:#efefef;}#mermaid-svg-ZUW42Z0RX43IH1NX .section-5 rect,#mermaid-svg-ZUW42Z0RX43IH1NX .section-5 path,#mermaid-svg-ZUW42Z0RX43IH1NX .section-5 circle,#mermaid-svg-ZUW42Z0RX43IH1NX .section-5 polygon,#mermaid-svg-ZUW42Z0RX43IH1NX .section-5 path{fill:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-ZUW42Z0RX43IH1NX .section-5 text{fill:black;}#mermaid-svg-ZUW42Z0RX43IH1NX .node-icon-5{font-size:40px;color:black;}#mermaid-svg-ZUW42Z0RX43IH1NX .section-edge-5{stroke:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-ZUW42Z0RX43IH1NX .edge-depth-5{stroke-width:-1;}#mermaid-svg-ZUW42Z0RX43IH1NX .section-5 line{stroke:hsl(180, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-ZUW42Z0RX43IH1NX .disabled,#mermaid-svg-ZUW42Z0RX43IH1NX .disabled circle,#mermaid-svg-ZUW42Z0RX43IH1NX .disabled text{fill:lightgray;}#mermaid-svg-ZUW42Z0RX43IH1NX .disabled text{fill:#efefef;}#mermaid-svg-ZUW42Z0RX43IH1NX .section-6 rect,#mermaid-svg-ZUW42Z0RX43IH1NX .section-6 path,#mermaid-svg-ZUW42Z0RX43IH1NX .section-6 circle,#mermaid-svg-ZUW42Z0RX43IH1NX .section-6 polygon,#mermaid-svg-ZUW42Z0RX43IH1NX .section-6 path{fill:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-ZUW42Z0RX43IH1NX .section-6 text{fill:black;}#mermaid-svg-ZUW42Z0RX43IH1NX .node-icon-6{font-size:40px;color:black;}#mermaid-svg-ZUW42Z0RX43IH1NX .section-edge-6{stroke:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-ZUW42Z0RX43IH1NX .edge-depth-6{stroke-width:-4;}#mermaid-svg-ZUW42Z0RX43IH1NX .section-6 line{stroke:hsl(210, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-ZUW42Z0RX43IH1NX .disabled,#mermaid-svg-ZUW42Z0RX43IH1NX .disabled circle,#mermaid-svg-ZUW42Z0RX43IH1NX .disabled text{fill:lightgray;}#mermaid-svg-ZUW42Z0RX43IH1NX .disabled text{fill:#efefef;}#mermaid-svg-ZUW42Z0RX43IH1NX .section-7 rect,#mermaid-svg-ZUW42Z0RX43IH1NX .section-7 path,#mermaid-svg-ZUW42Z0RX43IH1NX .section-7 circle,#mermaid-svg-ZUW42Z0RX43IH1NX .section-7 polygon,#mermaid-svg-ZUW42Z0RX43IH1NX .section-7 path{fill:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-ZUW42Z0RX43IH1NX .section-7 text{fill:black;}#mermaid-svg-ZUW42Z0RX43IH1NX .node-icon-7{font-size:40px;color:black;}#mermaid-svg-ZUW42Z0RX43IH1NX .section-edge-7{stroke:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-ZUW42Z0RX43IH1NX .edge-depth-7{stroke-width:-7;}#mermaid-svg-ZUW42Z0RX43IH1NX .section-7 line{stroke:hsl(270, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-ZUW42Z0RX43IH1NX .disabled,#mermaid-svg-ZUW42Z0RX43IH1NX .disabled circle,#mermaid-svg-ZUW42Z0RX43IH1NX .disabled text{fill:lightgray;}#mermaid-svg-ZUW42Z0RX43IH1NX .disabled text{fill:#efefef;}#mermaid-svg-ZUW42Z0RX43IH1NX .section-8 rect,#mermaid-svg-ZUW42Z0RX43IH1NX .section-8 path,#mermaid-svg-ZUW42Z0RX43IH1NX .section-8 circle,#mermaid-svg-ZUW42Z0RX43IH1NX .section-8 polygon,#mermaid-svg-ZUW42Z0RX43IH1NX .section-8 path{fill:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-ZUW42Z0RX43IH1NX .section-8 text{fill:black;}#mermaid-svg-ZUW42Z0RX43IH1NX .node-icon-8{font-size:40px;color:black;}#mermaid-svg-ZUW42Z0RX43IH1NX .section-edge-8{stroke:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-ZUW42Z0RX43IH1NX .edge-depth-8{stroke-width:-10;}#mermaid-svg-ZUW42Z0RX43IH1NX .section-8 line{stroke:hsl(330, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-ZUW42Z0RX43IH1NX .disabled,#mermaid-svg-ZUW42Z0RX43IH1NX .disabled circle,#mermaid-svg-ZUW42Z0RX43IH1NX .disabled text{fill:lightgray;}#mermaid-svg-ZUW42Z0RX43IH1NX .disabled text{fill:#efefef;}#mermaid-svg-ZUW42Z0RX43IH1NX .section-9 rect,#mermaid-svg-ZUW42Z0RX43IH1NX .section-9 path,#mermaid-svg-ZUW42Z0RX43IH1NX .section-9 circle,#mermaid-svg-ZUW42Z0RX43IH1NX .section-9 polygon,#mermaid-svg-ZUW42Z0RX43IH1NX .section-9 path{fill:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-ZUW42Z0RX43IH1NX .section-9 text{fill:black;}#mermaid-svg-ZUW42Z0RX43IH1NX .node-icon-9{font-size:40px;color:black;}#mermaid-svg-ZUW42Z0RX43IH1NX .section-edge-9{stroke:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-ZUW42Z0RX43IH1NX .edge-depth-9{stroke-width:-13;}#mermaid-svg-ZUW42Z0RX43IH1NX .section-9 line{stroke:hsl(0, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-ZUW42Z0RX43IH1NX .disabled,#mermaid-svg-ZUW42Z0RX43IH1NX .disabled circle,#mermaid-svg-ZUW42Z0RX43IH1NX .disabled text{fill:lightgray;}#mermaid-svg-ZUW42Z0RX43IH1NX .disabled text{fill:#efefef;}#mermaid-svg-ZUW42Z0RX43IH1NX .section-10 rect,#mermaid-svg-ZUW42Z0RX43IH1NX .section-10 path,#mermaid-svg-ZUW42Z0RX43IH1NX .section-10 circle,#mermaid-svg-ZUW42Z0RX43IH1NX .section-10 polygon,#mermaid-svg-ZUW42Z0RX43IH1NX .section-10 path{fill:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-ZUW42Z0RX43IH1NX .section-10 text{fill:black;}#mermaid-svg-ZUW42Z0RX43IH1NX .node-icon-10{font-size:40px;color:black;}#mermaid-svg-ZUW42Z0RX43IH1NX .section-edge-10{stroke:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-ZUW42Z0RX43IH1NX .edge-depth-10{stroke-width:-16;}#mermaid-svg-ZUW42Z0RX43IH1NX .section-10 line{stroke:hsl(30, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-ZUW42Z0RX43IH1NX .disabled,#mermaid-svg-ZUW42Z0RX43IH1NX .disabled circle,#mermaid-svg-ZUW42Z0RX43IH1NX .disabled text{fill:lightgray;}#mermaid-svg-ZUW42Z0RX43IH1NX .disabled text{fill:#efefef;}#mermaid-svg-ZUW42Z0RX43IH1NX .section-root rect,#mermaid-svg-ZUW42Z0RX43IH1NX .section-root path,#mermaid-svg-ZUW42Z0RX43IH1NX .section-root circle,#mermaid-svg-ZUW42Z0RX43IH1NX .section-root polygon{fill:hsl(240, 100%, 46.2745098039%);}#mermaid-svg-ZUW42Z0RX43IH1NX .section-root text{fill:#ffffff;}#mermaid-svg-ZUW42Z0RX43IH1NX .section-root span{color:#ffffff;}#mermaid-svg-ZUW42Z0RX43IH1NX .section-2 span{color:#ffffff;}#mermaid-svg-ZUW42Z0RX43IH1NX .icon-container{height:100%;display:flex;justify-content:center;align-items:center;}#mermaid-svg-ZUW42Z0RX43IH1NX .edge{fill:none;}#mermaid-svg-ZUW42Z0RX43IH1NX .mindmap-node-label{dy:1em;alignment-baseline:middle;text-anchor:middle;dominant-baseline:middle;text-align:center;}#mermaid-svg-ZUW42Z0RX43IH1NX :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 国内设计原则
SOLID
SRP 单一职责
OCP 开闭
LSP 里氏替换
ISP 接口隔离
DIP 依赖倒置
补充
LoD 迪米特法则
CRP 合成复用
SRP 单一职责原则
含义:一个类只负责一件事,只有一个引起它变化的原因。
反例:一个类承担三种职责,任何一处变化都要改这个类。
cpp
class User {
public:
void save() {} // 数据持久化
void sendEmail() {} // 邮件发送
void generateReport() {} // 报表生成
};
正例:每个类只做一件事,修改互不影响。
cpp
class User {
public:
void save() {}
};
class EmailService {
public:
void sendEmail() {}
};
class ReportService {
public:
void generateReport() {}
};
判断标准:问"这个类有几个变化的理由?"多于一个就该拆。
OCP 开闭原则
含义:对扩展开放,对修改关闭。新增功能时尽量不改已有代码。
反例:每加一种形状都要改 area,违反开闭。
cpp
class Shape {
public:
double area(int type) {
if (type == 1) return 3.14 * r * r; // 圆
else if (type == 2) return w * h; // 矩形
// 新增形状要改这里
}
};
正例:新增形状只需加类,不改已有代码。
cpp
class Shape {
public:
virtual double area() const = 0;
};
class Circle : public Shape {
public:
double area() const override { return 3.14 * r * r; }
};
class Rectangle : public Shape {
public:
double area() const override { return w * h; }
};
实现手段:抽象类 + 多态。
LSP 里氏替换原则
含义:子类必须能替换父类,且行为不破坏程序正确性。不只看语法,还要看契约。
反例:正方形继承长方形
cpp
class Rectangle {
public:
virtual void setWidth(int w) { width = w; }
virtual void setHeight(int h) { height = h; }
int area() { return width * height; }
protected:
int width, height;
};
class Square : public Rectangle {
public:
void setWidth(int w) override { width = height = w; }
void setHeight(int h) override { width = height = h; }
};
用 Rectangle* 指向 Square 时:
cpp
Rectangle* r = new Square();
r->setWidth(5);
r->setHeight(10);
// 期望 area = 50,实际是 100
Square 改变了父类行为,违反 LSP。
正例:两者都继承 Shape,各自独立。
cpp
class Shape {
public:
virtual int area() const = 0;
};
class Rectangle : public Shape { /* ... */ };
class Square : public Shape { /* ... */ };
契约要求:
- 前置条件不能增强。
- 后置条件不能减弱。
- 不变量必须保持。
ISP 接口隔离原则
含义:客户端不应被迫依赖它不使用的方法。接口要小而专。
反例:胖接口,Robot 被迫实现不需要的方法。
cpp
class Worker {
public:
virtual void work() = 0;
virtual void eat() = 0;
virtual void sleep() = 0;
};
class Robot : public Worker {
public:
void work() override {}
void eat() override {} // 机器人不需要吃
void sleep() override {} // 机器人不需要睡
};
正例:拆成小接口
cpp
class Workable {
public:
virtual void work() = 0;
};
class Eatable {
public:
virtual void eat() = 0;
};
class Robot : public Workable {
public:
void work() override {}
};
class Human : public Workable, public Eatable {
public:
void work() override {}
void eat() override {}
};
每个类只实现需要的接口。
DIP 依赖倒置原则
含义:高层模块不依赖低层模块,两者都依赖抽象;抽象不依赖细节,细节依赖抽象。
反例:高层直接依赖具体类,换一种输入设备就要改 Computer。
cpp
class Keyboard {};
class Computer {
private:
Keyboard kb; // 直接依赖具体实现
};
正例:换设备不用改 Computer。
cpp
#include <iostream>
// 抽象接口
class InputDevice {
public:
virtual void input() = 0;
virtual ~InputDevice() = default;
};
// 具体实现:键盘
class Keyboard : public InputDevice {
public:
void input() override {
std::cout << "键盘输入\n";
}
};
// 具体实现:鼠标
class Mouse : public InputDevice {
public:
void input() override {
std::cout << "鼠标输入\n";
}
};
// 高层模块:依赖抽象,不依赖具体
class Computer {
private:
InputDevice* device; // 依赖抽象
public:
Computer(InputDevice* d) : device(d) {}
void use() {
device->input(); // 多态调用
}
};
int main() {
Keyboard kb;
Mouse m;
Computer c1(&kb); // 注入键盘
Computer c2(&m); // 注入鼠标
c1.use(); // 输出:键盘输入
c2.use(); // 输出:鼠标输入
return 0;
}
核心:针对接口编程,不针对实现编程。
LoD 迪米特法则(最少知识原则)
含义:一个对象应尽量少了解其他对象,只和直接朋友通信。
直接朋友:
- 成员对象。
- 方法参数。
- 方法内创建的对象。
- 自身的成员。
反例:链式调用,穿透多层。a 直接操作了 C,对 C 了解过多。
cpp
a.getB().getC().doSomething();
正例:让直接朋友代办
cpp
// B 提供方法封装对 C 的操作
a.doSomethingWithB();
// B 内部
void B::doSomethingWithB() {
c.doSomething();
}
好处:降低耦合,一个模块变化不影响其他模块。
注意:不是绝对禁止链式调用,而是避免暴露内部结构。
CRP 合成复用原则
含义:尽量使用合成/聚合,而不是继承。has-a 比 is-a 更灵活。
反例:用继承复用实现,Car 不是 Engine,用继承语义错误,耦合强。
cpp
class Engine {
public:
void start() {}
};
class Car : public Engine { // Car 是一种 Engine?不合理
public:
void drive() { start(); }
};
正例:用组合
cpp
class Engine {
public:
void start() {}
};
class Car {
private:
Engine engine; // Car 有一个 Engine
public:
void drive() { engine.start(); }
};
对比:
| 维度 | 继承 | 组合 |
|---|---|---|
| 关系 | is-a | has-a |
| 耦合 | 强 | 弱 |
| 灵活性 | 低(编译期确定) | 高(运行期可换) |
| 封装 | 破坏封装(子类可见父类实现) | 保持封装 |
注意:不是禁止继承。is-a 关系、需要多态时,继承仍然正确。
七条原则对比总表
| 原则 | 核心 | 关键词 | 手段 |
|---|---|---|---|
| SRP | 一个类一个职责 | 职责单一 | 拆分类 |
| OCP | 扩展开放,修改关闭 | 热插拔 | 抽象 + 多态 |
| LSP | 子类能替换父类 | 行为契约 | 不改变父类语义 |
| ISP | 接口小而专 | 不强迫依赖 | 拆分接口 |
| DIP | 依赖抽象 | 针对接口编程 | 依赖注入 |
| LoD | 少了解其他对象 | 最少知识 | 只和直接朋友通信 |
| CRP | 优先组合 | has-a 优于 is-a | 用成员代替继承 |
设计模式分类
23 种设计模式按目的分为三大类:创建型、结构型、行为型。这是 GoF的经典分法。
#mermaid-svg-qV9VpgXgktWcvDpp{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-qV9VpgXgktWcvDpp .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-qV9VpgXgktWcvDpp .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-qV9VpgXgktWcvDpp .error-icon{fill:#552222;}#mermaid-svg-qV9VpgXgktWcvDpp .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-qV9VpgXgktWcvDpp .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-qV9VpgXgktWcvDpp .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-qV9VpgXgktWcvDpp .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-qV9VpgXgktWcvDpp .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-qV9VpgXgktWcvDpp .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-qV9VpgXgktWcvDpp .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-qV9VpgXgktWcvDpp .marker{fill:#333333;stroke:#333333;}#mermaid-svg-qV9VpgXgktWcvDpp .marker.cross{stroke:#333333;}#mermaid-svg-qV9VpgXgktWcvDpp svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-qV9VpgXgktWcvDpp p{margin:0;}#mermaid-svg-qV9VpgXgktWcvDpp .edge{stroke-width:3;}#mermaid-svg-qV9VpgXgktWcvDpp .section--1 rect,#mermaid-svg-qV9VpgXgktWcvDpp .section--1 path,#mermaid-svg-qV9VpgXgktWcvDpp .section--1 circle,#mermaid-svg-qV9VpgXgktWcvDpp .section--1 polygon,#mermaid-svg-qV9VpgXgktWcvDpp .section--1 path{fill:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-qV9VpgXgktWcvDpp .section--1 text{fill:#ffffff;}#mermaid-svg-qV9VpgXgktWcvDpp .node-icon--1{font-size:40px;color:#ffffff;}#mermaid-svg-qV9VpgXgktWcvDpp .section-edge--1{stroke:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-qV9VpgXgktWcvDpp .edge-depth--1{stroke-width:17;}#mermaid-svg-qV9VpgXgktWcvDpp .section--1 line{stroke:hsl(60, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-qV9VpgXgktWcvDpp .disabled,#mermaid-svg-qV9VpgXgktWcvDpp .disabled circle,#mermaid-svg-qV9VpgXgktWcvDpp .disabled text{fill:lightgray;}#mermaid-svg-qV9VpgXgktWcvDpp .disabled text{fill:#efefef;}#mermaid-svg-qV9VpgXgktWcvDpp .section-0 rect,#mermaid-svg-qV9VpgXgktWcvDpp .section-0 path,#mermaid-svg-qV9VpgXgktWcvDpp .section-0 circle,#mermaid-svg-qV9VpgXgktWcvDpp .section-0 polygon,#mermaid-svg-qV9VpgXgktWcvDpp .section-0 path{fill:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-qV9VpgXgktWcvDpp .section-0 text{fill:black;}#mermaid-svg-qV9VpgXgktWcvDpp .node-icon-0{font-size:40px;color:black;}#mermaid-svg-qV9VpgXgktWcvDpp .section-edge-0{stroke:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-qV9VpgXgktWcvDpp .edge-depth-0{stroke-width:14;}#mermaid-svg-qV9VpgXgktWcvDpp .section-0 line{stroke:hsl(240, 100%, 83.5294117647%);stroke-width:3;}#mermaid-svg-qV9VpgXgktWcvDpp .disabled,#mermaid-svg-qV9VpgXgktWcvDpp .disabled circle,#mermaid-svg-qV9VpgXgktWcvDpp .disabled text{fill:lightgray;}#mermaid-svg-qV9VpgXgktWcvDpp .disabled text{fill:#efefef;}#mermaid-svg-qV9VpgXgktWcvDpp .section-1 rect,#mermaid-svg-qV9VpgXgktWcvDpp .section-1 path,#mermaid-svg-qV9VpgXgktWcvDpp .section-1 circle,#mermaid-svg-qV9VpgXgktWcvDpp .section-1 polygon,#mermaid-svg-qV9VpgXgktWcvDpp .section-1 path{fill:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-qV9VpgXgktWcvDpp .section-1 text{fill:black;}#mermaid-svg-qV9VpgXgktWcvDpp .node-icon-1{font-size:40px;color:black;}#mermaid-svg-qV9VpgXgktWcvDpp .section-edge-1{stroke:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-qV9VpgXgktWcvDpp .edge-depth-1{stroke-width:11;}#mermaid-svg-qV9VpgXgktWcvDpp .section-1 line{stroke:hsl(260, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-qV9VpgXgktWcvDpp .disabled,#mermaid-svg-qV9VpgXgktWcvDpp .disabled circle,#mermaid-svg-qV9VpgXgktWcvDpp .disabled text{fill:lightgray;}#mermaid-svg-qV9VpgXgktWcvDpp .disabled text{fill:#efefef;}#mermaid-svg-qV9VpgXgktWcvDpp .section-2 rect,#mermaid-svg-qV9VpgXgktWcvDpp .section-2 path,#mermaid-svg-qV9VpgXgktWcvDpp .section-2 circle,#mermaid-svg-qV9VpgXgktWcvDpp .section-2 polygon,#mermaid-svg-qV9VpgXgktWcvDpp .section-2 path{fill:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-qV9VpgXgktWcvDpp .section-2 text{fill:#ffffff;}#mermaid-svg-qV9VpgXgktWcvDpp .node-icon-2{font-size:40px;color:#ffffff;}#mermaid-svg-qV9VpgXgktWcvDpp .section-edge-2{stroke:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-qV9VpgXgktWcvDpp .edge-depth-2{stroke-width:8;}#mermaid-svg-qV9VpgXgktWcvDpp .section-2 line{stroke:hsl(90, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-qV9VpgXgktWcvDpp .disabled,#mermaid-svg-qV9VpgXgktWcvDpp .disabled circle,#mermaid-svg-qV9VpgXgktWcvDpp .disabled text{fill:lightgray;}#mermaid-svg-qV9VpgXgktWcvDpp .disabled text{fill:#efefef;}#mermaid-svg-qV9VpgXgktWcvDpp .section-3 rect,#mermaid-svg-qV9VpgXgktWcvDpp .section-3 path,#mermaid-svg-qV9VpgXgktWcvDpp .section-3 circle,#mermaid-svg-qV9VpgXgktWcvDpp .section-3 polygon,#mermaid-svg-qV9VpgXgktWcvDpp .section-3 path{fill:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-qV9VpgXgktWcvDpp .section-3 text{fill:black;}#mermaid-svg-qV9VpgXgktWcvDpp .node-icon-3{font-size:40px;color:black;}#mermaid-svg-qV9VpgXgktWcvDpp .section-edge-3{stroke:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-qV9VpgXgktWcvDpp .edge-depth-3{stroke-width:5;}#mermaid-svg-qV9VpgXgktWcvDpp .section-3 line{stroke:hsl(120, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-qV9VpgXgktWcvDpp .disabled,#mermaid-svg-qV9VpgXgktWcvDpp .disabled circle,#mermaid-svg-qV9VpgXgktWcvDpp .disabled text{fill:lightgray;}#mermaid-svg-qV9VpgXgktWcvDpp .disabled text{fill:#efefef;}#mermaid-svg-qV9VpgXgktWcvDpp .section-4 rect,#mermaid-svg-qV9VpgXgktWcvDpp .section-4 path,#mermaid-svg-qV9VpgXgktWcvDpp .section-4 circle,#mermaid-svg-qV9VpgXgktWcvDpp .section-4 polygon,#mermaid-svg-qV9VpgXgktWcvDpp .section-4 path{fill:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-qV9VpgXgktWcvDpp .section-4 text{fill:black;}#mermaid-svg-qV9VpgXgktWcvDpp .node-icon-4{font-size:40px;color:black;}#mermaid-svg-qV9VpgXgktWcvDpp .section-edge-4{stroke:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-qV9VpgXgktWcvDpp .edge-depth-4{stroke-width:2;}#mermaid-svg-qV9VpgXgktWcvDpp .section-4 line{stroke:hsl(150, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-qV9VpgXgktWcvDpp .disabled,#mermaid-svg-qV9VpgXgktWcvDpp .disabled circle,#mermaid-svg-qV9VpgXgktWcvDpp .disabled text{fill:lightgray;}#mermaid-svg-qV9VpgXgktWcvDpp .disabled text{fill:#efefef;}#mermaid-svg-qV9VpgXgktWcvDpp .section-5 rect,#mermaid-svg-qV9VpgXgktWcvDpp .section-5 path,#mermaid-svg-qV9VpgXgktWcvDpp .section-5 circle,#mermaid-svg-qV9VpgXgktWcvDpp .section-5 polygon,#mermaid-svg-qV9VpgXgktWcvDpp .section-5 path{fill:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-qV9VpgXgktWcvDpp .section-5 text{fill:black;}#mermaid-svg-qV9VpgXgktWcvDpp .node-icon-5{font-size:40px;color:black;}#mermaid-svg-qV9VpgXgktWcvDpp .section-edge-5{stroke:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-qV9VpgXgktWcvDpp .edge-depth-5{stroke-width:-1;}#mermaid-svg-qV9VpgXgktWcvDpp .section-5 line{stroke:hsl(180, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-qV9VpgXgktWcvDpp .disabled,#mermaid-svg-qV9VpgXgktWcvDpp .disabled circle,#mermaid-svg-qV9VpgXgktWcvDpp .disabled text{fill:lightgray;}#mermaid-svg-qV9VpgXgktWcvDpp .disabled text{fill:#efefef;}#mermaid-svg-qV9VpgXgktWcvDpp .section-6 rect,#mermaid-svg-qV9VpgXgktWcvDpp .section-6 path,#mermaid-svg-qV9VpgXgktWcvDpp .section-6 circle,#mermaid-svg-qV9VpgXgktWcvDpp .section-6 polygon,#mermaid-svg-qV9VpgXgktWcvDpp .section-6 path{fill:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-qV9VpgXgktWcvDpp .section-6 text{fill:black;}#mermaid-svg-qV9VpgXgktWcvDpp .node-icon-6{font-size:40px;color:black;}#mermaid-svg-qV9VpgXgktWcvDpp .section-edge-6{stroke:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-qV9VpgXgktWcvDpp .edge-depth-6{stroke-width:-4;}#mermaid-svg-qV9VpgXgktWcvDpp .section-6 line{stroke:hsl(210, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-qV9VpgXgktWcvDpp .disabled,#mermaid-svg-qV9VpgXgktWcvDpp .disabled circle,#mermaid-svg-qV9VpgXgktWcvDpp .disabled text{fill:lightgray;}#mermaid-svg-qV9VpgXgktWcvDpp .disabled text{fill:#efefef;}#mermaid-svg-qV9VpgXgktWcvDpp .section-7 rect,#mermaid-svg-qV9VpgXgktWcvDpp .section-7 path,#mermaid-svg-qV9VpgXgktWcvDpp .section-7 circle,#mermaid-svg-qV9VpgXgktWcvDpp .section-7 polygon,#mermaid-svg-qV9VpgXgktWcvDpp .section-7 path{fill:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-qV9VpgXgktWcvDpp .section-7 text{fill:black;}#mermaid-svg-qV9VpgXgktWcvDpp .node-icon-7{font-size:40px;color:black;}#mermaid-svg-qV9VpgXgktWcvDpp .section-edge-7{stroke:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-qV9VpgXgktWcvDpp .edge-depth-7{stroke-width:-7;}#mermaid-svg-qV9VpgXgktWcvDpp .section-7 line{stroke:hsl(270, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-qV9VpgXgktWcvDpp .disabled,#mermaid-svg-qV9VpgXgktWcvDpp .disabled circle,#mermaid-svg-qV9VpgXgktWcvDpp .disabled text{fill:lightgray;}#mermaid-svg-qV9VpgXgktWcvDpp .disabled text{fill:#efefef;}#mermaid-svg-qV9VpgXgktWcvDpp .section-8 rect,#mermaid-svg-qV9VpgXgktWcvDpp .section-8 path,#mermaid-svg-qV9VpgXgktWcvDpp .section-8 circle,#mermaid-svg-qV9VpgXgktWcvDpp .section-8 polygon,#mermaid-svg-qV9VpgXgktWcvDpp .section-8 path{fill:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-qV9VpgXgktWcvDpp .section-8 text{fill:black;}#mermaid-svg-qV9VpgXgktWcvDpp .node-icon-8{font-size:40px;color:black;}#mermaid-svg-qV9VpgXgktWcvDpp .section-edge-8{stroke:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-qV9VpgXgktWcvDpp .edge-depth-8{stroke-width:-10;}#mermaid-svg-qV9VpgXgktWcvDpp .section-8 line{stroke:hsl(330, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-qV9VpgXgktWcvDpp .disabled,#mermaid-svg-qV9VpgXgktWcvDpp .disabled circle,#mermaid-svg-qV9VpgXgktWcvDpp .disabled text{fill:lightgray;}#mermaid-svg-qV9VpgXgktWcvDpp .disabled text{fill:#efefef;}#mermaid-svg-qV9VpgXgktWcvDpp .section-9 rect,#mermaid-svg-qV9VpgXgktWcvDpp .section-9 path,#mermaid-svg-qV9VpgXgktWcvDpp .section-9 circle,#mermaid-svg-qV9VpgXgktWcvDpp .section-9 polygon,#mermaid-svg-qV9VpgXgktWcvDpp .section-9 path{fill:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-qV9VpgXgktWcvDpp .section-9 text{fill:black;}#mermaid-svg-qV9VpgXgktWcvDpp .node-icon-9{font-size:40px;color:black;}#mermaid-svg-qV9VpgXgktWcvDpp .section-edge-9{stroke:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-qV9VpgXgktWcvDpp .edge-depth-9{stroke-width:-13;}#mermaid-svg-qV9VpgXgktWcvDpp .section-9 line{stroke:hsl(0, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-qV9VpgXgktWcvDpp .disabled,#mermaid-svg-qV9VpgXgktWcvDpp .disabled circle,#mermaid-svg-qV9VpgXgktWcvDpp .disabled text{fill:lightgray;}#mermaid-svg-qV9VpgXgktWcvDpp .disabled text{fill:#efefef;}#mermaid-svg-qV9VpgXgktWcvDpp .section-10 rect,#mermaid-svg-qV9VpgXgktWcvDpp .section-10 path,#mermaid-svg-qV9VpgXgktWcvDpp .section-10 circle,#mermaid-svg-qV9VpgXgktWcvDpp .section-10 polygon,#mermaid-svg-qV9VpgXgktWcvDpp .section-10 path{fill:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-qV9VpgXgktWcvDpp .section-10 text{fill:black;}#mermaid-svg-qV9VpgXgktWcvDpp .node-icon-10{font-size:40px;color:black;}#mermaid-svg-qV9VpgXgktWcvDpp .section-edge-10{stroke:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-qV9VpgXgktWcvDpp .edge-depth-10{stroke-width:-16;}#mermaid-svg-qV9VpgXgktWcvDpp .section-10 line{stroke:hsl(30, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-qV9VpgXgktWcvDpp .disabled,#mermaid-svg-qV9VpgXgktWcvDpp .disabled circle,#mermaid-svg-qV9VpgXgktWcvDpp .disabled text{fill:lightgray;}#mermaid-svg-qV9VpgXgktWcvDpp .disabled text{fill:#efefef;}#mermaid-svg-qV9VpgXgktWcvDpp .section-root rect,#mermaid-svg-qV9VpgXgktWcvDpp .section-root path,#mermaid-svg-qV9VpgXgktWcvDpp .section-root circle,#mermaid-svg-qV9VpgXgktWcvDpp .section-root polygon{fill:hsl(240, 100%, 46.2745098039%);}#mermaid-svg-qV9VpgXgktWcvDpp .section-root text{fill:#ffffff;}#mermaid-svg-qV9VpgXgktWcvDpp .section-root span{color:#ffffff;}#mermaid-svg-qV9VpgXgktWcvDpp .section-2 span{color:#ffffff;}#mermaid-svg-qV9VpgXgktWcvDpp .icon-container{height:100%;display:flex;justify-content:center;align-items:center;}#mermaid-svg-qV9VpgXgktWcvDpp .edge{fill:none;}#mermaid-svg-qV9VpgXgktWcvDpp .mindmap-node-label{dy:1em;alignment-baseline:middle;text-anchor:middle;dominant-baseline:middle;text-align:center;}#mermaid-svg-qV9VpgXgktWcvDpp :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 23种设计模式
创建型 5
单例 Singleton
工厂方法 Factory Method
抽象工厂 Abstract Factory
建造者 Builder
原型 Prototype
结构型 7
适配器 Adapter
桥接 Bridge
组合 Composite
装饰器 Decorator
外观 Facade
享元 Flyweight
代理 Proxy
行为型 11
责任链 Chain of Responsibility
命令 Command
解释器 Interpreter
迭代器 Iterator
中介者 Mediator
备忘录 Memento
观察者 Observer
状态 State
策略 Strategy
模板方法 Template Method
访问者 Visitor
创建型(5 种):解决"对象怎么创建"
关注点:对象的创建过程,把创建和使用分离。
为什么单独一类:对象的创建方式多样,直接 new 会导致耦合。创建型模式把"创建什么、怎么创建、何时创建"定义出来,让系统不依赖具体类。
| 模式 | 解决的问题 |
|---|---|
| 单例 | 全局只有一个实例 |
| 工厂方法 | 子类决定创建哪种对象 |
| 抽象工厂 | 创建一系列相关对象 |
| 建造者 | 分步构建复杂对象 |
| 原型 | 通过克隆创建对象 |
结构型(7 种):解决"对象怎么组合"
关注点:类或对象的组合方式,形成更大的结构。
为什么单独一类:系统由许多类组成,如何把它们组装成灵活、可复用的结构,是独立的问题。结构型模式关注类与类、对象与对象之间的关系。
| 模式 | - 解决的问题 |
|---|---|
| 适配器 | - 接口不兼容时转换 |
| 桥接 | -抽象与实现分离 |
| 组合 | - 树形结构统一处理 |
| 装饰器 | -动态添加功能 |
| 外观 | -简化子系统接口 |
| 享元 | - 共享细粒度对象 |
| 代理 | - 控制对象访问 |
行为型(11 种):解决"对象怎么交互"
关注点:对象之间的职责分配和通信。
为什么单独一类:对象不是孤立的,它们要协作。行为型模式关注对象之间的算法和职责分配,让交互更灵活、耦合更低。
| 模式 | 解决的问题 |
|---|---|
| 责任链 | 请求沿链传递 |
| 命令 | 把请求封装成对象 |
| 解释器 | 定义语言文法 |
| 迭代器 | 顺序访问集合 |
| 中介者 | 减少对象间直接通信 |
| 备忘录 | 保存和恢复状态 |
| 观察者 | 一对多依赖通知 |
| 状态 | 状态改变行为 |
| 策略 | 算法可互换 |
| 模板方法 | 算法骨架固定,步骤可变 |
| 访问者 | 在不改类的前提下加操作 |
十六宿舍 原创作品,转载必须标注原文链接。
©2023 Yang Li. All rights reserved.
欢迎关注 『十六宿舍』,大家喜欢的话,给个👍,更多关于嵌入式相关技术的内容持续更新中。