其他-重新学习-20260407

4 阅读15分钟

其他

一、设计模式

1. 设计模式基础与原则

问题:什么是设计模式?设计模式的作用是什么?设计模式的原则有哪些?设计模式的分类有哪些?设计模式的应用场景有哪些?

答案

设计模式定义:设计模式是在软件设计过程中,针对特定场景的通用、可复用的解决方案。它是一套被反复使用、多数人知晓、经过分类编目的代码设计经验的总结。

设计模式的作用

  1. 提高代码复用性:经过验证的解决方案,可直接使用
  2. 增强代码可维护性:规范化代码结构,易于理解和修改
  3. 提高代码灵活性:支持变化,便于扩展和修改
  4. 促进团队协作:统一的设计语言和思路
  5. 降低系统复杂度:将复杂问题分解为简单模式组合
  6. 提高开发效率:避免重复设计,专注业务实现

设计模式七大原则(SOLID + 组合优于继承)

  1. 单一职责原则(SRP):一个类应该只有一个引起变化的原因

    // 违反SRP
    class UserManager {
      saveUser(user) { /* 保存用户 */ }
      sendEmail(user) { /* 发送邮件 */ }
      validateUser(user) { /* 验证用户 */ }
    }
    
    // 遵循SRP
    class UserRepository {
      saveUser(user) { /* 保存用户 */ }
    }
    
    class EmailService {
      sendEmail(user) { /* 发送邮件 */ }
    }
    
    class UserValidator {
      validateUser(user) { /* 验证用户 */ }
    }
    
  2. 开闭原则(OCP):软件实体应对扩展开放,对修改关闭

    // 违反OCP
    class ShapeCalculator {
      calculateArea(shape) {
        if (shape.type === 'circle') {
          return Math.PI * shape.radius * shape.radius;
        } else if (shape.type === 'rectangle') {
          return shape.width * shape.height;
        }
        // 添加新形状需要修改代码
      }
    }
    
    // 遵循OCP
    abstract class Shape {
      abstract calculateArea();
    }
    
    class Circle extends Shape {
      constructor(radius) {
        super();
        this.radius = radius;
      }
      
      calculateArea() {
        return Math.PI * this.radius * this.radius;
      }
    }
    
    class Rectangle extends Shape {
      constructor(width, height) {
        super();
        this.width = width;
        this.height = height;
      }
      
      calculateArea() {
        return this.width * this.height;
      }
    }
    
    class ShapeCalculator {
      calculateArea(shape) {
        return shape.calculateArea(); // 无需修改
      }
    }
    
  3. 里氏替换原则(LSP):子类必须能够替换其基类,且不改变程序正确性

    // 违反LSP
    class Bird {
      fly() {
        console.log('飞');
      }
    }
    
    class Penguin extends Bird {
      fly() {
        throw new Error('企鹅不能飞'); // 子类不能替换父类
      }
    }
    
    // 遵循LSP
    class Bird {
      move() {
        console.log('移动');
      }
    }
    
    class FlyingBird extends Bird {
      fly() {
        console.log('飞');
      }
    }
    
    class Penguin extends Bird {
      swim() {
        console.log('游泳');
      }
    }
    
  4. 接口隔离原则(ISP):客户端不应依赖它不需要的接口

    // 违反ISP
    interface Worker {
      work();
      eat();
      sleep();
    }
    
    class Robot implements Worker {
      work() { /* 工作 */ }
      eat() { /* 不需要 */ }
      sleep() { /* 不需要 */ }
    }
    
    // 遵循ISP
    interface Workable {
      work();
    }
    
    interface Eatable {
      eat();
    }
    
    interface Sleepable {
      sleep();
    }
    
    class Robot implements Workable {
      work() { /* 工作 */ }
    }
    
    class Human implements Workable, Eatable, Sleepable {
      work() { /* 工作 */ }
      eat() { /* 吃 */ }
      sleep() { /* 睡 */ }
    }
    
  5. 依赖倒置原则(DIP):高层模块不应依赖低层模块,两者都应依赖抽象

    // 违反DIP
    class UserService {
      private userRepository = new MySQLUserRepository(); // 依赖具体实现
      
      getUser(id) {
        return this.userRepository.getUser(id);
      }
    }
    
    // 遵循DIP
    interface UserRepository {
      getUser(id);
    }
    
    class MySQLUserRepository implements UserRepository {
      getUser(id) {
        // MySQL实现
      }
    }
    
    class UserService {
      constructor(private userRepository: UserRepository) {} // 依赖抽象
      
      getUser(id) {
        return this.userRepository.getUser(id);
      }
    }
    
  6. 迪米特法则(Law of Demeter):一个对象应尽可能少地了解其他对象

    // 违反迪米特法则
    class User {
      constructor(private wallet: Wallet) {}
      
      getBalance() {
        return this.wallet.getMoney().getAmount(); // 链式调用其他对象
      }
    }
    
    // 遵循迪米特法则
    class User {
      constructor(private wallet: Wallet) {}
      
      getBalance() {
        return this.wallet.getBalance(); // 只与直接朋友交互
      }
    }
    
    class Wallet {
      constructor(private money: Money) {}
      
      getBalance() {
        return this.money.getAmount();
      }
    }
    
  7. 组合优于继承:优先使用组合而非继承来扩展功能

    // 使用继承
    class Bird {
      fly() {
        console.log('飞');
      }
    }
    
    class Penguin extends Bird {
      // 企鹅不能飞,需要重写或抛出异常
    }
    
    // 使用组合
    class FlyingAbility {
      fly() {
        console.log('飞');
      }
    }
    
    class Bird {
      constructor(private flyingAbility: FlyingAbility | null = null) {}
      
      move() {
        if (this.flyingAbility) {
          this.flyingAbility.fly();
        } else {
          console.log('走');
        }
      }
    }
    
    const eagle = new Bird(new FlyingAbility());
    const penguin = new Bird();
    

设计模式分类

  • 创建型模式:关注对象的创建过程
    • 单例模式、工厂模式、抽象工厂模式、建造者模式、原型模式
  • 结构型模式:关注类和对象的组合方式
    • 适配器模式、桥接模式、组合模式、装饰器模式、外观模式、享元模式、代理模式
  • 行为型模式:关注对象间的通信和职责分配
    • 责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式、访问者模式

设计模式应用场景

  • 单例模式:全局配置、数据库连接池、日志记录器
  • 工厂模式:创建复杂对象、依赖注入、插件系统
  • 观察者模式:事件系统、数据绑定、消息队列
  • 策略模式:算法切换、支付方式、验证规则
  • 装饰器模式:功能扩展、中间件、AOP编程
  • 代理模式:远程代理、虚拟代理、保护代理、智能引用
  • 适配器模式:接口转换、第三方库集成、遗留系统适配

二、Git版本控制

2. Git基础与工作流

问题:Git的作用是什么?Git与SVN的区别是什么?什么是仓库?什么是工作区、暂存区、本地仓库、远程仓库?Git的基本操作有哪些?Git分支管理策略是什么?

答案

Git定义:Git是一个分布式版本控制系统,用于跟踪文件变化、协调多人协作、管理项目版本历史。

Git vs SVN 对比表

对比项GitSVN
架构分布式集中式
速度快(本地操作)慢(网络依赖)
网络需求可离线工作需网络连接
分支操作轻量级,快速重量级,较慢
安全性每个仓库完整历史中心服务器风险
学习曲线较陡峭较平缓
存储方式内容寻址文件差异
合并冲突较易解决较难解决
流行度主流,开源项目企业传统项目

Git核心概念

  1. 仓库(Repository):保存项目所有版本信息的地方,包含完整历史记录
  2. 工作区(Working Directory):当前看到的文件目录,可编辑修改
  3. 暂存区(Staging Area/Index):临时存放改动的地方,准备提交
  4. 本地仓库(Local Repository):本地的版本历史存储
  5. 远程仓库(Remote Repository):远程服务器上的仓库,用于团队协作

Git三区工作流程

工作区 --git add--> 暂存区 --git commit--> 本地仓库 --git push--> 远程仓库

Git基本操作命令

# 创建仓库
git init                    # 初始化本地仓库
git clone <url>             # 克隆远程仓库

# 基本操作
git status                  # 查看状态
git add <file>              # 添加文件到暂存区
git add .                   # 添加所有文件
git commit -m "message"     # 提交到本地仓库
git log                     # 查看提交历史
git diff                    # 查看差异

# 分支管理
git branch                  # 查看分支
git branch <name>           # 创建分支
git checkout <branch>       # 切换分支
git checkout -b <branch>    # 创建并切换分支
git merge <branch>          # 合并分支
git branch -d <branch>      # 删除分支

# 远程操作
git remote add <name> <url> # 添加远程仓库
git push <remote> <branch>  # 推送到远程
git pull <remote> <branch>  # 从远程拉取
git fetch <remote>          # 获取远程更新

# 撤销操作
git reset --soft HEAD^      # 撤销提交,保留更改到暂存区
git reset --mixed HEAD^     # 撤销提交,保留更改到工作区
git reset --hard HEAD^      # 撤销提交,丢弃所有更改
git checkout -- <file>      # 撤销工作区修改
git revert <commit>         # 创建反向提交

Git分支管理策略

Git Flow(经典工作流):

  • master:主分支,存放稳定版,只能从release或hotfix合并
  • develop:开发分支,集成功能分支
  • feature/*:功能分支,从develop创建,合并回develop
  • release/*:发布分支,从develop创建,测试后合并到master和develop
  • hotfix/*:热修复分支,从master创建,修复后合并到master和develop

GitHub Flow(简化工作流):

  • master:随时可部署的分支
  • feature/*:功能分支,从master创建,通过PR合并回master
  • 持续集成,快速发布

GitLab Flow(环境分支工作流):

  • master:开发分支
  • production:生产分支,从master合并
  • pre-production:预生产分支
  • 对应不同环境的分支策略

分支命名规范

  • feature/功能名称:新功能开发
  • bugfix/问题描述:bug修复
  • hotfix/紧急问题:紧急修复
  • release/版本号:发布准备
  • docs/文档内容:文档更新
  • refactor/重构内容:代码重构

Git高级操作

# 交互式暂存
git add -i

# 储藏更改
git stash                  # 储藏当前更改
git stash list             # 查看储藏列表
git stash pop              # 应用最近储藏并删除
git stash apply            # 应用储藏但不删除
git stash drop             # 删除储藏

# 标签管理
git tag                    # 查看标签
git tag v1.0.0             # 创建轻量标签
git tag -a v1.0.0 -m "版本1.0.0"  # 创建附注标签
git push origin --tags     # 推送所有标签

# 查看历史
git log --oneline --graph  # 图形化查看历史
git log --stat             # 查看文件变化统计
git log -p                 # 查看详细差异
git blame <file>           # 查看文件每行修改历史

# 子模块
git submodule add <url>    # 添加子模块
git submodule init         # 初始化子模块
git submodule update       # 更新子模块

# 二分查找
git bisect start           # 开始二分查找
git bisect good <commit>   # 标记正确的提交
git bisect bad <commit>    # 标记错误的提交
git bisect reset           # 结束二分查找

Git配置管理

# 用户配置
git config --global user.name "Your Name"
git config --global user.email "email@example.com"

# 别名配置
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status

# 编辑器配置
git config --global core.editor "vim"

# 换行符配置(Windows)
git config --global core.autocrlf true

# 大小写敏感
git config --global core.ignorecase false

# 查看配置
git config --list

Git常见问题解决

  1. 解决冲突
# 发生冲突后
git status                    # 查看冲突文件
# 编辑文件解决冲突
git add <file>                # 标记冲突已解决
git commit                    # 完成合并
  1. 恢复误删分支
git reflog                    # 查看操作历史
git checkout -b <branch> <commit>  # 从历史commit恢复分支
  1. 修改提交历史
# 修改最近一次提交
git commit --amend -m "新提交信息"

# 交互式变基(修改多个提交)
git rebase -i HEAD~3
# 编辑rebase窗口,选择要修改的提交
  1. 从远程获取特定文件
git checkout <remote>/<branch> -- <file>
  1. 清理未跟踪文件
git clean -f                  # 删除未跟踪文件
git clean -fd                 # 删除未跟踪文件和目录
git clean -n                  # 预览将要删除的文件

Git最佳实践

  1. 提交规范:使用约定式提交(Conventional Commits)
  2. 分支策略:选择合适的Git工作流
  3. 代码审查:使用Pull Request/Merge Request
  4. 持续集成:自动化测试和部署
  5. 定期同步:频繁拉取远程更新,避免大冲突
  6. 提交粒度:小步提交,每次提交一个逻辑单元
  7. 提交信息:清晰描述提交目的和影响
  8. 备份重要分支:master、develop等关键分支保护

三、Linux操作系统

3. Linux基础与常用命令

问题:Linux的作用是什么?Linux与Windows的区别是什么?Linux文件系统结构是什么?文件权限有哪些?如何修改文件权限?常用Linux命令有哪些?

答案

Linux定义:Linux是一个开源的类Unix操作系统内核,基于POSIX标准,具有多用户、多任务、多线程和多CPU支持的特性。

Linux vs Windows 对比表

对比项LinuxWindows
内核开源(GPL)闭源(商业)
发行版多样(Ubuntu、CentOS等)统一
文件系统ext4、XFS、Btrfs等NTFS、FAT32
命令行强大(Bash、Zsh等)较弱(PowerShell改进)
软件安装包管理器(apt、yum等)安装包(exe、msi)
安全性较高(权限严格)一般(需额外防护)
稳定性高(服务器首选)一般(需定期重启)
硬件支持驱动较少(但开源)驱动丰富
成本免费(部分企业版收费)收费
用户群体开发者、服务器管理员普通用户、企业

Linux文件系统结构

/                      根目录
├── bin/              基本命令程序
├── boot/             启动文件和内核
├── dev/              设备文件
├── etc/              系统配置文件
├── home/             用户主目录
│   ├── user1/
│   └── user2/
├── lib/              系统库文件
├── media/            可移动媒体挂载点
├── mnt/              临时挂载点
├── opt/              可选应用软件包
├── proc/             进程信息虚拟文件系统
├── root/             root用户主目录
├── sbin/             系统管理命令
├── srv/              服务相关数据
├── sys/              系统设备虚拟文件系统
├── tmp/              临时文件
├── usr/              用户程序和数据
│   ├── bin/
│   ├── lib/
│   └── local/
└── var/              可变数据
    ├── log/          日志文件
    ├── cache/        缓存数据
    └── www/          Web服务数据

文件权限系统

权限表示法

-rwxr-xr-x
↑ ↑↑↑↑↑↑↑↑
│ ││││││││
│ │└┴┴┴┴┴┴ 权限位
│ └所属组权限
└文件类型(-普通文件,d目录,l链接等)

rwx分别对应:读(r)、写(w)、执行(x)
权限值:r=4, w=2, x=1

权限修改命令

# 符号模式修改权限
chmod u+x file          # 给所有者添加执行权限
chmod g-w file          # 删除所属组写权限
chmod o=r file          # 设置其他用户只读
chmod a+x file          # 给所有用户添加执行权限
chmod u=rwx,g=rx,o=r file  # 分别设置权限

# 数字模式修改权限
chmod 755 file          # rwxr-xr-x
chmod 644 file          # rw-r--r--
chmod 777 file          # rwxrwxrwx(不推荐)

# 修改文件所有者
chown user:group file   # 同时修改所有者和组
chown user file         # 只修改所有者
chown :group file       # 只修改组

# 查看权限
ls -l file              # 查看详细信息
stat file               # 查看详细属性

常用Linux命令分类

1. 文件操作命令

# 查看文件
ls -la                  # 查看所有文件(含隐藏文件)
ls -lh                  # 人性化显示文件大小
ls -lt                  # 按时间排序
ls -lS                  # 按大小排序

# 创建删除
touch file              # 创建空文件或更新时间戳
mkdir dir               # 创建目录
mkdir -p path/to/dir    # 创建多级目录
rm file                 # 删除文件
rm -rf dir              # 递归强制删除目录(谨慎使用)
rmdir dir               # 删除空目录

# 复制移动
cp source dest          # 复制文件
cp -r source dest       # 递归复制目录
mv source dest          # 移动/重命名
mv -i source dest       # 交互式移动(询问覆盖)

# 查看内容
cat file                # 显示整个文件
less file               # 分页查看(推荐)
more file               # 分页查看(基本)
head -n 10 file         # 查看前10行
tail -n 10 file         # 查看后10行
tail -f file            # 实时查看新增内容

# 查找文件
find /path -name "*.txt"        # 按名称查找
find /path -type f -size +1M    # 查找大于1M的文件
find /path -mtime -7            # 查找7天内修改的文件
find /path -exec cp {} /tmp \;  # 对找到的文件执行操作

# 链接文件
ln -s target link       # 创建软链接(符号链接)
ln target link          # 创建硬链接

2. 文本处理命令

# 文本搜索
grep "pattern" file     # 搜索包含pattern的行
grep -n "pattern" file  # 显示行号
grep -r "pattern" dir/  # 递归搜索目录
grep -i "pattern" file  # 忽略大小写
grep -v "pattern" file  # 排除匹配的行

# 文本处理
sed 's/old/new/g' file  # 替换文本
sed -n '10,20p' file    # 显示10-20行
awk '{print $1}' file   # 打印第一列
awk -F',' '{print $2}'  # 以逗号分隔,打印第二列
sort file               # 排序
uniq file               # 去重(需先排序)
wc -l file              # 统计行数

3. 系统管理命令

# 进程管理
ps aux                  # 查看所有进程
ps -ef                  # 查看完整格式进程
top                     # 动态查看进程(类似任务管理器)
htop                    # 增强版top(需安装)
kill PID                # 终止进程
kill -9 PID             # 强制终止进程
pkill process_name      # 按名称终止进程

# 系统信息
uname -a                # 查看系统信息
df -h                   # 查看磁盘空间
du -sh dir/             # 查看目录大小
free -h                 # 查看内存使用
uptime                  # 查看运行时间
whoami                  # 查看当前用户
hostname                # 查看主机名
date                    # 查看当前时间

4. 网络管理命令

# 网络配置
ifconfig                # 查看网络接口(旧)
ip addr                 # 查看IP地址(推荐)
ip route                # 查看路由表

# 网络测试
ping host               # 测试连通性
ping -c 4 host          # 发送4个包后停止
traceroute host         # 跟踪路由路径
mtr host                # 持续跟踪路由

# 网络连接
netstat -tulpn          # 查看监听端口和进程
ss -tulpn               # 更快的netstat替代
netstat -an | grep :80  # 查看80端口连接

# 网络工具
curl url                # 获取URL内容
wget url                # 下载文件
ssh user@host           # SSH连接
scp file user@host:path # 安全复制
rsync -av source dest   # 同步文件

5. 用户管理命令

# 用户操作
useradd username        # 添加用户
userdel -r username     # 删除用户(含主目录)
passwd username         # 修改用户密码
usermod -aG group user  # 添加用户到组

# 组操作
groupadd groupname      # 添加组
groupdel groupname      # 删除组

# 权限切换
su - username           # 切换到用户(需要密码)
sudo command            # 以root权限执行命令
sudo -i                 # 切换到root shell

6. 压缩解压命令

# tar压缩
tar -czf archive.tar.gz dir/   # 创建gzip压缩包
tar -xzf archive.tar.gz        # 解压gzip压缩包
tar -cjf archive.tar.bz2 dir/  # 创建bzip2压缩包
tar -xjf archive.tar.bz2       # 解压bzip2压缩包

# zip压缩
zip -r archive.zip dir/        # 创建zip压缩包
unzip archive.zip              # 解压zip压缩包

# gzip压缩
gzip file                      # 压缩文件(生成file.gz)
gunzip file.gz                 # 解压gzip文件

7. Shell脚本基础

#!/bin/bash
# 这是一个Shell脚本示例

# 变量定义
name="World"
echo "Hello, $name!"

# 条件判断
if [ $# -eq 0 ]; then
  echo "没有参数"
elif [ $# -eq 1 ]; then
  echo "一个参数: $1"
else
  echo "多个参数"
fi

# 循环
for i in {1..5}; do
  echo "数字: $i"
done

while true; do
  echo "无限循环..."
  sleep 1
done

# 函数定义
function greet() {
  echo "Hello, $1!"
}

greet "Alice"

# 参数传递
echo "脚本名: $0"
echo "参数个数: $#"
echo "所有参数: $@"
echo "第一个参数: $1"

Linux进程状态

  • R(Running):运行中
  • S(Sleeping):睡眠中(可中断)
  • D(Disk Sleep):不可中断睡眠
  • T(Stopped):停止状态
  • Z(Zombie):僵尸进程
  • X(Dead):死亡状态

Linux常见问题排查

# 查看系统日志
dmesg | tail -20        # 查看内核日志
journalctl -xe          # 查看系统日志(systemd)
tail -f /var/log/syslog # 查看系统日志(传统)

# 性能排查
vmstat 1 10             # 虚拟内存统计
iostat -x 1             # I/O统计
mpstat -P ALL 1         # 每个CPU统计
sar -n DEV 1 10         # 网络统计

# 内存排查
free -h                 # 查看内存使用
ps aux --sort=-%mem     # 按内存使用排序进程

# CPU排查
ps aux --sort=-%cpu     # 按CPU使用排序进程
top -c                  # 查看进程命令详情

Linux安全最佳实践

  1. 定期更新sudo apt update && sudo apt upgrade
  2. 防火墙配置:使用ufw或iptables
  3. SSH安全:禁用root登录,使用密钥认证
  4. 权限控制:遵循最小权限原则
  5. 日志监控:定期检查系统日志
  6. 备份策略:定期备份重要数据
  7. 服务最小化:只运行必要的服务
  8. 用户管理:定期审查用户权限

由于篇幅限制,这里先提供其他类别答案的前三部分(设计模式、Git、Linux)。后续部分(浏览器原理、计算机基础、数据库、系统设计、职业发展等)将根据相同模式继续编写,每部分包含问题概述、详细答案、代码示例和对比表格。