ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

设计模式学习记录

2026/9/13 20:43:42 拓冰建站 浏览量
设计模式学习记录 用一个实际例子来学习TaskCat是一个任务管理器主要聚焦在增删改查这些逻辑但它有一些问题--无法撤销 — done 或 delete 执行后无法回退--输出格式死板 — 只能打表格想加 JSON/Markdown 输出就要改 TaskCat 类--存储不持久 — 退出即丢失每次都是新 JVM--所有逻辑一个类 — TaskCat 已经开始膨胀再加功能会更乱--命令解析和业务逻辑混在一起 — switch 里既有参数校验又有业务操作1、现在解决第一个问题无法撤销使用命令(command)模式将一个请求封装成一个对象从而让用户使用不同的请求把客户端参数化对请求排队或记录日志以及支持可撤销的操作。原来操作直接改数据无法回退 现在每个操作封装成 Command 对象自带 undo()原来加新操作要改 TaskCat 的 switch 现在新操作只需新建一个 Command 实现类原来操作历史无法追踪 现在UndoManager 天然记录了所有操作还有残留的痛点TaskCat.executeCommand() 里仍在用 switch if-else 分发命令 → Phase 2 的 Strategy模式会更好新命令比如加一个 edit还是要改 TaskCat → 还没做到开闭原则输出格式仍然写死 → Phase 22、策略strategy模式将多种不同的实现算法封装然后客户端根据不同策略分别调用相应的算法首先定义一个策略接口规定算法的同一操作封装各个算法然后使用。解决输出格式写死的问题原来问题现在修改list输出格式写死加 JSON 要改 TaskCatOutputFormatter接口解耦新增格式只加实现类每种格式要 if-else 分支MapString, OutputFormatter注册表一行注册新格式格式逻辑混在主类里格式逻辑完全在各自的 Formatter 类里TaskCat 只调接口还残留痛点建3、工厂方法(factory method)模式解决存储后端耦合的问题。定义一个用于创建对象的接口让子类决定实例化哪个类在重启后数据不会丢失Phase 2 的痛Factory Method 怎么解new ArrayList()写死在 TaskCat 里TaskRepositoryFactory.create()延迟创建决策加文件存储要改 TaskCat新增FileRepositoryFactory即可TaskCat 零改动Commands 直接依赖具体集合类型Commands 只依赖TaskRepository接口DIP数据退出即丢失FileTaskRepository自动持久化还残留痛点任式。4、观察者(observer)模式定义对象间的一种一对多的依赖关系当一个对象的状态发生改变时所有依赖于它的对象都可以得到通知并自动更新。任务状态变更时会有通知观察者模式使用十分广泛类似于发布-订阅。Phase 3 的痛Observer 模式怎么解想知道什么时候添加了任务只能轮询注册 Observer事件自动推送加日志/统计功能要侵入业务代码新功能只需新建 Observer 并注册功能耦合在主流程里功能与核心解耦可随时增删观察者还残留痛点任式5、装饰器(decorator)模式是在不必改变原类和使用继承的情况下动态地扩展一个对象的功能。它是通过创建一个包装对象也就是装饰来包裹真实的对象。解决给任务附加能力导致继承爆炸的问题每个能力是一个装饰器可以自由叠加。继承方式Decorator 方式加标签 → TaggedTask extends BasicTaskTaggedTask wraps Task加优先级 → PriorityTask extends BasicTaskPriorityTask wraps Task两者都要 → TaggedPriorityTask???new PriorityTask(new TaggedTask(...))N 个能力 → 2^N 个子类N 个装饰器自由组合还残留痛点构建式6、构建者(builder)模式将一个复杂对象的构建与其表示分离使得同样的构建过程可以创建不同的表示解决查询条件参数膨胀的问题痛点Builder 怎么解查询参数越来越多findByDoneAndPriorityAndTags(...)TaskQuery.builder().done(true).priority(HIGH).build()不需要的条件也得传 null不设的条件默认不筛选加新筛选维度就要加新方法Builder 加一个方法查询方法不用改7、改变了其类。7、状态(state)模式当一个对象内在状态改变时允许改变其行为这个对象看起来像是改变了其类。解决任务状态流转中的 if-else 判断问题存在一个很长的if else列表而这些分支都是因为不同状态下执行的操作不一样时考虑使用此模式8、模版方法(template)模式在一个方法中定义一个算法的骨架而将一些步骤的实现延迟到子类中使得子类可以在不改变一个算法的结构前提下即可重定义该算法的某些特定步骤场景是数据导入导出的骨架流程以后要支持 JSON 导入、CSV 导入、Markdown 导出等多种格式每种格式的读取→解析→处理→写入流程一样但细节不同。用 Template Method 把骨架固定在基类子类只实现各自的细节步骤。