# design-patterns **Repository Path**: j67mk2/design-patterns ## Basic Information - **Project Name**: design-patterns - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-10-10 - **Last Updated**: 2026-10-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 设计模式实战精通营(Design Patterns)· 课程总览 > 面向「Java 基础一般、怕概念不怕代码」的学习者:10 课由浅到深、实战驱动,每课一个**可以独立构建、独立运行**的工程(第 1~9 课纯 Java 单模块,第 10 课 Spring Boot 企业级收官项目)。 > > 本课程**不做 23 种模式的教科书式罗列**,只打三张牌:**面试高频模式 + Spring/中间件源码真实落点 + 坏代码实战重构**。全程大白话 + 生活类比,术语第一次出现必解释,代码逐行中文注释,每课末尾有课后作业(标难度)和面试点速记。 > > 如果你在学《JVM/JUC/Redis/RocketMQ 实战教程》,本课程正好补上"代码怎么组织"这一课:你看到的框架源码里全是这些模式;也可以完全独立学习,只需要 Java 基础和 Maven。 --- ## 一、学完你能回答这些问题 - 设计原则和设计模式什么关系?SOLID 六大原则怎么一句话讲清? - 单例有几种写法?为什么枚举是面试标准答案?反射/序列化怎么破坏它? - Spring 的 `BeanFactory` 和 `FactoryBean` 是什么关系?`@EventListener` 怎么用? - 策略模式和 if-else 的区别?模板方法模式在 `JdbcTemplate` 里长什么样? - 观察者模式怎么解耦下单通知?`@TransactionalEventListener` 为什么更安全? - 责任链怎么实现审批流?MyBatis 插件凭什么能拦截 SQL? - JDK 动态代理和 CGLIB 怎么选?Spring AOP 默认用哪个? - 怎么把策略+模板方法+责任链+观察者组合成一条真实业务链路? - 简历上"做过支付网关收单平台"这个项目怎么讲(STAR/亮点/追问)? --- ## 二、环境要求(本课程全部在本机验证过) | 项 | 要求 | |---|---| | JDK | **17**(本机路径 `C:\jdk\jdk-17.0.12`;构建/运行前必须 `$env:JAVA_HOME="C:\jdk\jdk-17.0.12"`,用户级 JAVA_HOME 指向 JDK8 是已知坑) | | Maven | 3.9.x(本机 3.9.12) | | 系统 | Windows + PowerShell(本课程命令均为 PowerShell 写法;IDEA 直接 `File → Open` 各课目录即可) | | 网络 | 第 1~9 课零业务依赖,`mvn` 首次构建联网拉插件后即可离线;第 10 课 Spring Boot 依赖首次需联网(本机已缓存) | | 其他 | 第 10 课可选串讲 Redis 幂等(本机 6379 已有 Redis 实例,不强制);端口 **10060** 已探测空闲 | --- ## 三、课程表(10 课,由浅到深) | 课号 | 主题 | 核心知识点 | 源码/框架落点 | 演示 main 类(包 `com.dp.lessonNN`) | |---|---|---|---|---| | 01 | 设计模式世界观 | 六大原则(SOLID+LoD)、三大分类、坏代码样板(外卖订单系统埋 6 处坏味道) | — | `Main`(坏代码跑起来) | | 02 | 单例模式 | 饿汉/懒汉/DCL/静态内部类/枚举、反射+序列化破坏、枚举免疫 | Spring 单例 Bean 三级缓存 | `Main`、`ReflectAttackDemo`、`SerializeAttackDemo` | | 03 | 工厂模式 | 简单工厂/工厂方法/抽象工厂三兄弟、枚举干掉魔法数字、订单类型分发重构 | Spring BeanFactory/FactoryBean | `Main` | | 04 | 建造者+原型 | 手写 Builder 重构参数爆炸、StringBuilder 落点、浅拷贝 vs 深拷贝 | Lombok @Builder、Spring BeanDefinitionBuilder | `Main` | | 05 | 策略+模板方法 | 策略族替代优惠 if-else、模板方法固定订单处理骨架 | JdbcTemplate/RestTemplate 模板方法 | `Main` | | 06 | 观察者 | 手写 EventBus、下单多渠道通知解耦、Spring 事件三注解 | ApplicationEvent/@EventListener/@TransactionalEventListener | `Main` | | 07 | 责任链 | 审批链(组长→经理→总监)、订单校验过滤器链、链头陷阱 | Spring MVC HandlerInterceptor、MyBatis 插件 | `Main` | | 08 | 代理+装饰器 | JDK 动态代理加日志/耗时、装饰器增强计算组件、两者区别 | Spring AOP(JDK vs CGLIB 策略) | `Main` | | 09 | 模式组合实战 | 策略+模板方法+责任链+观察者搭订单全生命周期链路(创建→校验→优惠→库存→通知→审计) | 综合回顾 Spring 请求处理链 | `Main` | | 10 | 企业级收官:支付网关收单平台 | 多渠道路由=策略、渠道回调=模板方法、对账通知=观察者、HMAC 验签+Redis 幂等+回调防重放、yml 可配置、链路日志 | Spring Boot 3.5 真实工程 | `PayGatewayApplication`(启动)+ REST 接口 | --- ## 四、各课运行命令 ### 第 1~9 课(通用模板,把课号与类名换成对应行) ```powershell cd C:\Users\haoji\Desktop\课程\design-patterns-journey\lesson-01 $env:JAVA_HOME="C:\jdk\jdk-17.0.12" # 每次新开窗口都要切(用户级 JAVA_HOME 指向 JDK8) mvn clean install -DskipTests # 必须 BUILD SUCCESS [Console]::OutputEncoding=[System.Text.Encoding]::GetEncoding(936) # 中文乱码防护 & "C:\jdk\jdk-17.0.12\bin\java.exe" -cp ".\target\classes" com.dp.lesson01.Main ``` - 第 2 课额外两个演示:`com.dp.lesson02.ReflectAttackDemo`、`com.dp.lesson02.SerializeAttackDemo`。 - 第 3~9 课均为 `com.dp.lesson0N.Main`(N=3~9),一条 main 跑完本课全部场景。 ### 第 10 课(Spring Boot 收单平台) ```powershell cd C:\Users\haoji\Desktop\课程\design-patterns-journey\lesson-10 $env:JAVA_HOME="C:\jdk\jdk-17.0.12" mvn clean install -DskipTests mvn spring-boot:run # 或 java -jar target\lesson-10-1.0.0.jar;端口 10060,启动时自动跑 5 场景全链路演示 ``` - REST 接口(启动后可用 curl.exe 实测,README §6 有完整命令与真实返回): - `POST /pay/create` 下单 → `POST /pay/notify/{channel}` 渠道回调 → `GET /pay/mock-callback?outTradeNo=…&channel=wechat` 教学模拟回调 → `GET /pay/order/{outTradeNo}` 查订单。 --- ## 五、通用坑(全系列踩过,先记下) 1. **JAVA_HOME 指向 JDK8**:每次 `mvn` 前必须 `$env:JAVA_HOME="C:\jdk\jdk-17.0.12"`,否则 release 17 编译报错。 2. **PATH 上的 java 是 JDK8**:运行 class 必须用全路径 `& "C:\jdk\jdk-17.0.12\bin\java.exe"`,否则 `UnsupportedClassVersionError`。 3. **中文乱码**:PowerShell 5.1 控制台 GBK,运行 Java 前 `[Console]::OutputEncoding=936`;文件一律 UTF-8 无 BOM;pom 必须有 UTF-8 编码属性。 4. **PowerShell 无 bash**:命令里不要出现 `&&`、`||`(解析错误)。 5. **程序输出别打印 ⭐/emoji**:GBK 控制台编不了会显示成 `?`。 6. **运行中的 java 进程锁文件**:`mvn clean` 报占用 → 先 `Stop-Process` 那个 java 进程。 7. **JDK17 编译的 class 只能 JDK17+ 跑**:别用 IDEA 默认的 JDK8 运行第 1~9 课工程。 --- ## 六、学习建议 1. **顺序学,别跳**:前 8 课的模式是第 9 课组合实战的零件,第 9 课和第 10 课是前 8 课的"合体表演"。跳课 = 第 9/10 课看不懂。 2. **每课必须跑起来**:看完 README 不算会,`mvn` 编译 + 跑 main + 改课后作业才算。作业 ⭐⭐ 至少做 2 道,⭐⭐⭐ 至少 1 道。 3. **坏代码主线**:第 1 课埋的外卖订单坏代码是全系列线索——每课"改前改后"对比看,你会亲眼看到代码怎么一点点变干净。 4. **面试准备**:每课 §8 面试点速记考前背一遍;§10(第 10 课)的"面试讲项目话术"(STAR/亮点/追问)是你简历写"支付网关"项目的讲稿。 5. **深入口子**:每课 §5 之后的「📌 进阶深挖(选学)」是给想深入的人的——源码片段、进阶方案、书目都在那里,面试前挑 2 个深挖点读透,拉开差距。 6. **看完还想练**:把第 9 课的订单链路换成你自己的业务(登录/购物车/抽奖),每换一步就是一次组合实战。 --- ## 七、交付说明 - 每课均已在本机实测:`mvn clean install -DskipTests` 全部 BUILD SUCCESS,演示 main 全部真实运行,真实输出已贴进各课 §6(未实测项已按规范标"待实测"+原因)。 - 课程生产规范(十节结构/风格/验收门槛)存档于 `_templates\设计模式实战精通营-生产规范.md`。 - 第 10 课验收清单 **10/10 通过**(详见 lesson-10 README §6.4)。 - 本课程只写入了 `design-patterns-journey` 目录,未动桌面其他课程目录。