综合学习记录:设计模式、数据结构与系统知识汇总
Learn — 综合学习记录
一份汇总了设计模式、数据结构、Markdown、SQL、Git、C# 基础、计算机系统、dll、结构化开发方法、算法设计与分析的综合学习笔记。
设计模式
原则
总纲
- 开闭原则:一个软件实体,如类、模块、函数应该对扩展开放,修改封闭
六大原则
- 单一职责原则:一个类应该只有一个发生变化的原因
- 里氏替换原则:所有使用基类的地方必须能透明的使用其子类对象
- 依赖倒置原则:上层模块不应依赖于底层模块,他们都应该依赖于抽象;抽象不应依赖于细节,细节应依赖于抽象
- 接口隔离原则:客户端不应该依赖于他不需要的接口;类间的依赖关系应该建立在最小的接口上
- 迪米特法则(最少知道原则):只与你的朋友交谈,不和陌生人说话;出现为成员变量、方法参数、方法返回值的类为直接朋友
- 合成复用原则:尽量使用对象的组合/聚合,而不是继承达到软件复用的目的
继承复用破坏封装性(白箱复用)、耦合度高、灵活性低;组合/聚合复用维持封装性(黑箱复用)、耦合度低、可动态复用。
创建型
- 工厂模式(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 - 引用图片:

PlantUML
类图六种基本关系
- 泛化:继承关系,子类指向父类,用
<|--表示 - 实现:类指向接口,用
<|..表示 - 关联:拥有关系,单向
<--,双向-- - 组合:整体与部分,不可分离,整体指向部分,用
*--表示 - 聚合:整体与部分,可单独存在,整体指向部分,用
o--表示 - 依赖:使用关系(局部变量/方法参数),依赖者指向被依赖者,用
<..表示
思维导图
plantuml 插件支持 mindmap,用 @startmindmap 和 @endmindmap 包裹代码块
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);
存储过程
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() - 需要带参构造时:
(T)System.Activator.CreateInstance(typeof(T),actData)
方法参数
- 使用 params 修饰方法中不定长的参数列表
计算机系统
CPU 组成
指令集
存储系统
原码反码补码
- 机器数:二进制表示的数,无正负之分,计算机用最高位表示正负
- 真值:带符号位的机器数表示的值
- 原码:带符号位的机器数
- 反码:正数反码是本身,负数反码符号位不变、其他位取反
- 补码:正数补码是本身,负数补码是反码+1
dll
关于 C# 调用 C++ 编译的 dll 库实操
托管代码与非托管代码:托管代码运行在 CLR 上,跨平台强,享受垃圾回收等服务;非托管代码是机器语言,依赖语言和环境,需自行管理
DllImport:C# 调用非托管动态链接库静态入口点的特性化方法;关键字段 EntryPoint 明确动态库函数名;使用 System.Runtime.InteropServices 命名空间
__declspec(dllexport):C++ 中导出 dll 数据的关键字,规范输出函数名,避免调用时找不到函数
遇到的问题:
- C# 找不到 dll 函数,原因是缺少
__declspec(dllexport) - dll 编译找不到预编译文件,不使用预编译头解决
- 多处 cpp 引用 pch.h 报重复声明,去掉引用解决
- dll 调试:将命令路径改为执行 exe 路径,dll 工程设为首选项
结构化开发方法
系统分析
系统设计
系统总体结构
模块结构设计
算法设计与分析
动态规划
核心理念:
- 找出最优解的性质,并刻画其特征
- 递归的定义最优解的值
- 以自底而上的方式计算出最优解
- 根据计算最优值时得到的信息,构造一个最优解
TODO
- 基础数据结构 图