# 综合学习记录：设计模式、数据结构与系统知识汇总

> 发布时间: 2026-08-02 18:28

# Learn — 综合学习记录

一份汇总了设计模式、数据结构、Markdown、SQL、Git、C# 基础、计算机系统、dll、结构化开发方法、算法设计与分析的综合学习笔记。

## 设计模式

### 原则

#### 总纲

* 开闭原则：一个软件实体，如类、模块、函数应该对**扩展开放，修改封闭**

#### 六大原则

1. **单一职责原则**：一个类应该只有一个发生变化的原因
2. **里氏替换原则**：所有使用基类的地方必须能透明的使用其子类对象
3. **依赖倒置原则**：上层模块不应依赖于底层模块，他们都应该依赖于抽象；抽象不应依赖于细节，细节应依赖于抽象
4. **接口隔离原则**：客户端不应该依赖于他不需要的接口；类间的依赖关系应该建立在最小的接口上
5. **迪米特法则（最少知道原则）**：只与你的朋友交谈，不和陌生人说话；出现为成员变量、方法参数、方法返回值的类为直接朋友
6. **合成复用原则**：尽量使用对象的组合/聚合，而不是继承达到软件复用的目的

> 继承复用破坏封装性（白箱复用）、耦合度高、灵活性低；组合/聚合复用维持封装性（黑箱复用）、耦合度低、可动态复用。

### 创建型

- **工厂模式（Factory）**：通过继承产品的基类实现产品多态，封装工厂的产品创建函数制造唯一接口。存在问题：只能生成继承于 Product 的产品
- **抽象工厂模式（AbstractFactory）**：以工厂模式为基础，进一步对工厂抽象
- **单例模式（Singleton）**：一次创建多次使用，分懒汉模式和饿汉模式
- **建造者模式（Builder）**：如同生产线，一个 builder 关注产品的每一道工序，通过修改工序输出不同产品
- **原型模式（Prototype）**：通过 Clone 创建新数据，保证原有数据不被污染

### 结构型

- **适配器模式（Adapter）**：将一个类的接口转换成客户希望的另一个接口，使接口不兼容的类可以一起工作
- **装饰器模式（Decorator）**：动态给一个对象添加额外职责
- **代理模式（Proxy）**：为其他对象提供代理以控制对这个对象的访问
- **外观模式（Facade）**：为子系统的一组接口提供一致的界面，使子系统更容易使用
- **桥接模式（Bridge）**：将抽象部分与其实现部分分离，使它们可以独立变化
- **组合模式（Composite）**：将对象组合成树型结构表示"部分-整体"层次，对单个对象和组合对象使用一致，如 Unity 的 Component
- **享元模式（FlyWeight）**：运用共享技术支持大量细粒度对象，如对象池

### 行为型

- **策略模式（Strategy）**：定义一系列算法并封装，可相互替换，算法独立于使用它们的客户
- **模板方法模式（Template）**：定义算法骨架，将一些步骤延迟到子类，如模板类
- **观察者模式（Observer）**：对象间一对多依赖，状态改变时所有依赖者收到通知自动更新（事件与委托）
- **迭代子模式（Iterator）**：顺序访问聚合对象中的各元素，不暴露内部表示
- **责任链模式（Chain of Responsibility）**：多个对象有机会处理请求，连成链传递直到有对象处理
- **命令模式（Command）**：将请求封装为对象，可参数化、排队、记录日志、支持撤销
- **备忘录模式（Memento）**：不破坏封装的前提下捕获并保存对象内部状态，可恢复到原状态
- **状态模式（State）**：允许对象在内部状态改变时改变其行为
- **访问者模式（Visitor）**：不改变元素类的前提下定义作用于元素的新操作
- **中介者模式（Mediator）**：用一个中介对象封装一系列对象交互，使各对象耦合松散
- **解释器模式（Interpreter）**：定义语言的文法表示和解释器，用表示来解释语言中的句子

## 数据结构

### 排序算法

- **直接插入排序**：逐一遍历，低者前移，高者向后
- **冒泡排序**：相邻比较，顺降逆升，无交换提前结束
- **简单选择排序**：逐个寻最小
- **希尔排序（缩小增量排序）**：指定增量，隔数比较互换，逐步缩小增量值直至为一
- **快速排序**：来回扫描，低者前移，高者向后，用栈模拟递归
- 归并排序 / 堆排序 / 计数排序 / 桶排序

### 查找算法

**静态查找表**：
- **顺序查找**：从左到右依次匹配键值。时间 O(n)，空间 O(1)
- **二分查找**：只针对有序查找，从中间值开始。时间 O(logn)，空间 O(1)
- **插值查找**：针对顺序查找等差分段，根据待查值自适应中间值。时间 O(log(logn))~O(n)

**动态查找表**：二叉树查找、哈希查找

## Markdown

- **目录生成**：使用 `[TOC]`（github 无法识别）；或用插件 Markdown All in One 按 shift+ctrl+p 输入 `Markdown All in One: Create Table of Contents`
- **引用图片**：`![这是图片](/assets/img/philly-magic-garden.jpg "Magic Gardens")`

## PlantUML

### 类图六种基本关系

- **泛化**：继承关系，子类指向父类，用 `<|--` 表示
- **实现**：类指向接口，用 `<|..` 表示
- **关联**：拥有关系，单向 `<--`，双向 `--`
- **组合**：整体与部分，不可分离，整体指向部分，用 `*--` 表示
- **聚合**：整体与部分，可单独存在，整体指向部分，用 `o--` 表示
- **依赖**：使用关系（局部变量/方法参数），依赖者指向被依赖者，用 `<..` 表示

### 思维导图

plantuml 插件支持 mindmap，用 `@startmindmap` 和 `@endmindmap` 包裹代码块

## SQL

### 基础语法

```SQL
--添加新字段（注意：MySQL 8.0.17 起不推荐 INT(11) 的 display width）
ALTER TABLE test.my_collection ADD ID INT DEFAULT 0 FIRST;
--删除字段
ALTER TABLE test.my_collection DROP ID;
--删除索引
ALTER TABLE test.my_collection DROP INDEX ID;
--添加索引
ALTER TABLE test.my_collection ADD INDEX SelectID (ID);
```

### 存储过程

```SQL
delimiter $$ -- 将结束符号从分号临时改为$$
CREATE PROCEDURE CREATEDATA() -- 创建存储过程
BEGIN
declare _ID INT; -- 声明变量
SET _ID = 0;
while _ID < 1000 do
insert into test.my_collection (ID,param) values (_ID,_ID);
set _ID=_ID+1;
end while;
END$$
delimiter ; -- 恢复结束符号

call CREATEDATA(); -- 调用
```

## Git

### 初始配置

```
git config user.name "name"
git config user.email XX@XX.xom
git config http.proxy Ip:Port
```

### 提交

```
git add .
git commit -m "描述"
git push
git pull
git status / git diff
git branch
git remote add main git@github.com:xx/xx.git 
// 版本回退
git reset HEAD^        // 全回退
git reset HEAD^ [文件]  // 指定文件回退
git reset HEAD^n        // 回退n个版本
git reset 版本号
// pull 无法拉取时
git fetch --all
git reset --hard [库名]
git pull
```

## C# 基础

### 读写

* 文件读写：FileStream 类与 File 类搭配使用

### 类型参数约束

* 泛型类型和方法声明可以通过 type_parameter_constraints_clause 指定类型参数约束
* 使用 where 加约束类型，如 `where T:new()`
* 需要带参构造时：
```c#
(T)System.Activator.CreateInstance(typeof(T),actData)
```

### 方法参数

* 使用 params 修饰方法中不定长的参数列表

## 计算机系统

### CPU 组成

```plantuml
node ALU [
	ALU
	---
	算数逻辑单元
	]
node AC [
	AC
	--
	累加寄存器
]
node DR [
	DR
	--
	数据缓冲寄存器
]
node PSW [
	PSW
	---
	状态条件寄存器
]
node IR [
	IR
	--
	指令寄存器
]
node PC [
	PC
	---
	程序计数器
]
node AR [
	AR
	--
	地址寄存器
]
node ID [
	ID
	--
	指令译码器
]
ALU --> AC
AC --> DR
ALU -l-> PSW
DR -R-> IR
IR -> ID
IR --> PC
IR --> AR
PC -> AR
```

### 指令集

```plantuml
@startmindmap
* 指令集体系
** 按暂存机制分类
*** 堆栈(stack)
*** 累加器(Accumulator)
*** 寄存器组(a set of Registers)
** 发展途径
*** CISC(复杂指令集计算机)
*** RISC(精简指令集计算机)
**** 超流水线(Super Pipe Line)
**** 超标量(Super Scalar)
**** 超长指令字(Very Long Instruction World,VLIW)
@endmindmap
```

### 存储系统

```plantuml
@startmindmap
* 存储系统
** 存储器位置分类
*** 内存
**** 虚拟存储器
***** 对主存的抽象
*** 外存
**** 磁表面存储器
***** 磁盘
****** 格式化容量
****** 非格式化容量
**** 光盘存储器
**** 固态硬盘
***** 采用闪存(FLASH芯片)作为存储介质
***** 采用DRAM作为存储介质
** 构成材料分类
*** 磁存储器
*** 半导体存储器
**** 高速缓存(Cache)
***** 特点
****** 位于CPU与主存之间
****** 容量一般在几字节到几兆字节
****** 速度比主存快5~10倍
****** 由快速半导体存储器构成
****** 其内容主要是主存局部域的副本，对程序员透明
***** 地址映像方法
****** 直接映像，主存的块与Cache块的对应关系固定
****** 全相联映像，主存任一块可调入Cache任一块空间
****** 组相联映射，组间直接映像，组内全相联映像
***** 替换算法
****** 随机替换算法
****** 先进先出算法
****** 近期最少使用算法
****** 优化替换算法
***** Cache性能分析
****** 等效加权平均访问时间
****** 不命中时才启动主存的时间
***** 多级Cache
*** 光存储器
** 工作方式分类
*** 读写存储器
*** 只读存储器(RAM)
*** 固定只读存储器(ROM)
*** 可编程的只读存储器(PROM)
*** 可擦除可编程的只读存储器(EPROM)
*** 电擦除可编程只读存储器(EEPROM)
*** 闪速存储器
** 按访问方式分类
*** 按地址访问的存储器
*** 按内容访问的存储器
**** 相联存储器
***** 把数据或数据的某一部分作为关键字，按顺序写入信息，读出时并行地将该关键字与存储器中的每一个单元进行比较，找出所有与关键字相同的数据字，适合数据的检索与更新
** 按寻址方式分类
*** 随机存储器(RAM)
*** 顺序存储器(SAM)
*** 直接存储器(DAM)
** 磁盘阵列技术
** 存储域网络
@endmindmap
```

### 原码反码补码

- **机器数**：二进制表示的数，无正负之分，计算机用最高位表示正负
- **真值**：带符号位的机器数表示的值
- **原码**：带符号位的机器数
- **反码**：正数反码是本身，负数反码符号位不变、其他位取反
- **补码**：正数补码是本身，负数补码是反码+1

## dll

### 关于 C# 调用 C++ 编译的 dll 库实操

**托管代码与非托管代码**：托管代码运行在 CLR 上，跨平台强，享受垃圾回收等服务；非托管代码是机器语言，依赖语言和环境，需自行管理

**DllImport**：C# 调用非托管动态链接库静态入口点的特性化方法；关键字段 EntryPoint 明确动态库函数名；使用 System.Runtime.InteropServices 命名空间

**__declspec(dllexport)**：C++ 中导出 dll 数据的关键字，规范输出函数名，避免调用时找不到函数

**遇到的问题**：
1. C# 找不到 dll 函数，原因是缺少 `__declspec(dllexport)`
2. dll 编译找不到预编译文件，不使用预编译头解决
3. 多处 cpp 引用 pch.h 报重复声明，去掉引用解决
4. dll 调试：将命令路径改为执行 exe 路径，dll 工程设为首选项

## 结构化开发方法

### 系统分析

```plantuml
@startmindmap
* 系统分析
** 目的与任务
*** 分析现状
**** 流程合理性
**** 组织管理之间的流程与关系
**** 原有模式的改进及新系统引入的合理性
**** 出具系统方案说明书
** 主要步骤
*** 当前系统的物理模型
*** 当前系统的逻辑模型
*** 目标系统的逻辑模型
*** 目标系统的物理模型
@endmindmap
```

### 系统设计

```plantuml
@startmindmap
* 系统设计
** 基本原理
*** 抽象
*** 模块化
*** 信息隐蔽
*** 模块独立
**** 耦合
***** 无直接耦合
***** 数据耦合
***** 标记耦合
***** 控制耦合
***** 外部耦合
***** 公共耦合
***** 内容耦合
**** 内聚
***** 偶然内聚
***** 逻辑内聚
***** 时间内聚
***** 通信内聚
***** 顺序内聚
***** 功能内聚
@endmindmap
```

### 系统总体结构

```plantuml
@startmindmap
* 系统总体结构
** 设计原则
*** 分解协调原则
*** 自顶向下原则
*** 信息隐蔽、抽象原则
*** 一致性原则
*** 明确性原则
*** 高内聚低耦合
*** 模块扇入系数和扇出系数要合理
*** 模块的规模适当
** 子系统划分
*** 原则
**** 相对独立
**** 依耐性小
**** 数据冗余小
**** 考虑今后管理发展的需要
**** 便于分阶段实现
**** 考虑各类资源的合理运用
*** 子系统结构
**** 如何划分模块
**** 数据传递及调用关系
**** 评价并改进模块质量
**** 从数据流图导出模块结构图
@endmindmap
```

### 模块结构设计

```plantuml
@startmindmap
* 模块结构
** 概念
*** 输入输出
*** 处理功能
*** 内部数据
*** 程序代码
** 模块结构图
*** 独立性
*** 只有上下级关系，不存在横向联系
*** 树状结构，不存在交叉网络
*** 归档
@endmindmap
```

## 算法设计与分析

### 动态规划

**核心理念**：
1. 找出最优解的性质，并刻画其特征
2. 递归的定义最优解的值
3. 以自底而上的方式计算出最优解
4. 根据计算最优值时得到的信息，构造一个最优解

## TODO

* 基础数据结构 图