Skip to content

设计原则、常见模式与综合复习 ​

学习目标 ​

  • 用单一职责、开闭、里氏替换、接口隔离、依赖倒置审查设计。
  • 识别策略、工厂、建造者、装饰器、观察者、模板方法和适配器模式。
  • 把语言、集合、并发、JVM、测试和数据库知识整合到一个项目。
  • 建立从需求、实现、测试、观测、性能到复盘的进阶学习路线。

核心知识点 ​

模式是重复出现的协作结构,不是类名清单;先识别变化点和约束,再选择策略或工厂等模式。综合项目可做“订单/库存服务”:用 record 表示命令和结果,用接口隔离支付策略,用集合维护内存索引,用 Stream 生成报表,用 JDBC 持久化,用 Maven/JUnit/日志形成工程闭环,用 Executor 或虚拟线程处理异步任务,再通过 JFR 和 GC 日志验证性能。复习顺序建议为:语法与对象 → 异常/泛型/集合 → Lambda/Stream/IO → 反射/模块 → 并发/JMM → JVM → 工程化;每阶段都要完成一个可运行练习并写测试。

常用用法 ​

策略模式:替换可变算法 ​

用一个小接口隔离可变规则,使调用方依赖稳定契约而不是具体分支。

java
// 说明:策略模式:替换可变算法。
interface Discount { int apply(int cents); }

Discount tenPercentOff = cents -> cents * 90 / 100;
// 初始状态:tenPercentOff = cents -> cents * 90 / 100。
System.out.println(tenPercentOff.apply(1000));
// 输出:900

工厂方法:集中创建规则 ​

用工厂方法按输入选择实现,避免把构造与选择逻辑散落到业务流程中。

java
// 说明:工厂方法:集中创建规则。
static Discount discountFor(String level) {
    return "VIP".equals(level) ? cents -> cents * 80 / 100 : cents -> cents;
}

System.out.println(discountFor("VIP").apply(1000));
// 输出:800

装饰器模式:叠加横切行为 ​

用实现同一接口的包装对象增加日志、计时或缓存,同时保留原调用契约。

java
// 说明:装饰器模式:叠加横切行为。
Discount base = cents -> cents * 90 / 100;
// 初始状态:base = cents -> cents * 90 / 100。
Discount traced = cents -> {
// 初始状态:traced = cents ->。
    int result = base.apply(cents);
// 初始状态:result = base.apply(cents)。
// 作用:int result = base.apply(cents);;叠加横切行为。
    System.out.println("discounted=" + result);
// 输出:discounted=900
    return result;
};
traced.apply(1000);
// 初始状态:traced.apply(1000)。
// 作用:traced.apply(1000);;叠加横切行为。

综合练习 ​

分四轮完成订单项目:第一轮命令行内存版,第二轮加入 Maven、JUnit 和日志,第三轮接入 JDBC 与事务,第四轮加入并发下单、超时、指标和 JVM 压测。每轮记录设计决策、失败用例、性能基线和下一步改进。

易错点 ​

  • 为了套模式而套模式,抽象层级超过真实变化点。
  • 只测 happy path,不测重试、并发、超时、回滚和资源关闭。
  • 把“能运行”当作“可维护”,没有边界、日志、指标和文档。
  • 只背 JVM 参数或 API,不用可复现实验验证假设。

复习清单 ​

  • [ ] 能用 SOLID 解释一次重构前后的取舍。
  • [ ] 能为综合项目画模块、线程、事务和数据流边界。
  • [ ] 能从日志、测试、线程转储、GC 日志和指标定位问题。
  • [ ] 能按“读概念—写最小例子—做故障实验—总结决策”循环继续进阶。