Skip to content

设计原则与模式 ​

从变化来源和模块边界出发,学习怎样拆分关注点、设计可替换接口、用原则约束取舍,并在真实 Java/Spring 代码中选择合适的模式。

从哪里开始

按顺序读:先弄清 设计到底在设计什么,再用 关注点分离与可测试性 练习拆分边界;读懂成熟系统的设计、掌握封装组合多态与函数式手段之后,再看原则和模式。原则是判断取舍的尺子,模式是按问题查阅的工具箱。最后用 DDD 把边界放大到业务层面(完整的实践路线在 领域驱动设计专题),并在 通知路由案例 里把这些方法串起来走一遍。

设计模式决策图 之后有五篇按问题归类的深挖:对象创建、包装、可扩展流程、事件、状态机,遇到对应问题时再读;三个可复用的服务端组件 用限流、幂等键和渐进发布演示怎样从失败语义推导出设计。

文章 ​

01软件设计到底在设计什么设计的产物是模型、边界与演化规则;一个对象四处共用为什么会让变化扩散→02关注点分离与可测试性同一段下单逻辑拆分前后的测试对比:时间依赖、边界 bug 与四个难测信号→03读懂一个系统的设计先模型、再接口、最后实现:Spring 容器、Kafka Producer、JDK Stream 三个可运行的切片→04封装、组合与多态三种控制变化的手段;继承 HashSet 的计数错误,密封类型与穷举 switch 何时优于多态→05Java 里的函数式设计record 只是浅不可变、组合顺序即业务规则、Stream 副作用实测,以及函数式核心与命令式外壳→06API 设计与 DSL构造器、Builder、类型状态 Builder 的错误暴露时机;record 新增组件导致 NoSuchMethodError→07设计原则每条原则配一个可检查的判断标准和一个「不必遵守」的条件;IoC、DI 与 DIP 的区别→08里氏替换原则三个可检查的信号、为什么会建错,以及用组合替代继承→09设计模式决策图按四类工程问题选模式;八个高频模式的边界与代价,以及现代 Java 让哪些模式变轻→10对象创建与生命周期Builder 不保证合法、单例只在一个范围内唯一、复制前先决定身份;五组实测→11依赖注入容器的绑定身份只按 Class 时两个绑定变一个并报假环、绑定与检查路径用两种身份、路径栈与已访问集合、延迟边与构造中 get、类型引用相等性→12单例在谁的范围里唯一浅复制配置让两个容器共享单例、别名、无锁并发创建两次、null 与失败是否缓存、装饰器转发依赖元数据→13资源方法返回什么,客户端收到什么null 与 void 是 204、显式 Response 不再包装、映射器失败 500、HEAD 执行 GET、默认 OPTIONS 与 405→14参数绑定的三种失败int 缺省为 0、查询参数转换失败 404 而请求头 400、构造器与 valueOf 的选择、转换失败不能回退→15适配器、装饰器与代理都是包一层:错误翻译让重试失真、装饰顺序改变计量、自调用绕过代理→16声明式 HTTP 客户端怎样把接口变成请求接口加注解生成动态代理、路径与查询参数的编码、手写代理的两种编码错误、404 与 500 抛异常、默认没有超时→17策略、回调与责任链策略注册的重复与缺失、回调换线程丢上下文、责任链顺序与节点副作用→18观察者、事件与消息同步、异步、提交后与 Outbox 的失败语义;线程池满时数据与事件分叉→19状态机与工作流转换表的全矩阵检查、并发命令与版本号、状态与副作用一起提交→20拖动折线的顶点:预览、提交与撤销编辑会话只改预览、提交时核对基准版本;坐标换算属于适配层;快照式撤销会覆盖外部修改,命令式撤销只还原改过的顶点→21从统一语言到限界上下文子域、限界上下文与防腐层;200 个请求抢 100 个名额,四种聚合写法实测→22通知路由服务的演化三次变化请求如何只靠新增完成,以及用影子比对迁移遗留系统→23可复用的服务端组件限流、幂等键、渐进发布:先写失败语义,再选模式;超发、接管与分桶实测→24多个产品共用一套流程按产品分支 5 处、可替换流水线让产品跳过风控;平台骨架只开放三个扩展点,契约测试对所有扩展检查手续费→25组件怎么划共同闭包与共同复用;订单与账单互相依赖时 ArchUnit 报环,端口反转后单向;引用业务包的 common 包再次成环;不稳定度→26设计文档写什么问题与可检查的目标、约束、刺激—环境—响应—度量的场景、对应场景的视图、决策记录与复评条件、验证计划→

相关专题 ​

文章以 CC BY-NC-SA 4.0 授权 · 代码片段以 MIT 授权