第3章 · 系统设计实践
架构设计原则 · 设计模式 · API规范 · 数据库范式
3.1 架构设计原则 (SOLID)
SOLID 是面向对象设计的五个基本原则,帮助构建可维护、可扩展的系统。
| 缩写 | 原则 | 核心思想 |
|---|---|---|
| S | 单一职责 | 一个类只负责一个功能领域 |
| O | 开闭原则 | 对扩展开放,对修改关闭 |
| L | 里氏替换 | 子类可替换父类且不破坏正确性 |
| I | 接口隔离 | 客户端不应依赖不需要的接口 |
| D | 依赖反转 | 依赖抽象而非具体实现 |
3.2 设计模式实战 (工厂 & 策略)
🔧 工厂模式
将对象创建逻辑封装,客户端通过工厂获取实例,符合开闭原则。
// 简单工厂示例 (Java风格)
public interface Payment {
void pay(double amount);
}
public class Alipay implements Payment { ... }
public class WechatPay implements Payment { ... }
public class PaymentFactory {
public static Payment create(String type) {
if ("alipay".equals(type)) return new Alipay();
else if ("wechat".equals(type)) return new WechatPay();
throw new IllegalArgumentException();
}
}
⚖️ 策略模式
定义一系列算法,将每个算法封装起来,使它们可以互相替换。
// 策略模式示意 (TypeScript)
interface DiscountStrategy {
calculate(price: number): number;
}
class NoDiscount implements DiscountStrategy { ... }
class SeasonalDiscount implements DiscountStrategy { ... }
class Checkout {
constructor(private strategy: DiscountStrategy) {}
public compute(price: number) { return this.strategy.calculate(price); }
}
3.3 API 设计规范
遵循 RESTful 风格,资源路径、HTTP 动词、状态码、版本管理等。
| 规范项 | 推荐做法 |
|---|---|
| URL 命名 | 复数名词,如 /api/v1/users |
| HTTP 方法 | GET / POST / PUT / DELETE / PATCH |
| 状态码 | 200, 201, 204, 400, 401, 404, 500 |
| 版本控制 | URL 路径或请求头 Accept: vnd.example.v2+json |
| 错误响应 | 统一结构 { "error": { "code":..., "message":... } } |
3.4 数据库设计范式
范式化减少数据冗余,提高数据完整性。常用三大范式。
- 第一范式 (1NF):每列保持原子性,不可再分。
- 第二范式 (2NF):满足1NF,且非主键列完全依赖于主键。
- 第三范式 (3NF):满足2NF,且非主键列不传递依赖于主键。
| 范式 | 核心要求 | 典型反例 |
|---|---|---|
| 1NF | 字段不可再分割 | “地址”字段包含省市县 |
| 2NF | 消除部分依赖 | 订单明细表依赖订单ID+商品ID |
| 3NF | 消除传递依赖 | 学生表依赖系ID,系名冗余 |