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

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

基础语法

--添加新字段(注意: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 组成

PlantUML 图表

指令集

PlantUML 图表

存储系统

PlantUML 图表

原码反码补码

  • 机器数:二进制表示的数,无正负之分,计算机用最高位表示正负
  • 真值:带符号位的机器数表示的值
  • 原码:带符号位的机器数
  • 反码:正数反码是本身,负数反码符号位不变、其他位取反
  • 补码:正数补码是本身,负数补码是反码+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 图表

系统设计

PlantUML 图表

系统总体结构

PlantUML 图表

模块结构设计

PlantUML 图表

算法设计与分析

动态规划

核心理念

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

TODO

  • 基础数据结构 图
📥 导出 Markdown