其他
一、设计模式
1. 设计模式基础与原则
问题:什么是设计模式?设计模式的作用是什么?设计模式的原则有哪些?设计模式的分类有哪些?设计模式的应用场景有哪些?
答案:
设计模式定义:设计模式是在软件设计过程中,针对特定场景的通用、可复用的解决方案。它是一套被反复使用、多数人知晓、经过分类编目的代码设计经验的总结。
设计模式的作用:
- 提高代码复用性:经过验证的解决方案,可直接使用
- 增强代码可维护性:规范化代码结构,易于理解和修改
- 提高代码灵活性:支持变化,便于扩展和修改
- 促进团队协作:统一的设计语言和思路
- 降低系统复杂度:将复杂问题分解为简单模式组合
- 提高开发效率:避免重复设计,专注业务实现
设计模式七大原则(SOLID + 组合优于继承):
-
单一职责原则(SRP):一个类应该只有一个引起变化的原因
// 违反SRP class UserManager { saveUser(user) { /* 保存用户 */ } sendEmail(user) { /* 发送邮件 */ } validateUser(user) { /* 验证用户 */ } } // 遵循SRP class UserRepository { saveUser(user) { /* 保存用户 */ } } class EmailService { sendEmail(user) { /* 发送邮件 */ } } class UserValidator { validateUser(user) { /* 验证用户 */ } } -
开闭原则(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(); // 无需修改 } } -
里氏替换原则(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('游泳'); } } -
接口隔离原则(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() { /* 睡 */ } } -
依赖倒置原则(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); } } -
迪米特法则(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(); } } -
组合优于继承:优先使用组合而非继承来扩展功能
// 使用继承 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 对比表:
| 对比项 | Git | SVN |
|---|---|---|
| 架构 | 分布式 | 集中式 |
| 速度 | 快(本地操作) | 慢(网络依赖) |
| 网络需求 | 可离线工作 | 需网络连接 |
| 分支操作 | 轻量级,快速 | 重量级,较慢 |
| 安全性 | 每个仓库完整历史 | 中心服务器风险 |
| 学习曲线 | 较陡峭 | 较平缓 |
| 存储方式 | 内容寻址 | 文件差异 |
| 合并冲突 | 较易解决 | 较难解决 |
| 流行度 | 主流,开源项目 | 企业传统项目 |
Git核心概念:
- 仓库(Repository):保存项目所有版本信息的地方,包含完整历史记录
- 工作区(Working Directory):当前看到的文件目录,可编辑修改
- 暂存区(Staging Area/Index):临时存放改动的地方,准备提交
- 本地仓库(Local Repository):本地的版本历史存储
- 远程仓库(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常见问题解决:
- 解决冲突:
# 发生冲突后
git status # 查看冲突文件
# 编辑文件解决冲突
git add <file> # 标记冲突已解决
git commit # 完成合并
- 恢复误删分支:
git reflog # 查看操作历史
git checkout -b <branch> <commit> # 从历史commit恢复分支
- 修改提交历史:
# 修改最近一次提交
git commit --amend -m "新提交信息"
# 交互式变基(修改多个提交)
git rebase -i HEAD~3
# 编辑rebase窗口,选择要修改的提交
- 从远程获取特定文件:
git checkout <remote>/<branch> -- <file>
- 清理未跟踪文件:
git clean -f # 删除未跟踪文件
git clean -fd # 删除未跟踪文件和目录
git clean -n # 预览将要删除的文件
Git最佳实践:
- 提交规范:使用约定式提交(Conventional Commits)
- 分支策略:选择合适的Git工作流
- 代码审查:使用Pull Request/Merge Request
- 持续集成:自动化测试和部署
- 定期同步:频繁拉取远程更新,避免大冲突
- 提交粒度:小步提交,每次提交一个逻辑单元
- 提交信息:清晰描述提交目的和影响
- 备份重要分支:master、develop等关键分支保护
三、Linux操作系统
3. Linux基础与常用命令
问题:Linux的作用是什么?Linux与Windows的区别是什么?Linux文件系统结构是什么?文件权限有哪些?如何修改文件权限?常用Linux命令有哪些?
答案:
Linux定义:Linux是一个开源的类Unix操作系统内核,基于POSIX标准,具有多用户、多任务、多线程和多CPU支持的特性。
Linux vs Windows 对比表:
| 对比项 | Linux | Windows |
|---|---|---|
| 内核 | 开源(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安全最佳实践:
- 定期更新:
sudo apt update && sudo apt upgrade - 防火墙配置:使用ufw或iptables
- SSH安全:禁用root登录,使用密钥认证
- 权限控制:遵循最小权限原则
- 日志监控:定期检查系统日志
- 备份策略:定期备份重要数据
- 服务最小化:只运行必要的服务
- 用户管理:定期审查用户权限
由于篇幅限制,这里先提供其他类别答案的前三部分(设计模式、Git、Linux)。后续部分(浏览器原理、计算机基础、数据库、系统设计、职业发展等)将根据相同模式继续编写,每部分包含问题概述、详细答案、代码示例和对比表格。