观察者模式 + 工厂模式 + Java 整合
观察者模式核心思路、与策略模式对比、工厂模式三种形态、Python/Java 双语言实现。
DAY02 — 观察者模式 + 工厂模式 + Java 整合
相关笔记:[[DAY01-成长计划启动]] | [[DAY01b-Python迷惑语法]] | [[DAY01c-策略模式]] | [[DAY01d-HTTP拦截与CookieSession]] 相关模式:[[设计模式]] 相关主题:[[Java笔记]] | [[Python基础]]
一、观察者模式
核心思路
传统写法:process_order() { 下单 + 发邮件 + 发短信 + 记日志 }
观察者: process_order() { 下单 → 喊一声 } ← 不知道谁在听
三个角色
| 角色 | 例子 |
|---|---|
| Subject(主题) | OrderProcessor |
| Observer(接口) | Protocol / 接口 |
| Concrete Observer | EmailNotifier, SmsNotifier |
和策略模式的区别
| 策略模式 | 观察者模式 | |
|---|---|---|
| 方向 | 调用方选一个策略 | 通知所有监听者 |
| 数量 | 一次用一个 | 一次通知全部 |
| 场景 | 多个算法选一个 | 多个地方想"知道" |
二、工厂模式
一句话
把 new 对象这件事从各处收回来,统一交给一个地方管。
不用工厂的问题
# 到处都在 new
exporter = PdfExporter() # 文件1
if fmt == "pdf": exporter = PdfExporter() # 文件2
# 加新格式:上面每个地方都要改
工厂解法
class ExporterFactory:
@staticmethod
def create(fmt: str):
if fmt == "pdf": return PdfExporter()
if fmt == "csv": return CsvExporter()
raise ValueError(f"不支持: {fmt}")
# 所有调用方统一用工厂
exporter = ExporterFactory.create("pdf")
三种工厂
| 模式 | 一句话 |
|---|---|
| 简单工厂 | 一个函数根据参数返回不同对象 |
| 工厂方法 | 每个子类自己决定创建什么 |
| 抽象工厂 | 生产一组相关对象 |
三、Python 补充
- 切片
[::]:[start:stop:step],记成 range - 深浅拷贝:
=引用 →copy()浅拷贝 →deepcopy()全独立
四、Java 内容整合
- 将 [[Java笔记]] 完整提取到学习记录
- 覆盖 Day1~12 + Spring + ZooKeeper
- 整理了 [[JAVA面试题]] 合并版
代码文件
Day01.code/observer_exercise.pyDay01.code/observer_pattern.pyDay01.code/factory_exercise.py
当天进度
阶段一:■■■□□□□□□□ 3/10 (策略模式 ✅ 观察者模式 ✅ 工厂模式 ✅)