<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>软件工程 on 方糖猫Blog</title>
    <link>https://ftmao.com/blog/categories/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B/</link>
    <description>AI 视频、AI Agent 与工程实践笔记</description>
    <generator>Hugo</generator>
    <language>zh-CN</language>
    <lastBuildDate>Mon, 28 Sep 2026 16:00:00 +0800</lastBuildDate><atom:link href="https://ftmao.com/blog/categories/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B/index.xml" rel="self" type="application/rss+xml" /><item>
      <title>十年前泡论坛啃书，现在问 AI：软件知识的分层与获取地图</title>
      <link>https://ftmao.com/blog/posts/how-to-get-reliable-tech-knowledge-in-ai-era/</link>
      <pubDate>Mon, 28 Sep 2026 16:00:00 +0800</pubDate>
      <guid>https://ftmao.com/blog/posts/how-to-get-reliable-tech-knowledge-in-ai-era/</guid>
      <description>&lt;h1 id=&#34;十年前泡论坛啃书现在问-ai软件知识的分层与获取地图&#34;&gt;十年前泡论坛啃书，现在问 AI：软件知识的分层与获取地图&lt;/h1&gt;
&lt;p&gt;先想象一个具体的任务：&lt;strong&gt;你要从零做一个秒杀下单系统&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;如果是 2015 年，你的路径大概是这样的：买《深入理解 Nginx》《Redis 设计与实现》，泡博客园和 ITEye，搜&amp;quot;秒杀系统 架构&amp;quot;找到几篇大厂的分享 PPT 如获至宝，照着 CSDN 上的帖子抄一段 Nginx 配置，跑不通就去 QQ 群里问。一个消息队列的选型，可能要在论坛里翻几十页帖子。&lt;/p&gt;
&lt;p&gt;如果是 2026 年，你打开 AI 问一句：&amp;ldquo;帮我拆解一个秒杀系统的技术选型和坑。&amp;ldquo;十秒钟，一份看起来像模像样的方案就出来了。&lt;/p&gt;
&lt;p&gt;然后呢？然后你照着 AI 给的代码配 Spring Boot，启动报错——它引用的包名是 Spring Boot 2 的。你问它 Redis 最新版本怎么配，它给你的参数三年前就废弃了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;渠道换了三代，踩的坑是同一个&lt;/strong&gt;：渠道选错，往往不是信息不够，而是拿错了知识层次。这篇文章想讲清楚两件事：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;软件知识分层，每一层有各自唯一靠谱的获取渠道；&lt;/li&gt;
&lt;li&gt;从&amp;quot;论坛时代&amp;quot;到&amp;quot;AI 时代&amp;rdquo;，每一层的渠道具体是怎么变迁的。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;一spring-boot-和-netty其实是两个层面的东西&#34;&gt;一、Spring Boot 和 Netty，其实是两个层面的东西&lt;/h2&gt;
&lt;p&gt;学习清单上它们常常排在一起：&amp;ldquo;Spring Boot、Redis、MQ、Nginx、Netty。&amp;rdquo;&lt;/p&gt;
&lt;p&gt;但如果看它们各自真正难的部分，这五个名字其实落在四个不同的层次上：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;技术&lt;/th&gt;
					&lt;th&gt;它真正难的部分&lt;/th&gt;
					&lt;th&gt;属于哪层&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Nginx、Netty&lt;/td&gt;
					&lt;td&gt;Reactor 模型、epoll、零拷贝、内存管理&lt;/td&gt;
					&lt;td&gt;贴着操作系统网络的底层组件，核心知识半衰期 &lt;strong&gt;10 年+&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Redis、MQ（Kafka/RocketMQ）&lt;/td&gt;
					&lt;td&gt;数据结构、持久化策略、副本协议、消息语义&lt;/td&gt;
					&lt;td&gt;中间件，核心知识半衰期 &lt;strong&gt;5~8 年&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Spring Boot&lt;/td&gt;
					&lt;td&gt;自动装配、约定优于配置、生态整合&lt;/td&gt;
					&lt;td&gt;应用组装框架，半衰期 &lt;strong&gt;3~5 年&lt;/strong&gt;，小版本还在月月变&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;用上面这些搭一个秒杀系统&lt;/td&gt;
					&lt;td&gt;流量整形、幂等、分布式事务、降级预案&lt;/td&gt;
					&lt;td&gt;方案层，跟着业务实践走，&lt;strong&gt;没有教材，只有案例&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;层次不同，学法就不同：试图&amp;quot;背&amp;quot;Spring Boot 的配置（该查不背），或者试图靠刷博客学懂 Netty 的 EventLoop（该啃源码），都是拿错了工具。&lt;strong&gt;层次错位，是学习效率低的第一大原因。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;二四层知识四个时代的入口&#34;&gt;二、四层知识，四个时代的入口&lt;/h2&gt;
&lt;p&gt;把上面的分层展开，逐层对比&amp;quot;过去去哪获取&amp;quot;和&amp;quot;现在去哪获取&amp;rdquo;：&lt;/p&gt;
&lt;h3 id=&#34;原理层reactorcapb-树tcp&#34;&gt;原理层：Reactor、CAP、B+ 树、TCP&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;过去&lt;/strong&gt;：经典书和论文是唯一入口。《UNIX 网络编程》《TCP/IP 详解》摆在桌上，啃不动就是啃不动，没人能救你。这层知识获取的瓶颈从来不是&amp;quot;找不到&amp;quot;，而是&amp;quot;读不懂&amp;quot;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;现在&lt;/strong&gt;：书还是那批书——原理层十几年不变，没有新书可写。但多了一件过去不存在的东西：&lt;strong&gt;AI 是随问随答的讲解员&lt;/strong&gt;。&amp;ldquo;用大白话解释 Reactor 和 Proactor 的区别&amp;rdquo;、&amp;ldquo;CAP 里的 P 为什么必须满足&amp;rdquo;、&amp;ldquo;这段 epoll 代码为什么这么写&amp;rdquo;——过去需要一个导师领着啃的东西，现在可以按你自己的水平反复讲。这大概是 AI 对学习方式最大的真实贡献：&lt;strong&gt;它消灭了原理层的&amp;quot;读不懂&amp;quot;&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id=&#34;组件层netty-的-eventloopredis-的持久化kafka-的副本协议&#34;&gt;组件层：Netty 的 EventLoop、Redis 的持久化、Kafka 的副本协议&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;过去&lt;/strong&gt;：官方文档（英文，劝退）+ 源码硬啃 + 少数系统化的书（《Redis 设计与实现》《Netty 权威指南》《Kafka 权威指南》）。肯读源码的人和不读的人，差距就在这一层拉开。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;现在&lt;/strong&gt;：锚点没变——官方文档和源码仍然是这一层唯一的事实来源。变的是&lt;strong&gt;门槛&lt;/strong&gt;：把 &lt;code&gt;NioEventLoop&lt;/code&gt; 的一段源码贴给 AI 问&amp;quot;这段在干嘛&amp;quot;，比自己在调用栈里迷路快十倍。书的意义也变了：不再是唯一的系统材料，而是帮你建立地图——地图有了，细节让 AI 陪你在源码里走。&lt;/p&gt;
&lt;p&gt;各组件的锚点，顺手列一下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Spring Boot&lt;/strong&gt;：spring.io 的官方 Guides + Reference；版本变化看 GitHub release notes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Redis&lt;/strong&gt;：redis.io 官方文档，每个命令一页带复杂度说明，质量极高&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kafka&lt;/strong&gt;：官方文档的 Design 章节，分布式系统教学级材料，值得全文读&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RocketMQ&lt;/strong&gt;：GitHub 仓库里的架构文档，配合 &lt;code&gt;DefaultMQProducer&lt;/code&gt; 源码读一遍发送流程&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nginx&lt;/strong&gt;：nginx.org 指令文档是&amp;quot;查&amp;quot;的，不是&amp;quot;学&amp;quot;的；架构思想看《深入理解 Nginx》&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Netty&lt;/strong&gt;：官方 User Guide 很短，真正的教材是 &lt;code&gt;NioEventLoop&lt;/code&gt; 源码本身&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;版本层spring-boot-3-的配置项redis-7-的新命令&#34;&gt;版本层：Spring Boot 3 的配置项、Redis 7 的新命令&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;过去&lt;/strong&gt;：本来就该看官方 release notes，但很多人不看——踩了坑再去搜博客，搜到别人踩过的同一个坑。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;现在&lt;/strong&gt;：&lt;strong&gt;这一层是唯一没有被 AI 改善、反而被 AI 污染的层&lt;/strong&gt;。AI 有知识截止日期，且会一本正经地编造不存在的配置项和 API。它记忆里的版本知识只能当初稿，不能当答案。正确姿势有两种：一是回归原始动作，直接去官方文档和 release notes 抄；二是把官方文档页面喂给 AI 当上下文再提问（或用 Context7、DeepWiki 这类把最新文档索引给 AI 的工具），让 AI 基于真实文档回答，而不是基于记忆编造。&lt;/p&gt;
&lt;p&gt;一句话：&lt;strong&gt;版本层的知识不要&amp;quot;学&amp;quot;，要&amp;quot;查&amp;quot;，唯一权威是官方文档。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;方案层秒杀订单幂等分布式事务&#34;&gt;方案层：秒杀、订单幂等、分布式事务&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;过去&lt;/strong&gt;：这是最难获取的一层。官方文档不管组合，书上没有，只能靠大厂技术博客、QCon/ArchSummit 的大会 PPT、以及口口相传。当年能拿到一份大厂秒杀架构的分享 PPT，如获至宝不是修辞，是事实。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;现在&lt;/strong&gt;：大厂博客依然是主力（地址整理在第四节），但增量有两个：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;成熟的开源脚手架&lt;/strong&gt;——mall、RuoYi 这类 Star 数高、持续更新的项目，看它们怎么把组件接起来、怎么处理幂等和分布式事务。重点看 issue 区，坑都在那里。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI 能做方案 review&lt;/strong&gt;——把你的设计贴给它问&amp;quot;这个链路哪里会丢消息&amp;quot;，它能列出你该检查的清单。它给出的方案未必对，但它给出的&amp;quot;检查清单&amp;quot;通常很全。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;还有一条没变过：&lt;strong&gt;看十篇方案不如自己搭一遍&lt;/strong&gt;。用 Docker Compose 把 MySQL + Redis + RocketMQ + Nginx 拉起来，写一个下单扣库存接口，把消息丢失、缓存穿透、重复消费全踩一遍。踩过的坑才是你的方案。&lt;/p&gt;
&lt;h2 id=&#34;三把例子走完秒杀系统的四层拆解&#34;&gt;三、把例子走完：秒杀系统的四层拆解&lt;/h2&gt;
&lt;p&gt;回到开头的任务，把&amp;quot;做一个秒杀系统&amp;quot;拆到四层，每层的获取动作清清楚楚：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;层&lt;/th&gt;
					&lt;th&gt;秒杀系统里对应的问题&lt;/th&gt;
					&lt;th&gt;2015 年的动作&lt;/th&gt;
					&lt;th&gt;2026 年的动作&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;原理层&lt;/td&gt;
					&lt;td&gt;为什么用队列削峰（流量整形）；超卖的本质是并发控制&lt;/td&gt;
					&lt;td&gt;啃书，啃不动就放弃&lt;/td&gt;
					&lt;td&gt;书 + AI 讲到懂为止&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;组件层&lt;/td&gt;
					&lt;td&gt;Redis Lua 扣库存的原子性；RocketMQ 事务消息&lt;/td&gt;
					&lt;td&gt;官方文档 + 源码硬啃&lt;/td&gt;
					&lt;td&gt;文档源码仍是锚点，AI 当导读&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;版本层&lt;/td&gt;
					&lt;td&gt;Spring Boot 3 整合 Redis 的依赖坐标；RocketMQ 5.x 客户端配置&lt;/td&gt;
					&lt;td&gt;踩坑后搜博客&lt;/td&gt;
					&lt;td&gt;官方文档抄，或喂文档给 AI&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;方案层&lt;/td&gt;
					&lt;td&gt;整条链路怎么组装、降级预案怎么定&lt;/td&gt;
					&lt;td&gt;大厂 PPT + 口口相传&lt;/td&gt;
					&lt;td&gt;大厂博客 + 开源脚手架 + AI review + 自己搭&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;注意一个细节：四层里只有原理层和方案层的&amp;quot;获取&amp;quot;被 AI 真正改变了；组件层是门槛降低，版本层反而要多一道验证。&lt;strong&gt;AI 没有改变知识的层次结构，只改变了每一层的获取效率。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;四趋势在哪看&#34;&gt;四、趋势在哪看&lt;/h2&gt;
&lt;p&gt;趋势是方案层之上的东西：不告诉你 API 怎么写，但告诉你行业在往哪走。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;过去&lt;/strong&gt;：书和杂志的序言、线下大会、以及&amp;quot;听说隔壁公司在用什么&amp;quot;。信息慢，但噪声也小。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;现在&lt;/strong&gt;：信号源多了，按信号强度排序——&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GitHub Trending + Awesome 系列&lt;/strong&gt;：trending 看热度，awesome-xxx 看生态成熟度。一个方向的 awesome 列表两年没更新，基本就是凉了。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;顶级会议议题表&lt;/strong&gt;：KubeCon、QCon/ArchSummit、Spring I/O、AWS re:Invent。连续三年都有专场的话题，已经不是趋势，是现实。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ThoughtWorks 技术雷达&lt;/strong&gt;：半年一期，敢说&amp;quot;暂缓&amp;quot;，比只会吹捧的报告值钱。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;年度调查&lt;/strong&gt;：Stack Overflow / JetBrains 开发者报告。&amp;ldquo;实际在用什么&amp;quot;和&amp;quot;媒体在吹什么&amp;quot;的差值，就是泡沫。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;大厂技术博客&lt;/strong&gt;：他们踩过的坑，就是你两年后的日常。常用入口（RSS 为发文前实测可用）：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;国内：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;团队&lt;/th&gt;
					&lt;th&gt;地址&lt;/th&gt;
					&lt;th&gt;RSS / 订阅方式&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;美团技术团队&lt;/td&gt;
					&lt;td&gt;&lt;a href=&#34;https://tech.meituan.com/&#34;&gt;tech.meituan.com&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;&lt;a href=&#34;https://tech.meituan.com/feed/&#34;&gt;RSS&lt;/a&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;阿里（淘天/阿里云等）&lt;/td&gt;
					&lt;td&gt;&lt;a href=&#34;https://developer.aliyun.com/group&#34;&gt;阿里云开发者社区&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;无官方 RSS，可用 &lt;a href=&#34;https://docs.rsshub.app/&#34;&gt;RSSHub&lt;/a&gt; 生成&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;字节跳动技术团队&lt;/td&gt;
					&lt;td&gt;&lt;a href=&#34;https://juejin.cn/user/1838039172387262&#34;&gt;掘金官方号&lt;/a&gt;、&lt;a href=&#34;https://opensource.bytedance.com/blog&#34;&gt;开源官网博客&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;无官方 RSS，可用 RSSHub 生成&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;腾讯云开发者&lt;/td&gt;
					&lt;td&gt;&lt;a href=&#34;https://cloud.tencent.com/developer&#34;&gt;cloud.tencent.com/developer&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;无官方 RSS&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;国外：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;团队&lt;/th&gt;
					&lt;th&gt;地址&lt;/th&gt;
					&lt;th&gt;RSS&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Netflix&lt;/td&gt;
					&lt;td&gt;&lt;a href=&#34;https://netflixtechblog.com/&#34;&gt;netflixtechblog.com&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;&lt;a href=&#34;https://netflixtechblog.com/feed&#34;&gt;RSS&lt;/a&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Meta Engineering&lt;/td&gt;
					&lt;td&gt;&lt;a href=&#34;https://engineering.fb.com/&#34;&gt;engineering.fb.com&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;&lt;a href=&#34;https://engineering.fb.com/feed/&#34;&gt;RSS&lt;/a&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;AWS&lt;/td&gt;
					&lt;td&gt;&lt;a href=&#34;https://aws.amazon.com/blogs/&#34;&gt;aws.amazon.com/blogs&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;&lt;a href=&#34;https://aws.amazon.com/blogs/aws/feed/&#34;&gt;RSS&lt;/a&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Uber&lt;/td&gt;
					&lt;td&gt;&lt;a href=&#34;https://www.uber.com/blog/engineering/&#34;&gt;uber.com/blog/engineering&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;无公开 RSS&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Google Developers&lt;/td&gt;
					&lt;td&gt;&lt;a href=&#34;https://developers.googleblog.com/&#34;&gt;developers.googleblog.com&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;页面提供 Atom 订阅&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;国内团队不提供 RSS 的居多（内容越来越多迁到公众号和自家社区），两个补救办法：用 RSSHub 把社区页面转成 RSS；或者干脆不订阅，按季度扫一遍历史文章列表——好内容不怕晚三个月。&lt;/p&gt;
&lt;p&gt;无论渠道怎么变，趋势这东西&lt;strong&gt;季度性地扫一眼就够了&lt;/strong&gt;。天天刷只会制造焦虑。真正值得追的趋势，三个月后它还在。&lt;/p&gt;
&lt;h2 id=&#34;五ai-时代真正改变的三件事&#34;&gt;五、AI 时代真正改变的三件事&lt;/h2&gt;
&lt;p&gt;把全文收拢成三句话：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;原理层的获取成本坍缩了。&lt;/strong&gt; 过去最大的瓶颈&amp;quot;读不懂&amp;quot;被 AI 消灭了——这是学习方式上最深刻的改变，没有之一。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;验证变得比知道重要。&lt;/strong&gt; AI 会编，尤其在版本层。靠谱的工作流只剩三步：AI 讲原理 → 官方文档定版本 → 跑起来验证。跑不通，把报错喂回去让它修。AI 时代最值钱的技能不是&amp;quot;知道答案&amp;rdquo;，而是&amp;quot;会写验证答案的实验&amp;quot;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;提问质量 = 知识杠杆率。&lt;/strong&gt; &amp;ldquo;Redis 怎么用&amp;quot;和&amp;quot;Spring Boot 3.2 + Redis 7，Lettuce 客户端，缓存用户会话 TTL 30 分钟，缓存穿透怎么处理，给最小示例&amp;rdquo;——后者的答案质量是前者的十倍。你掌握的原理层知识越多，问题就描述得越精确，AI 的产出就越好。&lt;strong&gt;底层知识没有贬值，它变成了杠杆。&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;获取渠道换了三代：书 → 博客论坛 → 公众号 → AI。不变的是知识的分层，和你对&amp;quot;什么知识值得花时间&amp;quot;的判断力。AI 让&amp;quot;知道&amp;quot;变得廉价，让&amp;quot;验证&amp;quot;和&amp;quot;判断&amp;quot;变得昂贵——未来拉开差距的，不是谁知道得多，而是谁分得清：哪句话该信 AI，哪句话必须去翻官方文档。&lt;/p&gt;
</description>
    </item>
    <item>
      <title>《领域驱动设计·精简版》详解：零基础读懂 DDD 的核心概念</title>
      <link>https://ftmao.com/blog/posts/domain-driven-design-quickly-book-notes/</link>
      <pubDate>Sat, 29 Jul 2023 14:00:00 +0800</pubDate>
      <guid>https://ftmao.com/blog/posts/domain-driven-design-quickly-book-notes/</guid>
      <description>&lt;h1 id=&#34;领域驱动设计精简版详解零基础读懂-ddd-的核心概念&#34;&gt;《领域驱动设计·精简版》详解：零基础读懂 DDD 的核心概念&lt;/h1&gt;
&lt;p&gt;DDD 要回答的问题是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;软件是为了解决现实业务问题而存在的，可为什么代码写着写着，就和业务彻底脱节了？&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Eric Evans 的答案是：问题出在&amp;quot;模型&amp;quot;上。业务在领域专家脑子里，代码在程序员手里，中间隔着层层&amp;quot;翻译&amp;quot;，每翻译一次就失真一次。DDD 的全部内容，就是围绕&amp;quot;如何建立一个好模型、并让模型直接活在代码里&amp;quot;展开的。&lt;/p&gt;
&lt;p&gt;本文面向&lt;strong&gt;从未接触过 DDD&lt;/strong&gt; 的读者，按全书结构逐章展开，配合图解和实例，帮你建立完整的知识地图。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;第-1-章-简介软件为什么会偏离领域&#34;&gt;第 1 章 简介：软件为什么会偏离领域&lt;/h2&gt;
&lt;h3 id=&#34;领域与领域模型&#34;&gt;领域与领域模型&lt;/h3&gt;
&lt;p&gt;**领域（Domain）**就是软件要解决的那个现实问题。做银行系统，金融业务就是领域；做空中交通监控，航线和飞行就是领域。&lt;/p&gt;
&lt;p&gt;书里用了一个类比：造汽车。工人们各自负责某个零件，但如果没人理解整车，造出来的只是一堆零件的集合体，不是一辆好车。软件也一样——&lt;strong&gt;你不能在对金融业务一无所知的情况下写出好的银行软件&lt;/strong&gt;。谁懂业务？不是架构师，不是分析师，是&lt;strong&gt;领域专家&lt;/strong&gt;（银行的业务人员、空管的调度员）。&lt;/p&gt;
&lt;p&gt;但领域知识是海量而杂乱的，不可能全部塞进软件。我们需要从中建立&lt;strong&gt;抽象&lt;/strong&gt;——即&lt;strong&gt;领域模型（Domain Model）&lt;/strong&gt;：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;模型不是一张图，也不是专家脑子里的全部知识，而是&amp;quot;经过严格组织并进行选择性抽象的知识&amp;quot;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;建模意味着取舍。银行软件会记录客户的住址，但绝不会记录客户眼睛的颜色——前者是业务需要的，后者不是。&lt;strong&gt;选择保留什么、放弃什么，正是建模的核心工作&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id=&#34;书里的案例空中交通监控系统&#34;&gt;书里的案例：空中交通监控系统&lt;/h3&gt;
&lt;p&gt;全书反复使用同一个例子：空中交通监控系统。飞机（Aircraft）按计划航线（Route）飞行，航线由一系列定位点（Fix）组成，每个定位点是一个三维坐标（3DPoint：经度、纬度、海拔）。系统接收雷达数据，计算飞机的真实飞行轨道，发现两架飞机航线可能交叉时向管制员报警。&lt;/p&gt;
&lt;p&gt;最初的设计里，Route 直接关联 3DPoint，后来团队发现：地面屏幕上显示的航线其实只需要二维投影，于是模型被重构为 Route 关联 2DPoint——&lt;strong&gt;模型随理解的加深而演进&lt;/strong&gt;，这正是 DDD 强调的动态过程。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;第-2-章-通用语言ubiquitous-language&#34;&gt;第 2 章 通用语言（Ubiquitous Language）&lt;/h2&gt;
&lt;h3 id=&#34;翻译是万恶之源&#34;&gt;翻译是万恶之源&lt;/h3&gt;
&lt;p&gt;开发人员和领域专家说着两种语言：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;开发人员满脑子是类、方法、继承、多态、框架；&lt;/li&gt;
&lt;li&gt;领域专家满口是飞机、航线、海拔、偏航告警。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;于是每次沟通都在&amp;quot;翻译&amp;quot;：开发人员把业务术语翻译成技术概念去写代码，再把技术实现翻译回业务语言去汇报。&lt;strong&gt;每一次翻译都丢失信息，错误理解就这样悄悄积累&lt;/strong&gt;。更糟的是，很多时候团队连&amp;quot;翻译错了&amp;quot;都发现不了，直到软件上线才爆发。&lt;/p&gt;
&lt;h3 id=&#34;用模型当语言的骨架&#34;&gt;用模型当语言的骨架&lt;/h3&gt;
&lt;p&gt;DDD 的核心原则之一：&lt;strong&gt;使用一种基于模型的语言进行所有交流&lt;/strong&gt;——讨论用它，文档用它，代码里的类名、方法名也用它。因为语言贯穿所有交流形式，所以叫&lt;strong&gt;通用语言（Ubiquitous Language）&lt;/strong&gt;。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    subgraph 传统方式[&amp;#34;传统方式：靠翻译，层层失真&amp;#34;]
        E1[&amp;#34;领域专家&amp;lt;br/&amp;gt;（业务行话）&amp;#34;] --&amp;gt;|需求翻译| A1[&amp;#34;分析师文档&amp;#34;]
        A1 --&amp;gt;|设计翻译| D1[&amp;#34;开发人员&amp;#34;]
        D1 --&amp;gt;|代码实现| C1[(&amp;#34;代码&amp;lt;br/&amp;gt;（第三套术语）&amp;#34;)]
    end
    subgraph DDD方式[&amp;#34;DDD 方式：一种语言贯通&amp;#34;]
        E2[&amp;#34;领域专家&amp;#34;] &amp;lt;==&amp;gt;|&amp;#34;通用语言&amp;lt;br/&amp;gt;（基于领域模型）&amp;#34;| D2[&amp;#34;开发人员&amp;#34;]
        D2 --- C2[(&amp;#34;代码 = 模型&amp;lt;br/&amp;gt;术语完全一致&amp;#34;)]
        E2 --- C2
    end&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;实例&lt;/strong&gt;：空管系统里有个概念叫&amp;quot;偏航告警&amp;quot;。如果代码里叫 &lt;code&gt;YawDeviationWarningProcessor&lt;/code&gt;，而管制员嘴里叫&amp;quot;偏航告警&amp;quot;，需求评审时大家讨论的是 A，代码里实现的是 B，三个月后没人能对上号。按 DDD 的做法，团队约定统一叫&amp;quot;偏航告警（RouteDeviationAlert）&amp;quot;，类名、数据库表、会议讨论全部用同一个词——模型和代码之间不再存在翻译层。&lt;/p&gt;
&lt;p&gt;通用语言不是一次定稿的，它随模型的演进而演进：&lt;strong&gt;当你发现某个词说不清一件事，往往不是表达问题，而是模型有问题&lt;/strong&gt;——这就是重构的信号。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;第-3-章-模型驱动设计model-driven-design&#34;&gt;第 3 章 模型驱动设计（Model-Driven Design）&lt;/h2&gt;
&lt;p&gt;这是全书篇幅最大的一章，讲模型怎么落地成代码。Eric Evans 提供了一套标准化的&amp;quot;构造块&amp;quot;（Building Blocks）。&lt;/p&gt;
&lt;h3 id=&#34;分层架构&#34;&gt;分层架构&lt;/h3&gt;
&lt;p&gt;先把领域层隔离出来，别让业务逻辑散落在界面和数据库代码里：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TD
    UI[&amp;#34;用户界面层&amp;lt;br/&amp;gt;展示信息、接收输入&amp;#34;]
    APP[&amp;#34;应用层&amp;lt;br/&amp;gt;协调任务、编排流程&amp;lt;br/&amp;gt;（很薄，不含业务规则）&amp;#34;]
    DOM[&amp;#34;领域层&amp;lt;br/&amp;gt;★ 业务概念、业务规则、业务状态&amp;lt;br/&amp;gt;模型的家&amp;#34;]
    INFRA[&amp;#34;基础设施层&amp;lt;br/&amp;gt;持久化、消息、框架支撑&amp;#34;]
    UI --&amp;gt; APP --&amp;gt; DOM
    INFRA -.支撑.- DOM&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;关键原则：&lt;strong&gt;领域层不依赖界面，不被基础设施污染&lt;/strong&gt;。判断标准很简单——把界面整个换掉（比如从网页换成 App），领域层应该一行都不用改。&lt;/p&gt;
&lt;h3 id=&#34;七个构造块&#34;&gt;七个构造块&lt;/h3&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    subgraph 领域层[&amp;#34;领域层的构造块&amp;#34;]
        direction TB
        E[&amp;#34;实体 Entity&amp;lt;br/&amp;gt;有身份，有生命周期&amp;#34;]
        VO[&amp;#34;值对象 Value Object&amp;lt;br/&amp;gt;无身份，不可变&amp;#34;]
        S[&amp;#34;服务 Service&amp;lt;br/&amp;gt;不属于任何对象的操作&amp;#34;]
        M[&amp;#34;模块 Module&amp;lt;br/&amp;gt;按概念分组&amp;#34;]
        AGG[&amp;#34;聚合 Aggregate&amp;lt;br/&amp;gt;一致性边界 + 聚合根&amp;#34;]
        F[&amp;#34;工厂 Factory&amp;lt;br/&amp;gt;封装复杂创建&amp;#34;]
        R[&amp;#34;资源库 Repository&amp;lt;br/&amp;gt;封装查询与重建&amp;#34;]
        AGG --&amp;gt; E
        AGG --&amp;gt; VO
        F --&amp;gt; AGG
        R --&amp;gt; AGG
    end&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h4 id=&#34;-实体entity靠身份区分&#34;&gt;① 实体（Entity）：靠&amp;quot;身份&amp;quot;区分&lt;/h4&gt;
&lt;p&gt;有些对象，即使属性全变了，它还是&amp;quot;它&amp;quot;。一架飞机换了涂装、换了座椅布局，航班号 CA1234 还是那架飞机。&lt;strong&gt;实体由身份标识（ID）定义，而不是属性&lt;/strong&gt;。人也是典型的实体——同名同姓的两个人依然是两个人。&lt;/p&gt;
&lt;h4 id=&#34;-值对象value-object靠属性区分&#34;&gt;② 值对象（Value Object）：靠&amp;quot;属性&amp;quot;区分&lt;/h4&gt;
&lt;p&gt;有些对象没有身份，只描述&amp;quot;是什么&amp;quot;。地址&amp;quot;北京市海淀区某路 1 号&amp;quot;就是值对象：两个地址属性完全相同，就是同一个地址，可以互换、可以共享。值对象应该是&lt;strong&gt;不可变的&lt;/strong&gt;——要改就新建一个。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;新手最常见的错误是把一切都建成实体&lt;/strong&gt;。书里建议：优先考虑值对象，只有当&amp;quot;身份&amp;quot;确实重要时才用实体——值对象更简单、更安全、性能更好。&lt;/p&gt;
&lt;h4 id=&#34;-服务service无家可归的操作&#34;&gt;③ 服务（Service）：无家可归的操作&lt;/h4&gt;
&lt;p&gt;有些操作天然不属于任何实体或值对象。比如&amp;quot;转账&amp;quot;：钱从 A 账户到 B 账户，这个操作该挂在 A 身上还是 B 身上？都不合适。把它做成一个领域服务 &lt;code&gt;TransferService&lt;/code&gt;。判断标准：&lt;strong&gt;操作的概念属于领域，但它本身是无状态的&lt;/strong&gt;。&lt;/p&gt;
&lt;h4 id=&#34;-模块module高内聚低耦合的分组&#34;&gt;④ 模块（Module）：高内聚、低耦合的分组&lt;/h4&gt;
&lt;p&gt;把概念上紧密相关的类放进同一个模块。&lt;strong&gt;模块名也应该进入通用语言&lt;/strong&gt;——当团队说&amp;quot;这是计费模块的事&amp;quot;，所有人都知道边界在哪。&lt;/p&gt;
&lt;h4 id=&#34;-聚合aggregate一致性的边界&#34;&gt;⑤ 聚合（Aggregate）：一致性的边界&lt;/h4&gt;
&lt;p&gt;对象之间关系复杂时，改一个对象可能牵连一片。聚合的解法是：&lt;strong&gt;把关联紧密的对象圈进一个边界，选一个实体做&amp;quot;聚合根&amp;quot;（Aggregate Root），外部只能通过根访问内部对象&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;书里的例子：客户（Customer）是聚合根，地址（Address）、联系人是内部对象。外部想要地址？找客户要，拿到的是一个拷贝，不能直接改——所有对聚合内部的修改都经过根把关，不变量（invariant）就有了守护者。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TD
    subgraph 聚合边界[&amp;#34;聚合边界&amp;#34;]
        ROOT[&amp;#34;客户 Customer&amp;lt;br/&amp;gt;（聚合根）&amp;#34;]
        ADDR[&amp;#34;地址 Address&amp;#34;]
        CONTACT[&amp;#34;联系人 Contact&amp;#34;]
        ROOT --&amp;gt; ADDR
        ROOT --&amp;gt; CONTACT
    end
    OUT[&amp;#34;外部对象&amp;#34;] --&amp;gt;|&amp;#34;只能持有根的引用&amp;#34;| ROOT
    OUT -.-&amp;gt;|&amp;#34;禁止直接访问&amp;#34;| ADDR&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h4 id=&#34;-工厂factory封装怎么造&#34;&gt;⑥ 工厂（Factory）：封装&amp;quot;怎么造&amp;quot;&lt;/h4&gt;
&lt;p&gt;创建一个复杂聚合涉及大量知识：内部结构、对象间关系、初始规则。如果让调用方自己 &lt;code&gt;new&lt;/code&gt; 再拼装，等于&amp;quot;给你塑胶、橡胶、金属、硅，自己组装一台打印机&amp;quot;——组装知识泄漏到了所有调用点。&lt;strong&gt;工厂把创建逻辑收进一处&lt;/strong&gt;，客户只要说&amp;quot;我要一个完整的客户聚合&amp;quot;。&lt;/p&gt;
&lt;h4 id=&#34;-资源库repository封装怎么找&#34;&gt;⑦ 资源库（Repository）：封装&amp;quot;怎么找&amp;quot;&lt;/h4&gt;
&lt;p&gt;对象创建后存进数据库，之后要用时再取出来。资源库给领域对象提供一个&amp;quot;像集合一样&amp;quot;的查询接口（&lt;code&gt;findById&lt;/code&gt;、&lt;code&gt;findByName&lt;/code&gt;），把 SQL 和 ORM 细节全部藏在背后。&lt;strong&gt;领域代码面对的好像是一个内存中的对象集合&lt;/strong&gt;，至于底下是 MySQL 还是 MongoDB，领域层不关心。&lt;/p&gt;
&lt;p&gt;三者分工一句话：&lt;strong&gt;工厂管出生，资源库管找回，聚合管活着时的一致性&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;第-4-章-面向深层理解的重构&#34;&gt;第 4 章 面向深层理解的重构&lt;/h2&gt;
&lt;p&gt;模型不是一次画对的。随着对业务理解的加深，团队会不断发现&amp;quot;原来的模型表达不了新需求&amp;quot;。DDD 的态度是：&lt;strong&gt;持续重构，并且专门朝&amp;quot;深层理解&amp;quot;的方向重构&lt;/strong&gt;——不是消除代码重复那种技术重构，而是当领域专家随口说出一个新概念时，敏锐地意识到&amp;quot;这个词值得成为模型里的一等公民&amp;quot;。&lt;/p&gt;
&lt;p&gt;书里称之为&lt;strong&gt;凸现关键概念&lt;/strong&gt;：把隐晦的、散落在各处的业务规则，提炼成显式的类和方法。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;实例&lt;/strong&gt;：空管系统最初把&amp;quot;两机航线交叉判断&amp;quot;写在一段几百行的过程代码里。重构后，团队把它提炼成 &lt;code&gt;FlightPathConflict&lt;/code&gt; 对象和 &lt;code&gt;conflictsWith()&lt;/code&gt; 方法——业务规则从&amp;quot;代码的副作用&amp;quot;变成了&amp;quot;模型中可以直接讨论的概念&amp;quot;。测试可以单独写，管制员和开发可以用同一个词讨论它。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;第-5-章-保持模型一致性大型项目的生存法则&#34;&gt;第 5 章 保持模型一致性：大型项目的生存法则&lt;/h2&gt;
&lt;p&gt;前面讲的都是&amp;quot;一个团队、一个模型&amp;quot;的情况。企业级项目有多个团队并行开发，理想中&amp;quot;全公司统一的大模型&amp;quot;实际上根本维持不住——每个团队都知道自己后院里有什么，但对其他地方一无所知，改一处就可能破坏别人的功能。&lt;/p&gt;
&lt;p&gt;Eric Evans 的结论很反直觉：&lt;strong&gt;不要试图维持一个注定四分五裂的大模型，而是有意识地把大模型拆成几个小模型，每个模型有清晰的边界&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id=&#34;界定的上下文bounded-context&#34;&gt;界定的上下文（Bounded Context）&lt;/h3&gt;
&lt;p&gt;每个模型只在一个明确的边界内有效，这个边界叫界定的上下文。同一个词在不同上下文里可以有完全不同的含义：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;实例&lt;/strong&gt;：电商系统里&amp;quot;商品&amp;quot;这个词——&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在&lt;strong&gt;销售上下文&lt;/strong&gt;里，它有价格、促销、库存；&lt;/li&gt;
&lt;li&gt;在&lt;strong&gt;物流上下文&lt;/strong&gt;里，它只有重量、体积、包装方式；&lt;/li&gt;
&lt;li&gt;在&lt;strong&gt;售后上下文&lt;/strong&gt;里，它只有保修期和维修记录。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;试图用一个统一的 &lt;code&gt;Product&lt;/code&gt; 类满足三个团队，结果一定是个臃肿的&amp;quot;上帝类&amp;quot;。承认三个上下文各有各的&amp;quot;商品&amp;quot;，反而各自清晰。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    subgraph 销售上下文[&amp;#34;销售上下文&amp;#34;]
        P1[&amp;#34;商品：价格/促销/库存&amp;#34;]
    end
    subgraph 物流上下文[&amp;#34;物流上下文&amp;#34;]
        P2[&amp;#34;商品：重量/体积/包装&amp;#34;]
    end
    subgraph 售后上下文[&amp;#34;售后上下文&amp;#34;]
        P3[&amp;#34;商品：保修期/维修记录&amp;#34;]
    end
    P1 &amp;lt;--&amp;gt;|&amp;#34;上下文映射&amp;lt;br/&amp;gt;（翻译）&amp;#34;| P2
    P2 &amp;lt;--&amp;gt;|&amp;#34;上下文映射&amp;#34;| P3&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;上下文之间的六种关系模式&#34;&gt;上下文之间的六种关系模式&lt;/h3&gt;
&lt;p&gt;上下文不能各自为战，它们之间需要集成。书里给出了一组模式，按&amp;quot;两个团队的合作意愿和权力关系&amp;quot;来选择：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TD
    Q{&amp;#34;两个上下文如何共处？&amp;#34;}
    Q --&amp;gt;|&amp;#34;愿意深度共享代码&amp;#34;| SK[&amp;#34;共享内核 Shared Kernel&amp;lt;br/&amp;gt;划出一块双方都依赖的小模型&amp;lt;br/&amp;gt;共同维护，改动需协商&amp;#34;]
    Q --&amp;gt;|&amp;#34;上下游关系明确&amp;#34;| CS[&amp;#34;客户-供应商 Customer-Supplier&amp;lt;br/&amp;gt;上游按下游需求规划开发&amp;#34;]
    Q --&amp;gt;|&amp;#34;下游无力影响上游&amp;#34;| CF[&amp;#34;顺从者 Conformist&amp;lt;br/&amp;gt;直接采用上游模型，放弃翻译&amp;#34;]
    Q --&amp;gt;|&amp;#34;要对接脏乱差的遗留系统&amp;#34;| ACL[&amp;#34;防崩溃层 Anticorruption Layer&amp;lt;br/&amp;gt;建一层翻译，把污染挡在门外&amp;#34;]
    Q --&amp;gt;|&amp;#34;集成成本 &amp;gt; 收益&amp;#34;| SW[&amp;#34;独立方法 Separate Ways&amp;lt;br/&amp;gt;干脆不集成，各做各的&amp;#34;]
    Q --&amp;gt;|&amp;#34;一个系统被多方集成&amp;#34;| OHS[&amp;#34;开放主机服务 Open Host Service&amp;lt;br/&amp;gt;定义标准协议，免去一对一翻译&amp;#34;]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;几个重点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;上下文映射（Context Map）&lt;/strong&gt;：把所有上下文和它们之间的关系画在一张图上。这张图是大型项目里最重要的架构文档——它让每个团队都看清&amp;quot;我的边界在哪、我和谁有契约&amp;quot;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;共享内核&lt;/strong&gt;：两个团队共用一小部分模型（比如通用的客户标识）。共享意味着牵一发而动全身，所以内核要&lt;strong&gt;尽量小&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;防崩溃层（ACL）&lt;/strong&gt;：对接遗留系统时，遗留模型往往概念混乱。如果直接在自己的代码里用它的概念，好模型会被污染。ACL 是一层专门的翻译器：外面进来的是遗留概念，翻成本地模型再入内。&lt;strong&gt;遗留系统的&amp;quot;腐烂&amp;quot;被挡在层外&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;顺从者 vs 防崩溃层&lt;/strong&gt;：下游对上游没有话语权时，要么顺从（直接用上游模型），要么自建翻译层。前者省成本，后者保纯洁——取决于上游模型的质量。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;开放主机服务&lt;/strong&gt;：当你的系统要被十个团队集成时，给每个团队定制翻译层会把你拖垮。定义一套标准协议（比如一套公共 API），所有集成方遵循它。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;精炼distillation找到核心域&#34;&gt;精炼（Distillation）：找到核心域&lt;/h3&gt;
&lt;p&gt;大模型拆小之后还有一个问题：&lt;strong&gt;哪里最值得投入最优秀的人力？&lt;strong&gt;答案是&lt;/strong&gt;核心域（Core Domain）&lt;/strong&gt;——代表领域本质、构成业务竞争力的那一小块。&lt;/p&gt;
&lt;p&gt;书里的例子非常精彩：空中交通监控系统里，&amp;ldquo;航线&amp;quot;看起来无处不在，但它其实是个普通概念，很多领域都有航线。系统真正的&amp;quot;心脏&amp;quot;是&lt;strong&gt;基于雷达数据实时计算飞行轨道、发现航线交叉并告警&lt;/strong&gt;的那个模块——这才是这套系统区别于任何普通航线系统的本质，也是最该投入最强团队、精雕细琢的地方。其余部分（普通子域）可以外包、可以买现成组件、可以交给初级团队。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;战略层面的启示：&lt;strong&gt;不是所有代码都值得写好&lt;/strong&gt;。把最好的资源压在核心域上，其他地方&amp;quot;够用就行&amp;rdquo;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;第-6-章-专访-eric-evans&#34;&gt;第 6 章 专访 Eric Evans&lt;/h2&gt;
&lt;p&gt;书末是 InfoQ 对 Eric Evans 的访谈，几个观点值得记住：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DDD 不是新方法，而是对二十年来优秀团队实践的系统化总结；&lt;/li&gt;
&lt;li&gt;DDD 与敏捷并不冲突，恰恰相反——没有好模型的敏捷团队，重构会越来越吃力；&lt;/li&gt;
&lt;li&gt;DDD 的难点不在技术，在于团队是否愿意持续地和领域专家坐在一起打磨模型和语言。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;全书总结一张-ddd-知识地图&#34;&gt;全书总结：一张 DDD 知识地图&lt;/h2&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;mindmap
  root((领域驱动设计&amp;lt;br/&amp;gt;DDD))
    核心思想
      软件是领域的映射
      模型是选择性抽象
      模型直接活在代码里
    通用语言
      一种语言贯穿讨论与代码
      说不清 = 模型有问题
    模型驱动设计
      分层架构
        界面层
        应用层
        领域层
        基础设施层
      构造块
        实体 = 身份
        值对象 = 属性 + 不可变
        服务 = 无状态操作
        聚合 = 一致性边界
        工厂 = 管创建
        资源库 = 管存取
    深层理解
      持续重构
      凸现关键概念
    保持模型一致性
      界定的上下文
      上下文映射
        共享内核
        客户-供应商
        顺从者
        防崩溃层
        独立方法
        开放主机服务
      精炼出核心域&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;DDD 最打动人的地方在于，它把软件开发从&amp;quot;写代码&amp;quot;重新定义为&amp;quot;&lt;strong&gt;持续理解业务、并把理解精确表达出来&lt;/strong&gt;&amp;ldquo;的过程。代码只是表达模型的介质，模型才是资产。&lt;/p&gt;
&lt;p&gt;如果你是零基础读者，建议按这个顺序消化：先吃透&amp;quot;通用语言&amp;rdquo;（它不需要任何技术背景，却能立刻改善团队协作），再掌握七个构造块（写代码时随时对照），最后在有大型项目或微服务需求时再深入&amp;quot;界定上下文&amp;quot;那一套——你会发现近年火热的微服务拆分方法论，思想源头正是这本书的 Bounded Context。&lt;/p&gt;
</description>
    </item>
    <item>
      <title>《领域驱动设计》精简版：一张图看懂 DDD，引用开源 ddd-demo</title>
      <link>https://ftmao.com/blog/posts/domain-driven-design-concise/</link>
      <pubDate>Thu, 27 Jul 2023 20:00:00 +0800</pubDate>
      <guid>https://ftmao.com/blog/posts/domain-driven-design-concise/</guid>
      <description>&lt;h1 id=&#34;领域驱动设计精简版一张图看懂-ddd引用开源-ddd-demo&#34;&gt;《领域驱动设计》精简版：一张图看懂 DDD，引用开源 ddd-demo&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;这份笔记基于 Eric Evans 的《领域驱动设计》以及 Vaughn Vernon 的《实现领域驱动设计》《领域驱动设计精粹》，结合日常工程实践做了补充。文中完整代码实现参考开源项目 &lt;a href=&#34;https://gitee.com/soulnew/ddd-demo&#34;&gt;soulnew/ddd-demo&lt;/a&gt;，可直接克隆运行。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一为什么需要-ddd&#34;&gt;一、为什么需要 DDD？&lt;/h2&gt;
&lt;p&gt;传统分层架构（Controller → Service → DAO）的问题：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;问题&lt;/th&gt;
					&lt;th&gt;表现&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;贫血模型&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Service&lt;/code&gt; 里全是 if/else，Entity 只有 getter/setter&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;语义泄漏&lt;/td&gt;
					&lt;td&gt;业务术语被翻译成 &lt;code&gt;status = 1&lt;/code&gt;，新人读不懂&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;边界模糊&lt;/td&gt;
					&lt;td&gt;一个 &lt;code&gt;OrderService&lt;/code&gt; 同时处理库存、支付、物流&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;复用困难&lt;/td&gt;
					&lt;td&gt;同样叫“用户”，在会员、权限、订单里含义不同&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;DDD 的核心主张：&lt;strong&gt;让软件结构对齐业务领域，用业务语言写代码，用边界保护领域模型&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二一张图ddd-战略-战术全景&#34;&gt;二、一张图：DDD 战略-战术全景&lt;/h2&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;mindmap
  root((领域驱动设计 DDD))
    战略设计 Strategic Design
      领域 Domain
      子域 Subdomain
        核心域 Core
        支撑域 Supporting
        通用域 Generic
      限界上下文 Bounded Context
      上下文映射 Context Mapping
        合作关系 Partnership
        共享内核 Shared Kernel
        客户-供应商 Customer-Supplier
        遵奉者 Conformist
        防腐层 ACL
        开放主机服务 OHS
        发布语言 PL
        各行其道 Separate Ways
    战术设计 Tactical Design
      实体 Entity
      值对象 Value Object
      聚合 Aggregate
      领域服务 Domain Service
      仓储 Repository
      工厂 Factory
      领域事件 Domain Event
      应用服务 Application Service
    统一语言 Ubiquitous Language
    分层架构 Layered Architecture
      用户界面层 UI
      应用层 Application
      领域层 Domain
      基础设施层 Infrastructure&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;记忆口诀&lt;/strong&gt;：先战略（划边界），后战术（建模型），全程讲“统一语言”。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;三战略设计先画地图再打仗&#34;&gt;三、战略设计：先画地图，再打仗&lt;/h2&gt;
&lt;h3 id=&#34;31-领域--问题空间--解决方案空间&#34;&gt;3.1 领域 = 问题空间 + 解决方案空间&lt;/h3&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;graph LR
    A[问题空间&amp;lt;br/&amp;gt;Problem Space] --&amp;gt; B[领域 Domain&amp;lt;br/&amp;gt;业务要解决的问题]
    B --&amp;gt; C[子域 Subdomain&amp;lt;br/&amp;gt;可独立讨论的业务板块]
    C --&amp;gt; D[核心域 Core Domain&amp;lt;br/&amp;gt;竞争优势]
    C --&amp;gt; E[支撑域 Supporting&amp;lt;br/&amp;gt;定制但非核心]
    C --&amp;gt; F[通用域 Generic&amp;lt;br/&amp;gt;可外购/复用]
    D --&amp;gt; G[解决方案空间&amp;lt;br/&amp;gt;Solution Space]
    E --&amp;gt; G
    F --&amp;gt; G
    G --&amp;gt; H[限界上下文 Bounded Context&amp;lt;br/&amp;gt;一个模型只在一个上下文内有效]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;示例：在线医疗平台&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;子域&lt;/th&gt;
					&lt;th&gt;类型&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;问诊&lt;/td&gt;
					&lt;td&gt;核心域&lt;/td&gt;
					&lt;td&gt;核心竞争力，需精研模型&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;处方&lt;/td&gt;
					&lt;td&gt;支撑域&lt;/td&gt;
					&lt;td&gt;受监管约束，需定制但非差异化&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;支付&lt;/td&gt;
					&lt;td&gt;通用域&lt;/td&gt;
					&lt;td&gt;可直接对接微信/支付宝&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;消息通知&lt;/td&gt;
					&lt;td&gt;通用域&lt;/td&gt;
					&lt;td&gt;短信/推送可用第三方&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;32-限界上下文-bounded-context&#34;&gt;3.2 限界上下文 Bounded Context&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;定义&lt;/strong&gt;：限界上下文是领域模型能够保持一致性和完整性的显式边界。在边界内部，每个业务术语、概念、规则都有精确且唯一的含义；同一概念在不同限界上下文中可以拥有不同定义。它是 DDD 战略设计中保护模型不被语义污染的最小单元。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;同一个业务名词，在不同上下文里含义可能完全不同。DDD 用“限界上下文”给模型画边界。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;graph TB
    subgraph 商品上下文 Product Context
        P1[商品 = SKU + 价格 + 库存]
    end
    subgraph 订单上下文 Order Context
        P2[商品 = 快照 + 购买时价格 + 数量]
    end
    subgraph 物流上下文 Logistics Context
        P3[商品 = 重量 + 体积 + 易碎标识]
    end
    subgraph 营销上下文 Marketing Context
        P4[商品 = 卖点 + 优惠券适用规则]
    end
    P1 -.-&amp;gt;|映射| P2
    P1 -.-&amp;gt;|映射| P3
    P1 -.-&amp;gt;|映射| P4&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;关键认知&lt;/strong&gt;：不要追求“一个全局统一的数据模型”，要在上下文内部统一，在上下文之间显式映射。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;33-上下文映射模式&#34;&gt;3.3 上下文映射模式&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;定义&lt;/strong&gt;：上下文映射模式是 DDD 中用于描述不同限界上下文之间集成关系与协作方式的战略模式集合。由于每个限界上下文都有自己的模型和统一语言，当业务流程跨越多个上下文时，需要通过上下文映射来显式定义它们如何依赖、转换与协作，从而保证边界清晰、演化可控。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;graph LR
    A[上下文 A] --&amp;gt;|合作关系&amp;lt;br/&amp;gt;Partnership| B[上下文 B]
    C[上下文 C] --&amp;gt;|共享内核&amp;lt;br/&amp;gt;Shared Kernel| D[上下文 D]
    E[上游 Upstream] --&amp;gt;|客户-供应商&amp;lt;br/&amp;gt;Customer-Supplier| F[下游 Downstream]
    G[强势上游] --&amp;gt;|遵奉者&amp;lt;br/&amp;gt;Conformist| H[下游]
    I[下游] --&amp;gt;|防腐层 ACL| J[外部系统]
    K[开放主机服务 OHS&amp;lt;br/&amp;gt;+ 发布语言 PL] --&amp;gt; L[下游]
    M[上下文 M] -.-&amp;gt;|各行其道&amp;lt;br/&amp;gt;Separate Ways| N[上下文 N]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;模式&lt;/th&gt;
					&lt;th&gt;使用场景&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;合作关系&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;两个团队互相依赖，共同演进&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;共享内核&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;核心模型由双方共同维护，改动需同步&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;客户-供应商&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;上游优先服务下游需求，下游有话语权&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;遵奉者&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;上游强势（如外部 SaaS），下游无条件接受&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;防腐层 ACL&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;隔离遗留系统或外部 API，保护领域模型&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;开放主机服务 + 发布语言&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;上游提供稳定 API/协议，供多个下游消费&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;各行其道&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;关联微弱，各自独立&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&#34;34-从限界上下文到微服务边界&#34;&gt;3.4 从限界上下文到微服务边界&lt;/h2&gt;
&lt;p&gt;限界上下文是&lt;strong&gt;语义边界&lt;/strong&gt;——一个模型在这个边界内含义一致；微服务是&lt;strong&gt;部署边界&lt;/strong&gt;——独立代码库、独立数据库、独立发布单元。二者不是一回事，但 DDD 划分微服务边界时，最可靠的起点就是限界上下文。&lt;/p&gt;
&lt;h3 id=&#34;映射原则&#34;&gt;映射原则&lt;/h3&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;graph LR
    A[业务领域] --&amp;gt; B[识别子域&amp;lt;br/&amp;gt;Core / Supporting / Generic]
    B --&amp;gt; C[定义限界上下文&amp;lt;br/&amp;gt;语义边界]
    C --&amp;gt; D{是否满足&amp;lt;br/&amp;gt;拆分条件？}
    D --&amp;gt;|是| E[一个微服务]
    D --&amp;gt;|否| F[多个上下文合并&amp;lt;br/&amp;gt;或模块化单体]
    E --&amp;gt; G[独立数据库&amp;lt;br/&amp;gt;独立部署&amp;lt;br/&amp;gt;API / 事件交互]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;默认规则&lt;/strong&gt;：一个限界上下文对应一个微服务。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;例外情况&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;情况&lt;/th&gt;
					&lt;th&gt;处理&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;上下文内部模块差异极大（性能、安全、团队）&lt;/td&gt;
					&lt;td&gt;可进一步拆分，但要保留相同的“统一语言”子空间&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;多个上下文非常小且高度协作&lt;/td&gt;
					&lt;td&gt;可合并为一个服务，内部用模块隔离&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;团队规模小、业务简单&lt;/td&gt;
					&lt;td&gt;先模块化单体，随演进再拆&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;强一致事务需求&lt;/td&gt;
					&lt;td&gt;优先放在同一服务 / 同一数据库内&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;拆分的启发条件&#34;&gt;拆分的启发条件&lt;/h3&gt;
&lt;p&gt;满足以下任意一条，都可以把限界上下文拆成独立微服务：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;独立演进&lt;/strong&gt;：团队能独立发布，不阻塞他人。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;独立伸缩&lt;/strong&gt;：流量特征不同，例如订单读多写少，库存强一致写频繁。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;独立故障域&lt;/strong&gt;：一个服务故障不应拖垮整个平台。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;独立技术栈&lt;/strong&gt;：某些上下文需要特殊存储（图数据库、时序数据库等）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;合规隔离&lt;/strong&gt;：支付、医疗、金融数据需要独立部署和审计。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;案例b2c-电商的微服务边界划分&#34;&gt;案例：B2C 电商的微服务边界划分&lt;/h3&gt;
&lt;p&gt;以常见的 B2C 电商为例，演示“子域 → 限界上下文 → 微服务”的完整推导过程。&lt;/p&gt;
&lt;h4 id=&#34;第一步识别子域&#34;&gt;第一步：识别子域&lt;/h4&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;子域&lt;/th&gt;
					&lt;th&gt;类型&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;订单&lt;/td&gt;
					&lt;td&gt;核心域&lt;/td&gt;
					&lt;td&gt;下单、状态机、优惠计算&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;库存&lt;/td&gt;
					&lt;td&gt;核心域&lt;/td&gt;
					&lt;td&gt;实时库存、预占、扣减&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;支付&lt;/td&gt;
					&lt;td&gt;通用域&lt;/td&gt;
					&lt;td&gt;对接微信 / 支付宝 / 信用卡&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;物流&lt;/td&gt;
					&lt;td&gt;支撑域&lt;/td&gt;
					&lt;td&gt;运单、轨迹、配送规则&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;商品&lt;/td&gt;
					&lt;td&gt;核心域&lt;/td&gt;
					&lt;td&gt;类目、属性、价格&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;营销&lt;/td&gt;
					&lt;td&gt;支撑域&lt;/td&gt;
					&lt;td&gt;优惠券、满减、秒杀&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;会员&lt;/td&gt;
					&lt;td&gt;支撑域&lt;/td&gt;
					&lt;td&gt;积分、等级、权益&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&#34;第二步定义限界上下文与统一语言&#34;&gt;第二步：定义限界上下文与统一语言&lt;/h4&gt;
&lt;p&gt;同一个业务名词在不同上下文里含义不同，这正是拆分的语义依据。&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;上下文&lt;/th&gt;
					&lt;th&gt;“商品”在该上下文中的含义&lt;/th&gt;
					&lt;th&gt;“订单”在该上下文中的含义&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;商品上下文&lt;/td&gt;
					&lt;td&gt;SKU、SPU、类目、主图、售价&lt;/td&gt;
					&lt;td&gt;无&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;订单上下文&lt;/td&gt;
					&lt;td&gt;商品快照（下单时的价格和描述）&lt;/td&gt;
					&lt;td&gt;聚合根：状态、金额、行项&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;库存上下文&lt;/td&gt;
					&lt;td&gt;可售数量、预占数量、仓库&lt;/td&gt;
					&lt;td&gt;无&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;物流上下文&lt;/td&gt;
					&lt;td&gt;重量、体积、易碎标识&lt;/td&gt;
					&lt;td&gt;发货单、包裹、运单&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;营销上下文&lt;/td&gt;
					&lt;td&gt;适用优惠券的商品范围&lt;/td&gt;
					&lt;td&gt;优惠分摊、实付金额&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;关键判断&lt;/strong&gt;：如果两个地方对“商品”的定义和生命周期完全不同，就应分属不同上下文，也倾向于拆成不同微服务。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id=&#34;第三步映射为微服务&#34;&gt;第三步：映射为微服务&lt;/h4&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;graph TB
    subgraph 微服务边界
        P[商品服务&amp;lt;br/&amp;gt;Product Service]
        O[订单服务&amp;lt;br/&amp;gt;Order Service]
        I[库存服务&amp;lt;br/&amp;gt;Inventory Service]
        PAY[支付服务&amp;lt;br/&amp;gt;Payment Service]
        L[物流服务&amp;lt;br/&amp;gt;Logistics Service]
        M[营销服务&amp;lt;br/&amp;gt;Marketing Service]
        U[会员服务&amp;lt;br/&amp;gt;Member Service]
    end

    O --&amp;gt;|预占库存| I
    O --&amp;gt;|发起支付| PAY
    I --&amp;gt;|OrderPaid 事件| L
    O --&amp;gt;|查询商品信息| P
    O --&amp;gt;|计算优惠| M
    U --&amp;gt;|积分抵扣| O&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h4 id=&#34;第四步选择上下文映射模式&#34;&gt;第四步：选择上下文映射模式&lt;/h4&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;关系&lt;/th&gt;
					&lt;th&gt;模式&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;订单 → 库存&lt;/td&gt;
					&lt;td&gt;客户-供应商 + 最终一致&lt;/td&gt;
					&lt;td&gt;订单调用库存预占接口；库存发布 &lt;code&gt;InventoryReserved&lt;/code&gt; 事件&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;订单 → 支付&lt;/td&gt;
					&lt;td&gt;开放主机服务 OHS&lt;/td&gt;
					&lt;td&gt;支付提供标准支付网关 API，多个业务共用&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;库存 → 物流&lt;/td&gt;
					&lt;td&gt;发布语言 PL + 领域事件&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;OrderPaid&lt;/code&gt; 事件触发物流创建发货单&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;订单 → 商品&lt;/td&gt;
					&lt;td&gt;遵奉者 / ACL&lt;/td&gt;
					&lt;td&gt;商品模型由商品服务定义，订单只保存快照&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;营销 → 订单&lt;/td&gt;
					&lt;td&gt;共享内核 Shared Kernel&lt;/td&gt;
					&lt;td&gt;优惠分摊算法需双方共同维护&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&#34;常见反模式&#34;&gt;常见反模式&lt;/h4&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;反模式&lt;/th&gt;
					&lt;th&gt;问题&lt;/th&gt;
					&lt;th&gt;正确做法&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;按 CRUD 实体拆分&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;UserService&lt;/code&gt;、&lt;code&gt;OrderService&lt;/code&gt;、&lt;code&gt;ProductService&lt;/code&gt; 只是数据表代理&lt;/td&gt;
					&lt;td&gt;按业务能力（上下文）拆分，服务内包含完整业务规则&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;按前端页面拆分&lt;/td&gt;
					&lt;td&gt;一个页面一个服务&lt;/td&gt;
					&lt;td&gt;页面是组合层，服务应按领域聚合&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;过度拆分&lt;/td&gt;
					&lt;td&gt;一次下单调 20 个接口&lt;/td&gt;
					&lt;td&gt;先模块化单体，验证边界后再拆&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;共享数据库&lt;/td&gt;
					&lt;td&gt;多个服务直接操作同一张表&lt;/td&gt;
					&lt;td&gt;每个服务拥有自己的数据，通过 API / 事件交互&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;一句话&lt;/strong&gt;：微服务边界不是拍脑袋定的，而是从“限界上下文”出发，结合团队、性能、合规、发布节奏再微调的结果。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;四战术设计在限界上下文里建模型&#34;&gt;四、战术设计：在限界上下文里建模型&lt;/h2&gt;
&lt;h3 id=&#34;41-核心概念关系图&#34;&gt;4.1 核心概念关系图&lt;/h3&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class AggregateRoot {
        +Entity root
        +invariant()
    }
    class Entity {
        +identity
        +continuity
    }
    class ValueObject {
        +immutable
        +equality by value
    }
    class DomainEvent {
        +eventId
        +occurredOn
        +payload
    }
    class Repository {
        +save(aggregate)
        +byId(id)
    }
    class DomainService {
        +cross-aggregate logic
    }
    class Factory {
        +create()
    }
    AggregateRoot --&amp;gt; Entity : contains
    AggregateRoot --&amp;gt; ValueObject : contains
    AggregateRoot --&amp;gt; DomainEvent : publishes
    Repository --&amp;gt; AggregateRoot : persists
    Factory --&amp;gt; AggregateRoot : creates
    DomainService --&amp;gt; AggregateRoot : orchestrates&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;42-实体-entity-vs-值对象-value-object&#34;&gt;4.2 实体 Entity vs 值对象 Value Object&lt;/h3&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;graph LR
    subgraph Entity
        E1[Order #1001] --&amp;gt; E2[状态变化&amp;lt;br/&amp;gt;待支付 → 已发货 → 已完成]
        E2 --&amp;gt; E3[同一 identity&amp;lt;br/&amp;gt;状态变了还是它]
    end
    subgraph Value Object
        V1[Money amount=100 currency=CNY] --&amp;gt; V2[不可变]
        V2 --&amp;gt; V3[替换即新生&amp;lt;br/&amp;gt;money = money * 2]
    end&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;判断标准&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果对象需要被&lt;strong&gt;追踪生命周期&lt;/strong&gt;，有独立身份 → &lt;strong&gt;实体&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;如果对象只描述属性，换了值就等于换了对象 → &lt;strong&gt;值对象&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;五完整设计-demo电商订单上下文&#34;&gt;五、完整设计 Demo：电商订单上下文&lt;/h2&gt;
&lt;p&gt;完整的代码实现可参考开源项目：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Gitee: soulnew/ddd-demo&lt;/strong&gt;&lt;br&gt;
&lt;a href=&#34;https://gitee.com/soulnew/ddd-demo&#34;&gt;https://gitee.com/soulnew/ddd-demo&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;该项目演示了一个典型的 DDD 工程结构，包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;领域层&lt;/strong&gt;：实体、值对象、聚合根、领域服务、领域事件&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;应用层&lt;/strong&gt;：应用服务、Command/Query、事务编排&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;基础设施层&lt;/strong&gt;：仓储实现、外部 API 适配、消息发布&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;接口层&lt;/strong&gt;：Controller / API 入口&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;建议结合本节的战术概念，重点阅读：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;domain/&lt;/code&gt; 下的聚合根如何封装业务规则（如订单状态机）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;application/&lt;/code&gt; 下的应用服务如何编排用例，不写业务规则。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;infrastructure/&lt;/code&gt; 下的仓储实现如何把领域模型映射到持久化。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如果你想快速跑通一个最小可运行示例，也可以直接克隆该项目：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone https://gitee.com/soulnew/ddd-demo.git&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;p&gt;下面只保留一个最小示意图，帮助理解“充血模型”与“贫血模型”的关键差异。&lt;/p&gt;
&lt;h3 id=&#34;51-充血模型-vs-贫血模型对比&#34;&gt;5.1 充血模型 vs 贫血模型对比&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;贫血模型&lt;/th&gt;
					&lt;th&gt;充血模型&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;OrderService&lt;/code&gt; 里写 &lt;code&gt;if (status.equals(&amp;quot;PAID&amp;quot;))&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Order.pay()&lt;/code&gt; 自己封装状态机&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;OrderEntity&lt;/code&gt; 只有 getter/setter&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Order&lt;/code&gt; 有业务方法，规则集中在领域对象&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;规则散落在 Service&lt;/td&gt;
					&lt;td&gt;不变量、状态变更由聚合根保证&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;持久化即领域模型&lt;/td&gt;
					&lt;td&gt;持久化是领域模型的投影&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;核心原则&lt;/strong&gt;：把“什么样合法”的判断放到领域对象里，应用服务只负责“什么时候调用”。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;六分层架构代码放哪里&#34;&gt;六、分层架构：代码放哪里？&lt;/h2&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;graph TB
    subgraph 用户界面层 UI/API
        U1[Controller / Handler]
    end
    subgraph 应用层 Application
        A1[Application Service]
        A2[DTO / Command / Query]
    end
    subgraph 领域层 Domain
        D1[Entity]
        D2[Value Object]
        D3[Domain Service]
        D4[Domain Event]
        D5[Repository Interface]
    end
    subgraph 基础设施层 Infrastructure
        I1[Repository Implementation]
        I2[Message Queue]
        I3[Database]
        I4[External API Client]
    end

    U1 --&amp;gt; A1
    A1 --&amp;gt; D1
    A1 --&amp;gt; D3
    D1 --&amp;gt; D2
    D1 -.-&amp;gt;|发布| D4
    A1 --&amp;gt; D5
    D5 -.-&amp;gt;|由| I1
    I1 --&amp;gt; I3
    A1 -.-&amp;gt;|发送| I2
    A1 -.-&amp;gt;|调用| I4&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;依赖方向&lt;/strong&gt;：UI → 应用 → 领域；基础设施通过接口被领域依赖（依赖倒置）。&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;层级&lt;/th&gt;
					&lt;th&gt;职责&lt;/th&gt;
					&lt;th&gt;不该做的事&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;UI&lt;/td&gt;
					&lt;td&gt;接收请求、返回响应&lt;/td&gt;
					&lt;td&gt;不直接操作 Repository&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;应用层&lt;/td&gt;
					&lt;td&gt;编排用例、事务、权限校验&lt;/td&gt;
					&lt;td&gt;不写业务规则&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;领域层&lt;/td&gt;
					&lt;td&gt;业务规则、不变量、状态变更&lt;/td&gt;
					&lt;td&gt;不依赖框架/数据库&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;基础设施&lt;/td&gt;
					&lt;td&gt;持久化、消息、外部调用&lt;/td&gt;
					&lt;td&gt;不侵入领域规则&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&#34;七聚合设计四条黄金规则&#34;&gt;七、聚合设计：四条黄金规则&lt;/h2&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;graph TB
    subgraph 聚合根 Order
        O1[Order] --&amp;gt; L1[OrderLineItem]
        O1 --&amp;gt; L2[OrderLineItem]
        O1 --&amp;gt; M1[Money total]
        O1 --&amp;gt; A1[Address shipping]
        O1 --&amp;gt; E1[DomainEvent list]
    end
    subgraph 外部只能通过聚合根访问
        X[其他上下文] --&amp;gt;|byId/order.pay| O1
        X -.-&amp;gt;|❌ 不能直接修改| L1
    end&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;一个聚合只有一个聚合根&lt;/strong&gt;，外部对象只能引用聚合根 ID。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;聚合内部强一致&lt;/strong&gt;，跨聚合最终一致（用领域事件）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;小聚合优先&lt;/strong&gt;，大聚合会成性能瓶颈和并发热点。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;删除聚合根级联删除其内部对象&lt;/strong&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;反例&lt;/strong&gt;：如果把 &lt;code&gt;User&lt;/code&gt; 和 &lt;code&gt;Order&lt;/code&gt; 放在同一个聚合里，用户每次下单都会锁定整个用户聚合，极端不合理。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;八领域事件跨聚合上下文的胶水&#34;&gt;八、领域事件：跨聚合/上下文的胶水&lt;/h2&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;sequenceDiagram
    participant O as Order 聚合
    participant E as Event Bus
    participant I as Inventory 上下文
    participant L as Logistics 上下文
    O-&amp;gt;&amp;gt;O: order.pay()
    O-&amp;gt;&amp;gt;E: publish OrderPaid
    E-&amp;gt;&amp;gt;I: consume OrderPaid
    I-&amp;gt;&amp;gt;I: 扣减库存
    E-&amp;gt;&amp;gt;L: consume OrderPaid
    L-&amp;gt;&amp;gt;L: 创建发货单&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;领域事件的价值：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;解耦&lt;/strong&gt;：Order 不需要知道 Inventory 和 Logistics 的存在。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最终一致&lt;/strong&gt;：接受短时间不一致，换取可扩展性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;审计&lt;/strong&gt;：事件日志本身就是业务轨迹。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;九常见反模式与纠正&#34;&gt;九、常见反模式与纠正&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;反模式&lt;/th&gt;
					&lt;th&gt;现象&lt;/th&gt;
					&lt;th&gt;纠正&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;贫血领域模型&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Entity 只有字段，Service 全是逻辑&lt;/td&gt;
					&lt;td&gt;把不变规则和状态变更放回实体&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;万能聚合&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;一个聚合包含十几个实体&lt;/td&gt;
					&lt;td&gt;按业务不变量拆分，跨聚合用事件&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;数据库驱动建模&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;先建表，再写代码&lt;/td&gt;
					&lt;td&gt;先建模，再映射持久化&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;跨上下文直接引用&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Order 直接持有 Inventory 对象&lt;/td&gt;
					&lt;td&gt;只存 ID，通过 ACL/OHS 交互&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;应用层写业务规则&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;if order.status == ...&lt;/code&gt; 散落在 Service&lt;/td&gt;
					&lt;td&gt;下放到领域对象&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;值对象可变&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;money.setAmount(100)&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;用 final 类 + 不可变字段，替换而非修改&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&#34;十什么时候用-ddd什么时候不用&#34;&gt;十、什么时候用 DDD，什么时候不用？&lt;/h2&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TD
    A[项目是否复杂？] --&amp;gt;|否| B[简单 CRUD 即可]
    A --&amp;gt;|是| C[业务是否快速变化？]
    C --&amp;gt;|否| D[事务脚本 / 简单分层]
    C --&amp;gt;|是| E[团队是否愿意投入统一语言？]
    E --&amp;gt;|否| F[DDD 收益低]
    E --&amp;gt;|是| G[DDD 值得尝试]
    G --&amp;gt; H[从核心域开始&amp;lt;br/&amp;gt;小步迭代]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;适合 DDD&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;业务复杂、领域专家与开发需紧密协作&lt;/li&gt;
&lt;li&gt;核心域需要长期演进&lt;/li&gt;
&lt;li&gt;微服务边界模糊，需要战略设计&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;不适合 DDD&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;简单数据录入/展示系统&lt;/li&gt;
&lt;li&gt;生命周期短、需求稳定的项目&lt;/li&gt;
&lt;li&gt;团队没有领域专家时间投入&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;十一实战案例新项目从-0-到-1-落地-ddd&#34;&gt;十一、实战案例：新项目从 0 到 1 落地 DDD&lt;/h2&gt;
&lt;p&gt;前面讲的都是概念和 Demo，下面以 &lt;strong&gt;在线健身私教平台 FitCoach&lt;/strong&gt; 为例，把“如何划分领域、子域、限界上下文、微服务，以及如何决策充血/贫血模型、如何裁剪 DDD”串成一条完整思路。&lt;/p&gt;
&lt;h3 id=&#34;111-项目背景与目标&#34;&gt;11.1 项目背景与目标&lt;/h3&gt;
&lt;p&gt;FitCoach 要做一个连接私教与学员的平台，核心能力包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;学员购买课程包、预约上课时间、查看训练记录&lt;/li&gt;
&lt;li&gt;教练管理学员、制定训练计划、记录每次上课内容&lt;/li&gt;
&lt;li&gt;运营人员配置课程 SKU、促销活动、处理退款申诉&lt;/li&gt;
&lt;li&gt;对接第三方支付、短信推送、以及第三方直播上课工具&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;业务不算极端复杂，但涉及“课程、预约、课时、计划、会员、支付、营销”多个概念，且预计会快速迭代。&lt;strong&gt;这正是 DDD 能帮上忙的地方：先把业务地图画清楚，再决定怎么写代码。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;112-第一步识别领域与子域&#34;&gt;11.2 第一步：识别领域与子域&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;领域（Domain）&lt;/strong&gt; 就是整个健身私教业务要解决的问题空间。通过事件风暴或用户旅程，可以识别出以下子域：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;子域&lt;/th&gt;
					&lt;th&gt;类型&lt;/th&gt;
					&lt;th&gt;判断理由&lt;/th&gt;
					&lt;th&gt;投入策略&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;私教课程与预约&lt;/td&gt;
					&lt;td&gt;核心域&lt;/td&gt;
					&lt;td&gt;直接决定用户体验和变现效率&lt;/td&gt;
					&lt;td&gt;投入最好的领域专家和工程师&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;训练计划与记录&lt;/td&gt;
					&lt;td&gt;核心域&lt;/td&gt;
					&lt;td&gt;教练专业能力的载体，差异化关键&lt;/td&gt;
					&lt;td&gt;与课程域紧密协作演进&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;会员与教练档案&lt;/td&gt;
					&lt;td&gt;支撑域&lt;/td&gt;
					&lt;td&gt;需要定制，但不是竞争壁垒&lt;/td&gt;
					&lt;td&gt;内部实现，够用即可&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;支付与财务&lt;/td&gt;
					&lt;td&gt;通用域&lt;/td&gt;
					&lt;td&gt;行业通用能力&lt;/td&gt;
					&lt;td&gt;对接微信/支付宝，封装标准接口&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;消息通知&lt;/td&gt;
					&lt;td&gt;通用域&lt;/td&gt;
					&lt;td&gt;短信/推送/站内信&lt;/td&gt;
					&lt;td&gt;使用第三方 SaaS&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;内容（文章/视频）&lt;/td&gt;
					&lt;td&gt;支撑域&lt;/td&gt;
					&lt;td&gt;运营辅助，提升留存&lt;/td&gt;
					&lt;td&gt;可用开源 CMS 改造&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;划分子域的权衡要点&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;不要从技术模块出发&lt;/strong&gt;。例如不要先想“需要一个 UserService”，而要想“会员管理”这个业务能力。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;核心域通常只有 1-2 个&lt;/strong&gt;。如果把所有子域都标成核心，等于没有重点。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;通用域不要自己造轮子&lt;/strong&gt;。支付、通知直接买，团队精力留给核心域。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;子域边界可以随业务演化&lt;/strong&gt;。MVP 阶段可以把“训练计划”放在“课程域”里，等业务复杂后再拆出来。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;113-第二步划分限界上下文&#34;&gt;11.3 第二步：划分限界上下文&lt;/h3&gt;
&lt;p&gt;划分的核心问题是：&lt;strong&gt;同一个业务名词，在不同地方含义是否不同？生命周期是否独立？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;以“课程”这个词为例：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;上下文&lt;/th&gt;
					&lt;th&gt;“课程”在该上下文中的含义&lt;/th&gt;
					&lt;th&gt;关键概念&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;课程目录上下文&lt;/td&gt;
					&lt;td&gt;可售卖的课程 SKU：价格、有效期、适用人群、退费规则&lt;/td&gt;
					&lt;td&gt;CourseCatalog, PricePolicy&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;预约调度上下文&lt;/td&gt;
					&lt;td&gt;一次具体的上课时间：教练、学员、时段、状态&lt;/td&gt;
					&lt;td&gt;Appointment, TimeSlot&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;训练记录上下文&lt;/td&gt;
					&lt;td&gt;一次实际上课产生的记录：消耗课时、训练内容、教练反馈&lt;/td&gt;
					&lt;td&gt;TrainingRecord, ConsumedSession&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;营销上下文&lt;/td&gt;
					&lt;td&gt;参与促销的课程范围：满减、套餐、优惠券适用&lt;/td&gt;
					&lt;td&gt;PromotionRule, Bundle&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;财务上下文&lt;/td&gt;
					&lt;td&gt;课程订单的应收、实收、退款流水&lt;/td&gt;
					&lt;td&gt;CourseOrder, Refund&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;因为“课程”的含义和生命周期在每个上下文里都不同，所以应该拆成不同的限界上下文。FitCoach 最终划分如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;课程目录上下文&lt;/strong&gt;（Course Catalog Context）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;预约调度上下文&lt;/strong&gt;（Scheduling Context）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;训练记录上下文&lt;/strong&gt;（Training Record Context）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;会员上下文&lt;/strong&gt;（Member Context）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;教练上下文&lt;/strong&gt;（Coach Context）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;支付上下文&lt;/strong&gt;（Payment Context）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;营销上下文&lt;/strong&gt;（Marketing Context）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;消息通知上下文&lt;/strong&gt;（Notification Context）&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;关键判断&lt;/strong&gt;：如果两个地方对同一个名词的定义和生命周期不同，就倾向于拆成不同上下文；如果概念高度一致且总是一起变化，可以合并。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;114-第三步推导微服务边界&#34;&gt;11.4 第三步：推导微服务边界&lt;/h3&gt;
&lt;p&gt;默认规则是&lt;strong&gt;一个限界上下文对应一个微服务&lt;/strong&gt;，但 FitCoach 还要考虑团队规模、数据一致性、发布频率、性能特征。&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;限界上下文&lt;/th&gt;
					&lt;th&gt;微服务决策&lt;/th&gt;
					&lt;th&gt;决策理由&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;课程目录&lt;/td&gt;
					&lt;td&gt;独立服务&lt;/td&gt;
					&lt;td&gt;变化频繁，运营经常调整 SKU 和价格&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;预约调度&lt;/td&gt;
					&lt;td&gt;独立服务&lt;/td&gt;
					&lt;td&gt;高并发读，学员大量刷可选时段，需单独伸缩&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;训练记录&lt;/td&gt;
					&lt;td&gt;独立服务&lt;/td&gt;
					&lt;td&gt;写多读少，数据量大，未来可能要独立归档&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;会员 + 教练档案&lt;/td&gt;
					&lt;td&gt;合并为“账户服务”&lt;/td&gt;
					&lt;td&gt;MVP 阶段都很薄，且登录后经常一起查询；内部用模块隔离&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;支付&lt;/td&gt;
					&lt;td&gt;独立服务&lt;/td&gt;
					&lt;td&gt;涉及资金安全、合规审计、对接第三方&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;营销&lt;/td&gt;
					&lt;td&gt;独立服务&lt;/td&gt;
					&lt;td&gt;活动频繁，不能影响核心预约链路&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;消息通知&lt;/td&gt;
					&lt;td&gt;独立服务&lt;/td&gt;
					&lt;td&gt;可被多个业务复用，适合独立演进&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;合并的例外处理&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;会员和教练虽然业务概念不同，但 MVP 阶段数据模型简单，合并可以减少一次远程调用。&lt;/li&gt;
&lt;li&gt;如果后续教练业务复杂化（排期、评级、分成、资质认证），再把教练上下文拆成独立服务。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;一句话&lt;/strong&gt;：微服务边界从限界上下文出发，再结合团队、性能、合规、数据一致性做微调。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;115-第四步选择上下文映射模式&#34;&gt;11.5 第四步：选择上下文映射模式&lt;/h3&gt;
&lt;p&gt;不同上下文之间不是孤立的，需要显式定义它们如何协作。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;graph LR
    A[预约上下文] --&amp;gt;|Customer-Supplier| B[课程目录上下文]
    C[训练记录上下文] --&amp;gt;|Customer-Supplier| A
    D[支付上下文] --&amp;gt;|OHS + PL| E[预约上下文]
    F[营销上下文] --&amp;gt;|Shared Kernel| A
    G[消息通知上下文] --&amp;gt;|Conformist| H[短信/推送第三方]
    I[账户服务] --&amp;gt;|OHS + PL| J[所有业务服务]
    K[训练记录上下文] --&amp;gt;|ACL| L[直播上课工具]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;关系&lt;/th&gt;
					&lt;th&gt;模式&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;预约 → 课程目录&lt;/td&gt;
					&lt;td&gt;客户-供应商&lt;/td&gt;
					&lt;td&gt;预约需要课程的名称、价格、时长；课程目录提供稳定查询接口&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;训练记录 → 预约&lt;/td&gt;
					&lt;td&gt;客户-供应商&lt;/td&gt;
					&lt;td&gt;训练记录基于已完成的预约生成&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;支付 → 各业务&lt;/td&gt;
					&lt;td&gt;开放主机服务 OHS&lt;/td&gt;
					&lt;td&gt;支付提供统一的收款、退款、对账 API&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;营销 → 预约&lt;/td&gt;
					&lt;td&gt;共享内核 Shared Kernel&lt;/td&gt;
					&lt;td&gt;促销分摊、优惠券核销规则需要双方共同维护&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;消息通知 → 第三方&lt;/td&gt;
					&lt;td&gt;遵奉者 Conformist&lt;/td&gt;
					&lt;td&gt;直接调用第三方 SDK，模型由第三方定义&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;训练记录 → 直播工具&lt;/td&gt;
					&lt;td&gt;防腐层 ACL&lt;/td&gt;
					&lt;td&gt;直播工具接口不稳定，通过 ACL 隔离，保护领域模型&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;116-第五步充血模型-vs-贫血模型决策&#34;&gt;11.6 第五步：充血模型 vs 贫血模型决策&lt;/h3&gt;
&lt;p&gt;DDD 并不要求全场充血。&lt;strong&gt;模型选择应该看该上下文的业务复杂度&lt;/strong&gt;，而不是追求统一风格。&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;上下文&lt;/th&gt;
					&lt;th&gt;推荐模型&lt;/th&gt;
					&lt;th&gt;理由&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;预约调度&lt;/td&gt;
					&lt;td&gt;充血模型&lt;/td&gt;
					&lt;td&gt;状态机复杂：待预约 → 已预约 → 已签到 → 已完成 → 已取消；有取消规则、爽约规则&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;训练记录&lt;/td&gt;
					&lt;td&gt;充血模型&lt;/td&gt;
					&lt;td&gt;记录不可变，但课时消耗计算、教练评分聚合有业务规则&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;课程目录&lt;/td&gt;
					&lt;td&gt;贫血模型可接受&lt;/td&gt;
					&lt;td&gt;主要是 CRUD，业务规则少&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;账户服务&lt;/td&gt;
					&lt;td&gt;贫血模型&lt;/td&gt;
					&lt;td&gt;数据管理为主，验证规则简单&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;消息通知&lt;/td&gt;
					&lt;td&gt;贫血/过程式&lt;/td&gt;
					&lt;td&gt;基本是发送逻辑，无复杂领域规则&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;营销&lt;/td&gt;
					&lt;td&gt;充血模型&lt;/td&gt;
					&lt;td&gt;优惠计算、互斥规则、分摊逻辑复杂&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;预约上下文的充血模型示例&lt;/strong&gt;：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Appointment&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; AppointmentId id;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; TimeSlot timeSlot;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; MemberId memberId;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; CoachId coachId;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; AppointmentStatus status;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; List&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;DomainEvent&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; domainEvents &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; ArrayList&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;gt;&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;cancel&lt;/span&gt;(LocalDateTime now) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (status &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; AppointmentStatus.&lt;span style=&#34;color:#a6e22e&#34;&gt;BOOKED&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; DomainException(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;只能取消已预约的课程&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (timeSlot.&lt;span style=&#34;color:#a6e22e&#34;&gt;start&lt;/span&gt;().&lt;span style=&#34;color:#a6e22e&#34;&gt;minusHours&lt;/span&gt;(24).&lt;span style=&#34;color:#a6e22e&#34;&gt;isBefore&lt;/span&gt;(now)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; DomainException(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;开课 24 小时内不可取消&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;status&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; AppointmentStatus.&lt;span style=&#34;color:#a6e22e&#34;&gt;CANCELLED&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        domainEvents.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; AppointmentCancelled(id, now));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;checkIn&lt;/span&gt;(LocalDateTime now) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (status &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; AppointmentStatus.&lt;span style=&#34;color:#a6e22e&#34;&gt;BOOKED&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; DomainException(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;未预约不能签到&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;status&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; AppointmentStatus.&lt;span style=&#34;color:#a6e22e&#34;&gt;COMPLETED&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        domainEvents.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; AppointmentCheckedIn(id, memberId, coachId, now));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;决策口诀&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;状态机复杂、不变量多、业务规则变化快 → &lt;strong&gt;充血模型&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;主要是增删改查、数据为主、规则简单 → &lt;strong&gt;贫血模型即可&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;不确定时，先写贫血，等规则复杂了再重构为充血&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;117-第六步ddd-是否可以裁剪&#34;&gt;11.7 第六步：DDD 是否可以裁剪？&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;可以，而且应该根据项目情况裁剪。&lt;/strong&gt; DDD 不是全有或全无的框架。&lt;/p&gt;
&lt;h4 id=&#34;场景-1只用战略设计战术设计从简&#34;&gt;场景 1：只用战略设计，战术设计从简&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;适合情况&lt;/strong&gt;：业务复杂但技术栈简单、团队经验不足、MVP 阶段要快速上线。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FitCoach 初期做法&lt;/strong&gt;：先画好限界上下文和微服务边界，服务内部用简单 CRUD + Service 实现。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;价值&lt;/strong&gt;：至少解决了“边界混乱、术语不一致、重复造轮子”的问题。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;场景-2只用战术设计在已有边界内建模&#34;&gt;场景 2：只用战术设计，在已有边界内建模&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;适合情况&lt;/strong&gt;：系统边界已经清楚，但某个模块内部逻辑混乱（如遗留系统重构）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FitCoach 示例&lt;/strong&gt;：课程目录已经稳定，但预约状态机满是 if/else，可以只对“预约上下文”做充血模型重构。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;风险&lt;/strong&gt;：如果战略边界本身不清晰，战术设计会变成“在错误的地方做正确的事”。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;场景-3战略--战术都用但不用高级模式&#34;&gt;场景 3：战略 + 战术都用，但不用高级模式&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;这是最常见的落地方式&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;FitCoach 可以用：限界上下文 + 充血模型 + 领域事件 + 分层架构。&lt;/li&gt;
&lt;li&gt;可以先不用：事件溯源、CQRS、六边形架构的严格形式。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;裁剪原则&#34;&gt;裁剪原则&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;复杂的地方用 DDD，简单的地方不要硬套&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;先战略后战术&lt;/strong&gt;，边界不清不要深入建模型。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;一个项目可以不同上下文用不同成熟度&lt;/strong&gt;：核心域充血 + 贫血，通用域直接用 SDK。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不要为了 DDD 而 DDD&lt;/strong&gt;，目标是降低业务复杂度，不是写出“DDD 标准代码”。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;118-落地时间线建议&#34;&gt;11.8 落地时间线建议&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;阶段&lt;/th&gt;
					&lt;th&gt;目标&lt;/th&gt;
					&lt;th&gt;关键产出&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Week 1-2&lt;/td&gt;
					&lt;td&gt;事件风暴 + 统一语言&lt;/td&gt;
					&lt;td&gt;子域图、限界上下文图、术语表&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Week 3&lt;/td&gt;
					&lt;td&gt;微服务边界与映射模式&lt;/td&gt;
					&lt;td&gt;服务拆分方案、接口契约初稿&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Week 4-6&lt;/td&gt;
					&lt;td&gt;核心域战术设计&lt;/td&gt;
					&lt;td&gt;聚合、实体、值对象、领域事件、测试&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Week 7-8&lt;/td&gt;
					&lt;td&gt;基础设施 + 集成测试&lt;/td&gt;
					&lt;td&gt;数据库、消息队列、CI/CD 流水线&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;持续&lt;/td&gt;
					&lt;td&gt;演进&lt;/td&gt;
					&lt;td&gt;根据业务变化调整边界和模型&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;新手常犯的错误&lt;/strong&gt;：一上来就在所有服务里写聚合根、值对象、领域事件。正确做法是先画地图，再对核心域精雕细琢，其他域能跑通即可。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;十二一句话总结&#34;&gt;十二、一句话总结&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;DDD = 用“统一语言”沟通业务，用“限界上下文”划分边界并推导微服务边界，用“聚合/实体/值对象”封装领域知识，用“领域事件”连接上下文，让软件结构真正反映业务结构。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;把 &lt;a href=&#34;https://gitee.com/soulnew/ddd-demo&#34;&gt;soulnew/ddd-demo&lt;/a&gt; 的 Demo 跑一遍，再画一张你自己业务的战略地图，并尝试标出可能的微服务边界，你就已经比 80% 自称做 DDD 的人更接近它的本质了。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;参考&#34;&gt;参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Eric Evans. &lt;em&gt;Domain-Driven Design: Tackling Complexity in the Heart of Software&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Vaughn Vernon. &lt;em&gt;Implementing Domain-Driven Design&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Vaughn Vernon. &lt;em&gt;Domain-Driven Design Distilled&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    <item>
      <title>设计模式全景图：六大原则、23 种 GoF 模式与 J2EE 模式</title>
      <link>https://ftmao.com/blog/posts/design-patterns-intro/</link>
      <pubDate>Tue, 28 May 2019 14:00:00 +0800</pubDate>
      <guid>https://ftmao.com/blog/posts/design-patterns-intro/</guid>
      <description>&lt;h1 id=&#34;设计模式全景图六大原则23-种-gof-模式与-j2ee-模式&#34;&gt;设计模式全景图：六大原则、23 种 GoF 模式与 J2EE 模式&lt;/h1&gt;
&lt;p&gt;设计模式是面向对象设计中反复出现问题的&lt;strong&gt;可复用解决方案&lt;/strong&gt;。掌握它们能够帮助我们写出更易扩展、更易维护、更清晰的代码。本文从六大设计原则出发，完整梳理 GoF 23 种设计模式以及 8 种 J2EE 模式，并配合类图、意图说明和 JDK/Spring 中的典型应用，帮助建立系统性的知识地图。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一设计模式的六大原则&#34;&gt;一、设计模式的六大原则&lt;/h2&gt;
&lt;h3 id=&#34;1-开闭原则open-close-principle&#34;&gt;1. 开闭原则（Open Close Principle）&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;对扩展开放，对修改关闭。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;当程序需要新增功能时，应通过增加新代码实现，而不是修改已有代码。核心手段是抽象化：使用接口和抽象类。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;graph LR
    A[业务调用方] --&amp;gt; B[抽象接口]
    B --&amp;gt; C[旧实现]
    B --&amp;gt; D[新实现]
    style D fill:#e1f5e1&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;2-里氏代换原则liskov-substitution-principle&#34;&gt;2. 里氏代换原则（Liskov Substitution Principle）&lt;/h3&gt;
&lt;p&gt;任何基类可以出现的地方，子类一定可以出现。子类替换基类后，程序功能不应受影响。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Animal { +eat() }
    class Dog { +eat() }
    class Cat { +eat() }
    Animal &amp;lt;|-- Dog
    Animal &amp;lt;|-- Cat&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;3-依赖倒转原则dependence-inversion-principle&#34;&gt;3. 依赖倒转原则（Dependence Inversion Principle）&lt;/h3&gt;
&lt;p&gt;高层模块和低层模块都应依赖抽象；要针对接口编程，而不是针对实现编程。&lt;/p&gt;
&lt;h3 id=&#34;4-接口隔离原则interface-segregation-principle&#34;&gt;4. 接口隔离原则（Interface Segregation Principle）&lt;/h3&gt;
&lt;p&gt;使用多个职责单一的接口，优于使用一个庞大臃肿的接口，降低类之间的耦合。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;graph TD
    A[大接口] --&amp;gt;|拆分为| B[接口A]
    A --&amp;gt;|拆分为| C[接口B]
    A --&amp;gt;|拆分为| D[接口C]
    B --&amp;gt; E[实现类1]
    C --&amp;gt; F[实现类2]
    D --&amp;gt; G[实现类3]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;5-迪米特法则--最少知道原则demeter-principle&#34;&gt;5. 迪米特法则 / 最少知道原则（Demeter Principle）&lt;/h3&gt;
&lt;p&gt;一个实体应尽量少地与其他实体发生直接交互，降低模块耦合，提高独立性。&lt;/p&gt;
&lt;h3 id=&#34;6-合成复用原则composite-reuse-principle&#34;&gt;6. 合成复用原则（Composite Reuse Principle）&lt;/h3&gt;
&lt;p&gt;优先使用组合/聚合来复用功能，而不是继承。组合更灵活，耦合更低。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Car { -Engine engine; +run() }
    class Engine { +start() }
    Car *-- Engine : 组合&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;二设计模式分类概览&#34;&gt;二、设计模式分类概览&lt;/h2&gt;
&lt;p&gt;设计模式通常分为三大类：创建型、结构型、行为型。J2EE 模式则专注于企业应用和表示层。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;mindmap
  root((设计模式))
    创建型模式 5种
      工厂模式
      抽象工厂模式
      单例模式
      建造者模式
      原型模式
    结构型模式 8种
      适配器模式
      桥接模式
      过滤器/标准模式
      组合模式
      装饰器模式
      外观模式
      享元模式
      代理模式
    行为型模式 13种 
      责任链模式
      命令模式
      解释器模式
      迭代器模式
      中介者模式
      备忘录模式
      观察者模式
      状态模式
      空对象模式
      策略模式
      模板模式
      访问者模式
    J2EE模式 8种 
      MVC模式
      业务代表模式
      组合实体模式
      数据访问对象模式
      前端控制器模式
      拦截过滤器模式
      服务定位器模式
      传输对象模式&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;三创建型模式creational-patterns&#34;&gt;三、创建型模式（Creational Patterns）&lt;/h2&gt;
&lt;p&gt;创建型模式关注对象的创建过程，隐藏创建逻辑，使程序在判断需要创建哪些对象时更灵活。&lt;/p&gt;
&lt;h3 id=&#34;1-工厂模式factory-pattern&#34;&gt;1. 工厂模式（Factory Pattern）&lt;/h3&gt;
&lt;p&gt;定义一个创建对象的接口，让子类决定实例化哪一个类。工厂方法使类的实例化延迟到子类。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Product { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +use() }
    class ConcreteProductA { +use() }
    class ConcreteProductB { +use() }
    class Creator { +factoryMethod() Product }
    class ConcreteCreatorA { +factoryMethod() Product }
    class ConcreteCreatorB { +factoryMethod() Product }
    Product &amp;lt;|.. ConcreteProductA
    Product &amp;lt;|.. ConcreteProductB
    Creator &amp;lt;|-- ConcreteCreatorA
    Creator &amp;lt;|-- ConcreteCreatorB
    Creator ..&amp;gt; Product
    ConcreteCreatorA ..&amp;gt; ConcreteProductA
    ConcreteCreatorB ..&amp;gt; ConcreteProductB&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;JDK 应用：&lt;/strong&gt; &lt;code&gt;java.text.DateFormat.getDateInstance()&lt;/code&gt;、&lt;code&gt;KeyGenerator.getInstance()&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id=&#34;2-抽象工厂模式abstract-factory-pattern&#34;&gt;2. 抽象工厂模式（Abstract Factory Pattern）&lt;/h3&gt;
&lt;p&gt;提供一个创建一系列相关或相互依赖对象的接口，而无需指定它们具体的类。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class AbstractFactory { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +createProductA() +createProductB() }
    class ConcreteFactory1 { +createProductA() +createProductB() }
    class ConcreteFactory2 { +createProductA() +createProductB() }
    class AbstractProductA
    class AbstractProductB
    AbstractFactory &amp;lt;|.. ConcreteFactory1
    AbstractFactory &amp;lt;|.. ConcreteFactory2
    ConcreteFactory1 ..&amp;gt; AbstractProductA
    ConcreteFactory1 ..&amp;gt; AbstractProductB
    ConcreteFactory2 ..&amp;gt; AbstractProductA
    ConcreteFactory2 ..&amp;gt; AbstractProductB&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;3-单例模式singleton-pattern&#34;&gt;3. 单例模式（Singleton Pattern）&lt;/h3&gt;
&lt;p&gt;确保一个类只有一个实例，并提供一个全局访问点。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Singleton {
        -static Singleton instance
        -Singleton()
        +static getInstance() Singleton
    }&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;JDK 应用：&lt;/strong&gt; &lt;code&gt;Runtime.getRuntime()&lt;/code&gt;。&lt;strong&gt;Spring 应用：&lt;/strong&gt; 默认 Bean 作用域为单例。&lt;/p&gt;
&lt;h3 id=&#34;4-建造者模式builder-pattern&#34;&gt;4. 建造者模式（Builder Pattern）&lt;/h3&gt;
&lt;p&gt;将一个复杂对象的构建与它的表示分离，使得同样的构建过程可以创建不同的表示。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Product { +partA +partB +partC }
    class Builder { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +buildPartA() +buildPartB() +getResult() }
    class ConcreteBuilder { +buildPartA() +buildPartB() +getResult() }
    class Director { +construct(builder) }
    Builder &amp;lt;|.. ConcreteBuilder
    ConcreteBuilder ..&amp;gt; Product
    Director ..&amp;gt; Builder&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;5-原型模式prototype-pattern&#34;&gt;5. 原型模式（Prototype Pattern）&lt;/h3&gt;
&lt;p&gt;通过复制现有对象来创建新对象，而不是新建实例。适用于创建成本较高的对象。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Prototype { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +clone() }
    class ConcretePrototype { +clone() }
    Prototype &amp;lt;|.. ConcretePrototype&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;JDK 应用：&lt;/strong&gt; &lt;code&gt;Object.clone()&lt;/code&gt;、&lt;code&gt;Cloneable&lt;/code&gt; 接口。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;四结构型模式structural-patterns&#34;&gt;四、结构型模式（Structural Patterns）&lt;/h2&gt;
&lt;p&gt;结构型模式关注对象之间的组合和关系，解决如何构建灵活且可复用的类和对象结构。&lt;/p&gt;
&lt;h3 id=&#34;1-适配器模式adapter-pattern&#34;&gt;1. 适配器模式（Adapter Pattern）&lt;/h3&gt;
&lt;p&gt;将一个类的接口转换成客户希望的另外一个接口，使得原本由于接口不兼容而不能一起工作的类可以协同工作。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Target { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +request() }
    class Adapter { +request() }
    class Adaptee { +specificRequest() }
    Target &amp;lt;|.. Adapter
    Adapter --&amp;gt; Adaptee&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;JDK 应用：&lt;/strong&gt; &lt;code&gt;Arrays.asList()&lt;/code&gt;、&lt;code&gt;InputStreamReader&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id=&#34;2-桥接模式bridge-pattern&#34;&gt;2. 桥接模式（Bridge Pattern）&lt;/h3&gt;
&lt;p&gt;将抽象部分与它的实现部分分离，使它们都可以独立地变化。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Abstraction { -Implementor impl +operation() }
    class RefinedAbstraction { +operation() }
    class Implementor { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +operationImpl() }
    class ConcreteImplementorA { +operationImpl() }
    class ConcreteImplementorB { +operationImpl() }
    Abstraction &amp;lt;|-- RefinedAbstraction
    Abstraction o-- Implementor
    Implementor &amp;lt;|.. ConcreteImplementorA
    Implementor &amp;lt;|.. ConcreteImplementorB&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;3-过滤器模式--标准模式filter--criteria-pattern&#34;&gt;3. 过滤器模式 / 标准模式（Filter / Criteria Pattern）&lt;/h3&gt;
&lt;p&gt;使用不同的标准来过滤一组对象，并通过逻辑运算以解耦的方式把它们连接起来。常用于集合筛选。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Criteria { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +meetCriteria(list) }
    class CriteriaMale { +meetCriteria(list) }
    class CriteriaFemale { +meetCriteria(list) }
    class AndCriteria { +meetCriteria(list) }
    class OrCriteria { +meetCriteria(list) }
    Criteria &amp;lt;|.. CriteriaMale
    Criteria &amp;lt;|.. CriteriaFemale
    Criteria &amp;lt;|.. AndCriteria
    Criteria &amp;lt;|.. OrCriteria
    AndCriteria --&amp;gt; Criteria
    OrCriteria --&amp;gt; Criteria&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;4-组合模式composite-pattern&#34;&gt;4. 组合模式（Composite Pattern）&lt;/h3&gt;
&lt;p&gt;将对象组合成树形结构以表示&amp;quot;部分-整体&amp;quot;的层次结构，使得用户对单个对象和组合对象的使用具有一致性。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Component { +operation() }
    class Leaf { +operation() }
    class Composite { -children +add() +remove() +operation() }
    Component &amp;lt;|-- Leaf
    Component &amp;lt;|-- Composite
    Composite o-- Component&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;JDK 应用：&lt;/strong&gt; &lt;code&gt;java.awt.Container&lt;/code&gt; 与 &lt;code&gt;Component&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id=&#34;5-装饰器模式decorator-pattern&#34;&gt;5. 装饰器模式（Decorator Pattern）&lt;/h3&gt;
&lt;p&gt;动态地给一个对象添加一些额外的职责，比生成子类更灵活。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Component { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +operation() }
    class ConcreteComponent { +operation() }
    class Decorator { -Component component +operation() }
    class ConcreteDecoratorA { +operation() }
    class ConcreteDecoratorB { +operation() }
    Component &amp;lt;|.. ConcreteComponent
    Component &amp;lt;|.. Decorator
    Decorator &amp;lt;|-- ConcreteDecoratorA
    Decorator &amp;lt;|-- ConcreteDecoratorB
    Decorator o-- Component&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;JDK 应用：&lt;/strong&gt; Java IO 流 &lt;code&gt;BufferedInputStream&lt;/code&gt;、&lt;code&gt;DataInputStream&lt;/code&gt;、&lt;code&gt;ZipOutputStream&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id=&#34;6-外观模式facade-pattern&#34;&gt;6. 外观模式（Facade Pattern）&lt;/h3&gt;
&lt;p&gt;为子系统中的一组接口提供一个一致的入口，定义了一个高层接口，使子系统更容易使用。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Facade { +simplifiedOperation() }
    class SubSystemA { +operationA() }
    class SubSystemB { +operationB() }
    class SubSystemC { +operationC() }
    Facade --&amp;gt; SubSystemA
    Facade --&amp;gt; SubSystemB
    Facade --&amp;gt; SubSystemC&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;7-享元模式flyweight-pattern&#34;&gt;7. 享元模式（Flyweight Pattern）&lt;/h3&gt;
&lt;p&gt;运用共享技术有效地支持大量细粒度对象，减少内存占用。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class FlyweightFactory { -pool +getFlyweight(key) }
    class Flyweight { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +operation() }
    class ConcreteFlyweight { +operation() }
    FlyweightFactory o-- Flyweight
    Flyweight &amp;lt;|.. ConcreteFlyweight&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;JDK 应用：&lt;/strong&gt; &lt;code&gt;Integer.valueOf()&lt;/code&gt; 缓存（-128-127）、&lt;code&gt;String&lt;/code&gt; 常量池。&lt;/p&gt;
&lt;h3 id=&#34;8-代理模式proxy-pattern&#34;&gt;8. 代理模式（Proxy Pattern）&lt;/h3&gt;
&lt;p&gt;为其他对象提供一种代理以控制对这个对象的访问。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Subject { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +request() }
    class RealSubject { +request() }
    class Proxy { -RealSubject real +request() }
    Subject &amp;lt;|.. RealSubject
    Subject &amp;lt;|.. Proxy
    Proxy --&amp;gt; RealSubject&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;JDK 应用：&lt;/strong&gt; JDK 动态代理 &lt;code&gt;Proxy.newProxyInstance()&lt;/code&gt;。&lt;strong&gt;Spring 应用：&lt;/strong&gt; AOP 使用 JDK 动态代理和 CGLIB。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;五行为型模式behavioral-patterns&#34;&gt;五、行为型模式（Behavioral Patterns）&lt;/h2&gt;
&lt;p&gt;行为型模式关注对象之间的通信和交互，解决对象之间的责任分配和算法封装。&lt;/p&gt;
&lt;h3 id=&#34;1-责任链模式chain-of-responsibility-pattern&#34;&gt;1. 责任链模式（Chain of Responsibility Pattern）&lt;/h3&gt;
&lt;p&gt;使多个对象都有机会处理请求，从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链，并沿着这条链传递请求。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Handler { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +setNext(handler) +handle(request) }
    class ConcreteHandlerA { +handle(request) }
    class ConcreteHandlerB { +handle(request) }
    Handler &amp;lt;|.. ConcreteHandlerA
    Handler &amp;lt;|.. ConcreteHandlerB
    Handler --&amp;gt; Handler : next&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;2-命令模式command-pattern&#34;&gt;2. 命令模式（Command Pattern）&lt;/h3&gt;
&lt;p&gt;将请求封装为对象，从而可以用不同的请求、队列或日志来参数化其他对象，同时支持可撤销操作。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Command { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +execute() }
    class ConcreteCommand { -receiver +execute() }
    class Invoker { -command +setCommand() +invoke() }
    class Receiver { +action() }
    Command &amp;lt;|.. ConcreteCommand
    Invoker --&amp;gt; Command
    ConcreteCommand --&amp;gt; Receiver&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;3-解释器模式interpreter-pattern&#34;&gt;3. 解释器模式（Interpreter Pattern）&lt;/h3&gt;
&lt;p&gt;给定一个语言，定义它的文法表示，并定义一个解释器，这个解释器使用该表示来解释语言中的句子。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class AbstractExpression { +interpret(context) }
    class TerminalExpression { +interpret(context) }
    class NonterminalExpression { +interpret(context) }
    AbstractExpression &amp;lt;|-- TerminalExpression
    AbstractExpression &amp;lt;|-- NonterminalExpression
    NonterminalExpression o-- AbstractExpression&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;JDK 应用：&lt;/strong&gt; Java 正则表达式 &lt;code&gt;Pattern&lt;/code&gt; 与 &lt;code&gt;Matcher&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id=&#34;4-迭代器模式iterator-pattern&#34;&gt;4. 迭代器模式（Iterator Pattern）&lt;/h3&gt;
&lt;p&gt;提供一种方法顺序访问一个聚合对象中的各个元素，而又无需暴露该对象的内部表示。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Iterator { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +hasNext() +next() }
    class ConcreteIterator { +hasNext() +next() }
    class Aggregate { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +createIterator() }
    class ConcreteAggregate { +createIterator() }
    Iterator &amp;lt;|.. ConcreteIterator
    Aggregate &amp;lt;|.. ConcreteAggregate
    ConcreteAggregate ..&amp;gt; ConcreteIterator&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;JDK 应用：&lt;/strong&gt; &lt;code&gt;java.util.Iterator&lt;/code&gt;、&lt;code&gt;java.util.Enumeration&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id=&#34;5-中介者模式mediator-pattern&#34;&gt;5. 中介者模式（Mediator Pattern）&lt;/h3&gt;
&lt;p&gt;用一个中介对象来封装一系列对象交互，使对象不需要显式地相互引用，从而使其耦合松散。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Mediator { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +send(message, colleague) }
    class ConcreteMediator { +send(message, colleague) }
    class Colleague { -Mediator mediator }
    class ConcreteColleagueA
    class ConcreteColleagueB
    Mediator &amp;lt;|.. ConcreteMediator
    Colleague &amp;lt;|-- ConcreteColleagueA
    Colleague &amp;lt;|-- ConcreteColleagueB
    Colleague --&amp;gt; Mediator
    ConcreteMediator --&amp;gt; ConcreteColleagueA
    ConcreteMediator --&amp;gt; ConcreteColleagueB&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;6-备忘录模式memento-pattern&#34;&gt;6. 备忘录模式（Memento Pattern）&lt;/h3&gt;
&lt;p&gt;在不破坏封装性的前提下，捕获一个对象的内部状态，并在该对象之外保存这个状态，以便以后恢复。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Originator { +createMemento() +restore(memento) }
    class Memento { -state }
    class Caretaker { -mementos }
    Originator ..&amp;gt; Memento
    Caretaker o-- Memento&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;7-观察者模式observer-pattern&#34;&gt;7. 观察者模式（Observer Pattern）&lt;/h3&gt;
&lt;p&gt;定义对象间的一对多依赖关系，当一个对象状态发生改变时，所有依赖于它的对象都得到通知并自动更新。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Subject { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +registerObserver() +removeObserver() +notifyObservers() }
    class ConcreteSubject { -state +notifyObservers() }
    class Observer { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +update() }
    class ConcreteObserverA { +update() }
    class ConcreteObserverB { +update() }
    Subject &amp;lt;|.. ConcreteSubject
    Observer &amp;lt;|.. ConcreteObserverA
    Observer &amp;lt;|.. ConcreteObserverB
    ConcreteSubject --&amp;gt; Observer&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;JDK 应用：&lt;/strong&gt; &lt;code&gt;java.util.Observer&lt;/code&gt;（已弃用）和 &lt;code&gt;Observable&lt;/code&gt;。&lt;strong&gt;Spring 应用：&lt;/strong&gt; Spring 事件驱动模型 &lt;code&gt;ApplicationEvent&lt;/code&gt;、&lt;code&gt;ApplicationListener&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id=&#34;8-状态模式state-pattern&#34;&gt;8. 状态模式（State Pattern）&lt;/h3&gt;
&lt;p&gt;允许对象在其内部状态改变时改变它的行为，对象看起来好像修改了它的类。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Context { -State state +request() }
    class State { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +handle() }
    class ConcreteStateA { +handle() }
    class ConcreteStateB { +handle() }
    Context o-- State
    State &amp;lt;|.. ConcreteStateA
    State &amp;lt;|.. ConcreteStateB&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;9-空对象模式null-object-pattern&#34;&gt;9. 空对象模式（Null Object Pattern）&lt;/h3&gt;
&lt;p&gt;用一个空对象取代 &lt;code&gt;null&lt;/code&gt; 检查，提供默认的&amp;quot;什么也不做&amp;quot;的行为，避免空指针异常。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Animal { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +makeSound() }
    class Dog { +makeSound() }
    class NullAnimal { +makeSound() }
    Animal &amp;lt;|.. Dog
    Animal &amp;lt;|.. NullAnimal&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;10-策略模式strategy-pattern&#34;&gt;10. 策略模式（Strategy Pattern）&lt;/h3&gt;
&lt;p&gt;定义一系列算法，把它们一个个封装起来，并且使它们可以互相替换。策略模式让算法的变化独立于使用算法的客户。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Strategy { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +execute() }
    class ConcreteStrategyA { +execute() }
    class ConcreteStrategyB { +execute() }
    class Context { -Strategy strategy +setStrategy() +executeStrategy() }
    Strategy &amp;lt;|.. ConcreteStrategyA
    Strategy &amp;lt;|.. ConcreteStrategyB
    Context o-- Strategy&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;JDK 应用：&lt;/strong&gt; &lt;code&gt;Comparator&lt;/code&gt; 接口与 &lt;code&gt;Collections.sort()&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id=&#34;11-模板模式template-pattern&#34;&gt;11. 模板模式（Template Pattern）&lt;/h3&gt;
&lt;p&gt;定义一个操作中的算法骨架，而将一些步骤延迟到子类中。模板方法使得子类可以不改变算法结构即可重定义该算法的某些特定步骤。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class AbstractClass { +templateMethod() +primitiveOperation() }
    class ConcreteClass { +primitiveOperation() }
    AbstractClass &amp;lt;|-- ConcreteClass&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;JDK 应用：&lt;/strong&gt; &lt;code&gt;Arrays.sort()&lt;/code&gt; 配合 &lt;code&gt;Comparable&lt;/code&gt;。&lt;strong&gt;Spring 应用：&lt;/strong&gt; &lt;code&gt;RestTemplate&lt;/code&gt;、&lt;code&gt;JmsTemplate&lt;/code&gt;、&lt;code&gt;JpaTemplate&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id=&#34;12-访问者模式visitor-pattern&#34;&gt;12. 访问者模式（Visitor Pattern）&lt;/h3&gt;
&lt;p&gt;表示一个作用于某对象结构中的各元素的操作，它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class Element { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +accept(visitor) }
    class ConcreteElementA { +accept(visitor) }
    class ConcreteElementB { +accept(visitor) }
    class Visitor { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +visitA() +visitB() }
    class ConcreteVisitor { +visitA() +visitB() }
    Element &amp;lt;|.. ConcreteElementA
    Element &amp;lt;|.. ConcreteElementB
    Visitor &amp;lt;|.. ConcreteVisitor
    ConcreteElementA ..&amp;gt; Visitor
    ConcreteElementB ..&amp;gt; Visitor&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;六j2ee-模式&#34;&gt;六、J2EE 模式&lt;/h2&gt;
&lt;p&gt;J2EE 模式专注于企业应用，尤其是表示层和业务层的架构设计。这些模式由 Sun Java Center 鉴定。&lt;/p&gt;
&lt;h3 id=&#34;1-mvc-模式mvc-pattern&#34;&gt;1. MVC 模式（MVC Pattern）&lt;/h3&gt;
&lt;p&gt;将应用程序分为 Model（模型）、View（视图）、Controller（控制器）三层，实现关注点分离。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;graph LR
    V[View] --&amp;gt; C[Controller]
    C --&amp;gt; M[Model]
    M --&amp;gt; V&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;Spring 应用：&lt;/strong&gt; Spring MVC 是典型实现。&lt;/p&gt;
&lt;h3 id=&#34;2-业务代表模式business-delegate-pattern&#34;&gt;2. 业务代表模式（Business Delegate Pattern）&lt;/h3&gt;
&lt;p&gt;为表示层提供对业务服务的访问抽象，减少表示层与业务层之间的耦合。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;graph LR
    A[Client/Controller] --&amp;gt; B[Business Delegate]
    B --&amp;gt; C[Business Service]
    C --&amp;gt; D[DAO/数据层]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;3-组合实体模式composite-entity-pattern&#34;&gt;3. 组合实体模式（Composite Entity Pattern）&lt;/h3&gt;
&lt;p&gt;将一组相关的持久化对象组合成一个粗粒度实体，减少网络调用次数，提高性能。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class CompositeEntity { -DependentObjectA a -DependentObjectB b +getData() }
    class DependentObjectA
    class DependentObjectB
    CompositeEntity *-- DependentObjectA
    CompositeEntity *-- DependentObjectB&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;4-数据访问对象模式data-access-object-pattern&#34;&gt;4. 数据访问对象模式（Data Access Object Pattern）&lt;/h3&gt;
&lt;p&gt;将底层数据访问逻辑与高层业务逻辑分离，提供一个统一的接口访问数据库。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;graph LR
    A[Business Object] --&amp;gt; B[DAO Interface]
    B --&amp;gt; C[DAO Implementation]
    C --&amp;gt; D[Data Source/Database]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;Spring 应用：&lt;/strong&gt; Spring Data JPA、MyBatis Mapper 都是 DAO 模式的具体实现。&lt;/p&gt;
&lt;h3 id=&#34;5-前端控制器模式front-controller-pattern&#34;&gt;5. 前端控制器模式（Front Controller Pattern）&lt;/h3&gt;
&lt;p&gt;提供一个集中的入口点来处理所有请求，通常负责认证、日志、路由等横切关注点。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;graph LR
    A[所有请求] --&amp;gt; B[Front Controller]
    B --&amp;gt; C[Dispatcher]
    C --&amp;gt; D[具体 Handler]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;Spring 应用：&lt;/strong&gt; &lt;code&gt;DispatcherServlet&lt;/code&gt; 是前端控制器模式的实现。&lt;/p&gt;
&lt;h3 id=&#34;6-拦截过滤器模式intercepting-filter-pattern&#34;&gt;6. 拦截过滤器模式（Intercepting Filter Pattern）&lt;/h3&gt;
&lt;p&gt;在请求到达目标处理器之前，通过一系列过滤器链对请求进行预处理（如编码、认证、日志）。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;graph LR
    A[Request] --&amp;gt; F1[Filter 1]
    F1 --&amp;gt; F2[Filter 2]
    F2 --&amp;gt; F3[Filter N]
    F3 --&amp;gt; T[Target]
    T --&amp;gt; F3
    F3 --&amp;gt; F2
    F2 --&amp;gt; F1
    F1 --&amp;gt; R[Response]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;Spring 应用：&lt;/strong&gt; Spring 的 &lt;code&gt;HandlerInterceptor&lt;/code&gt;、Servlet Filter。&lt;/p&gt;
&lt;h3 id=&#34;7-服务定位器模式service-locator-pattern&#34;&gt;7. 服务定位器模式（Service Locator Pattern）&lt;/h3&gt;
&lt;p&gt;提供一个中心化的注册表，用于获取服务实例，减少服务依赖的直接查找。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class ServiceLocator { +getService(name) }
    class Cache { -services }
    class InitialContext { +lookup(name) }
    class Service { &amp;lt;&amp;lt;interface&amp;gt;&amp;gt; +execute() }
    ServiceLocator --&amp;gt; Cache
    ServiceLocator --&amp;gt; InitialContext
    ServiceLocator ..&amp;gt; Service&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;8-传输对象模式transfer-object-pattern&#34;&gt;8. 传输对象模式（Transfer Object Pattern）&lt;/h3&gt;
&lt;p&gt;通过简单的 POJO 对象在不同层之间传输数据，减少远程调用的网络开销，也称为 DTO（Data Transfer Object）。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;classDiagram
    class UserDTO { -id -name -email +getters/setters }
    class UserService { +getUserDTO(id) }
    class UserController { +showUser(dto) }
    UserService ..&amp;gt; UserDTO
    UserController ..&amp;gt; UserDTO&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;七jdkjava-io-与-spring-中的模式速查&#34;&gt;七、JDK、Java IO 与 Spring 中的模式速查&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;模式&lt;/th&gt;
					&lt;th&gt;JDK 示例&lt;/th&gt;
					&lt;th&gt;Spring 示例&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;工厂模式&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;DateFormat.getDateInstance()&lt;/code&gt;、&lt;code&gt;KeyGenerator.getInstance()&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;BeanFactory&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;单例模式&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Runtime.getRuntime()&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;默认 Bean 作用域&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;原型模式&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Object.clone()&lt;/code&gt;、&lt;code&gt;Cloneable&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;@Scope(&amp;quot;prototype&amp;quot;)&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;适配器模式&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Arrays.asList()&lt;/code&gt;、&lt;code&gt;InputStreamReader&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;MVC 的 Controller 适配器&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;装饰器模式&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;BufferedInputStream&lt;/code&gt;、&lt;code&gt;ZipOutputStream&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;-&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;代理模式&lt;/td&gt;
					&lt;td&gt;JDK 动态代理&lt;/td&gt;
					&lt;td&gt;AOP&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;组合模式&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;java.awt.Container&lt;/code&gt; / &lt;code&gt;Component&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;-&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;享元模式&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Integer.valueOf()&lt;/code&gt;、&lt;code&gt;String&lt;/code&gt; 常量池&lt;/td&gt;
					&lt;td&gt;-&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;模板方法模式&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Arrays.sort()&lt;/code&gt; + &lt;code&gt;Comparable&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;RestTemplate&lt;/code&gt;、&lt;code&gt;JpaTemplate&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;策略模式&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Comparator&lt;/code&gt;、&lt;code&gt;Collections.sort()&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;ResourceLoader&lt;/code&gt; 策略&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;观察者模式&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Observer&lt;/code&gt; / &lt;code&gt;Observable&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Spring 事件驱动模型&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;解释器模式&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Pattern&lt;/code&gt; / &lt;code&gt;Matcher&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;SpEL 表达式&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;责任链模式&lt;/td&gt;
					&lt;td&gt;Servlet Filter Chain&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;HandlerInterceptor&lt;/code&gt; 链&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;MVC 模式&lt;/td&gt;
					&lt;td&gt;-&lt;/td&gt;
					&lt;td&gt;Spring MVC&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;DAO 模式&lt;/td&gt;
					&lt;td&gt;JDBC Template&lt;/td&gt;
					&lt;td&gt;Spring Data JPA / MyBatis&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;前端控制器&lt;/td&gt;
					&lt;td&gt;-&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;DispatcherServlet&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;java-io-中使用的模式&#34;&gt;Java IO 中使用的模式&lt;/h3&gt;
&lt;p&gt;Java IO 同时使用了&lt;strong&gt;适配器模式&lt;/strong&gt;和&lt;strong&gt;装饰器模式&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;适配器模式：&lt;/strong&gt; &lt;code&gt;InputStreamReader&lt;/code&gt; 将 &lt;code&gt;InputStream&lt;/code&gt; 字节流适配为 &lt;code&gt;Reader&lt;/code&gt; 字符流。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;装饰器模式：&lt;/strong&gt; &lt;code&gt;BufferedInputStream&lt;/code&gt;、&lt;code&gt;DataInputStream&lt;/code&gt;、&lt;code&gt;ZipOutputStream&lt;/code&gt; 等通过包装 &lt;code&gt;InputStream&lt;/code&gt; 动态增强功能。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 装饰器模式：逐层包装&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;InputStream fis &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; FileInputStream(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;file.txt&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;InputStream bis &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; BufferedInputStream(fis);     &lt;span style=&#34;color:#75715e&#34;&gt;// 增加缓冲&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DataInputStream dis &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; DataInputStream(bis);      &lt;span style=&#34;color:#75715e&#34;&gt;// 增加基本类型读取&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 适配器模式：字节流转字符流&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Reader reader &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; InputStreamReader(fis, StandardCharsets.&lt;span style=&#34;color:#a6e22e&#34;&gt;UTF_8&lt;/span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;八如何选择设计模式&#34;&gt;八、如何选择设计模式&lt;/h2&gt;
&lt;p&gt;设计模式不是越复杂越好。选择时可以从以下角度思考：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;问题类型&lt;/strong&gt;：是对象创建、结构组织，还是行为交互？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;变化方向&lt;/strong&gt;：系统中哪些部分经常变化？把变化的部分封装起来。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;开闭原则&lt;/strong&gt;：新增功能时是否能不修改已有代码？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;复杂度收益&lt;/strong&gt;：不要为了用模式而增加不必要的抽象。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;一张简化的决策地图：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TD
    A[遇到设计问题] --&amp;gt; B{对象创建复杂?}
    B --&amp;gt;|是| C[创建型模式]
    B --&amp;gt;|否| D{对象结构复杂?}
    D --&amp;gt;|是| E[结构型模式]
    D --&amp;gt;|否| F{对象交互复杂?}
    F --&amp;gt;|是| G[行为型模式]
    F --&amp;gt;|否| H[保持简单，遵循原则]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;总结&#34;&gt;总结&lt;/h2&gt;
&lt;p&gt;设计模式是前人总结的设计经验，核心目标是让软件更易扩展、更易维护、更易理解。掌握它们的关键不是背诵每个类图，而是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;理解六大原则，它们是选择模式的判断依据；&lt;/li&gt;
&lt;li&gt;熟悉 23 种 GoF 模式和 J2EE 模式的适用场景；&lt;/li&gt;
&lt;li&gt;多读优秀源码（JDK、Spring），在真实代码中感受模式的应用；&lt;/li&gt;
&lt;li&gt;避免过度设计，合适才是最好的。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;从 &lt;code&gt;BeanFactory&lt;/code&gt; 到 &lt;code&gt;DispatcherServlet&lt;/code&gt;，从 Java IO 的装饰器到 Spring AOP 的代理，设计模式无处不在。理解这些模式，能帮助我们在面对复杂系统时做出更清晰的结构选择。&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;参考：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.runoob.com/design-pattern/factory-pattern.html&#34;&gt;菜鸟教程 - 设计模式&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.cnblogs.com/dailyprogrammer/articles/12272717.html&#34;&gt;dailyprogrammer - JDK 类库常用的设计模式&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Design Patterns: Elements of Reusable Object-Oriented Software&lt;/em&gt; (GoF)&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
</description>
    </item>
    <item>
      <title>PMP 入门与实战：从项目经理角色认知到沟通方法</title>
      <link>https://ftmao.com/blog/posts/pmp-principles-and-communication-guide/</link>
      <pubDate>Wed, 09 Aug 2017 10:00:00 +0800</pubDate>
      <guid>https://ftmao.com/blog/posts/pmp-principles-and-communication-guide/</guid>
      <description>&lt;h1 id=&#34;pmp-入门与实战从项目经理角色认知到沟通方法&#34;&gt;PMP 入门与实战：从项目经理角色认知到沟通方法&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;我在华为电软核担任项目经理，这是我给新人培训材料的总结。项目管理不是把活派出去就完事，而是在有限的时间、预算、资源约束下，带领团队把事儿做成。这篇文章结合 PMP 体系与一线交付经验，帮你用最快的速度建立 PM 的角色认知和实战感。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一pm-不是高级打杂而是项目的总导演&#34;&gt;一、PM 不是高级打杂，而是项目的总导演&lt;/h2&gt;
&lt;p&gt;很多新人第一次做 PM 时会有错觉：PM 就是催进度、拉会议、写周报的“高级打杂”。但真正的 PM 是项目的&lt;strong&gt;总导演&lt;/strong&gt;——你对最终交付结果负责，而不是只负责传话。&lt;/p&gt;
&lt;h3 id=&#34;11-项目经理的四个角色&#34;&gt;1.1 项目经理的四个角色&lt;/h3&gt;
&lt;p&gt;结合 PM 角色认知模型，项目经理要同时承担四个责任：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TB
    PM([项目经理 PM])
    D[项目按要求交付责任者]
    T[团队建设责任者]
    O[组织能力建设责任者]
    B[项目经营责任者]

    PM --&amp;gt; D
    PM --&amp;gt; T
    PM --&amp;gt; O
    PM --&amp;gt; B

    D --&amp;gt; D1[启动 / 计划 / 执行 / 监控 / 验收 / 关闭]
    T --&amp;gt; T1[核心团队运作 / 人员能力提升 / 组织氛围]
    O --&amp;gt; O1[流程方法 / 工具建设 / 过程资产积累]
    B --&amp;gt; B1[收入管理 / 成本控制 / 业务拓展]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;简单记忆：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;角色&lt;/th&gt;
					&lt;th&gt;关键词&lt;/th&gt;
					&lt;th&gt;日常表现&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;交付责任者&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;按期、按质、按预算&lt;/td&gt;
					&lt;td&gt;盯进度、管风险、控变更、搞验收&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;团队建设者&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;人心、能力、氛围&lt;/td&gt;
					&lt;td&gt;布阵点兵、辅导下属、解决冲突&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;组织能力建设者&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;流程、方法、资产&lt;/td&gt;
					&lt;td&gt;沉淀模板、优化流程、分享经验&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;经营责任者&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;赚钱、省钱、控成本&lt;/td&gt;
					&lt;td&gt;成本评估、收入确认、变更报价&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;12-从个人贡献者到团队绩效达成者&#34;&gt;1.2 从个人贡献者到团队绩效达成者&lt;/h3&gt;
&lt;p&gt;PM 是一次“转身”：以前你关注“我干得怎么样”，现在你要关注“我们团队干得怎么样”。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    A[独立贡献者&amp;lt;br/&amp;gt;个人绩效] --&amp;gt;|转身| B[项目经理&amp;lt;br/&amp;gt;团队绩效]
    B --&amp;gt; C[关注事]
    B --&amp;gt; D[关注人]
    C --&amp;gt; C1[计划 / 进度 / 质量 / 风险]
    D --&amp;gt; D1[沟通 / 激励 / 培养 / 冲突]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;新人自检三问&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;我是谁？（我在这个项目里的核心职责是什么）&lt;/li&gt;
&lt;li&gt;我的优势劣势？（我擅长技术、沟通还是流程）&lt;/li&gt;
&lt;li&gt;我的工作方式？（我习惯先发制人还是被动响应）&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二pmp-核心原理五大过程组&#34;&gt;二、PMP 核心原理：五大过程组&lt;/h2&gt;
&lt;p&gt;PMP 把项目管理抽象成 &lt;strong&gt;49 个过程&lt;/strong&gt;，归入 &lt;strong&gt;5 大过程组&lt;/strong&gt; 和 &lt;strong&gt;10 大知识领域&lt;/strong&gt;。新人不用背 49 个过程，先理解 5 大过程组的逻辑。&lt;/p&gt;
&lt;h3 id=&#34;21-五大过程组循环&#34;&gt;2.1 五大过程组循环&lt;/h3&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    A[启动&amp;lt;br/&amp;gt;Initiating] --&amp;gt; B[规划&amp;lt;br/&amp;gt;Planning]
    B --&amp;gt; C[执行&amp;lt;br/&amp;gt;Executing]
    C --&amp;gt; D[监控&amp;lt;br/&amp;gt;Monitoring &amp;amp; Controlling]
    D --&amp;gt; E[收尾&amp;lt;br/&amp;gt;Closing]
    D --&amp;gt; B
    D --&amp;gt; C
    E --&amp;gt; A

    style A fill:#e0f2fe
    style B fill:#dcfce7
    style C fill:#fef9c3
    style D fill:#fee2e2
    style E fill:#f3e8ff&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;过程组&lt;/th&gt;
					&lt;th&gt;核心问题&lt;/th&gt;
					&lt;th&gt;关键输出&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;启动&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;为什么要做？值不值得做？&lt;/td&gt;
					&lt;td&gt;项目章程、干系人登记册&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;规划&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;怎么做？谁来做？什么时候做完？&lt;/td&gt;
					&lt;td&gt;项目管理计划、WBS、进度基准、成本基准&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;执行&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;按计划推进，协调资源与人&lt;/td&gt;
					&lt;td&gt;可交付成果、变更请求&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;监控&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;偏差多少？要不要纠偏？&lt;/td&gt;
					&lt;td&gt;工作绩效报告、变更请求、纠正措施&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;收尾&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;做完了吗？经验留下了吗？&lt;/td&gt;
					&lt;td&gt;验收报告、经验教训、项目关闭&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：五大过程组不是严格的“阶段”，它们会&lt;strong&gt;重叠、反复、交叉&lt;/strong&gt;。比如监控贯穿始终，规划也可能在执行中重新发生。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;22-十大知识领域一句话版&#34;&gt;2.2 十大知识领域一句话版&lt;/h3&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TB
    subgraph KA[十大知识领域]
        direction LR
        A1[整合管理] --&amp;gt; A2[范围管理]
        A2 --&amp;gt; A3[进度管理]
        A3 --&amp;gt; A4[成本管理]
        A4 --&amp;gt; A5[质量管理]
        A5 --&amp;gt; A6[资源管理]
        A6 --&amp;gt; A7[沟通管理]
        A7 --&amp;gt; A8[风险管理]
        A8 --&amp;gt; A9[采购管理]
        A9 --&amp;gt; A10[干系人管理]
    end&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;知识领域&lt;/th&gt;
					&lt;th&gt;核心问题&lt;/th&gt;
					&lt;th&gt;新人重点&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;整合管理&lt;/td&gt;
					&lt;td&gt;怎么把零散的事串成整体？&lt;/td&gt;
					&lt;td&gt;写计划、做变更、开阶段评审&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;范围管理&lt;/td&gt;
					&lt;td&gt;到底做什么？不做什么？&lt;/td&gt;
					&lt;td&gt;WBS、需求澄清、范围变更控制&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;进度管理&lt;/td&gt;
					&lt;td&gt;什么时候做完？&lt;/td&gt;
					&lt;td&gt;里程碑、甘特图、关键路径&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;成本管理&lt;/td&gt;
					&lt;td&gt;要花多少钱？能不能省？&lt;/td&gt;
					&lt;td&gt;估算、预算、挣值分析&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;质量管理&lt;/td&gt;
					&lt;td&gt;做成什么样才算好？&lt;/td&gt;
					&lt;td&gt;验收标准、测试计划、质量回溯&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;资源管理&lt;/td&gt;
					&lt;td&gt;需要谁？怎么激励？&lt;/td&gt;
					&lt;td&gt;团队组建、责任分配矩阵 RAM&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;沟通管理&lt;/td&gt;
					&lt;td&gt;跟谁说什么？怎么说？&lt;/td&gt;
					&lt;td&gt;沟通计划、例会、周报、话术&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;风险管理&lt;/td&gt;
					&lt;td&gt;什么可能搞砸？怎么应对？&lt;/td&gt;
					&lt;td&gt;风险登记册、应急预案&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;采购管理&lt;/td&gt;
					&lt;td&gt;哪些东西要外购？&lt;/td&gt;
					&lt;td&gt;SOW、合同、供应商管理&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;干系人管理&lt;/td&gt;
					&lt;td&gt;谁在意这个项目？怎么管理期望？&lt;/td&gt;
					&lt;td&gt;干系人登记册、参与策略&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&#34;三项目铁三角与新六边形&#34;&gt;三、项目铁三角与新六边形&lt;/h2&gt;
&lt;h3 id=&#34;31-传统铁三角&#34;&gt;3.1 传统铁三角&lt;/h3&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    A[范围 Scope] --- B[进度 Schedule]
    B --- C[成本 Cost]
    C --- A&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;32-pmp-更完整的六边形制约&#34;&gt;3.2 PMP 更完整的六边形制约&lt;/h3&gt;
&lt;p&gt;现代项目管理认为，项目受多个因素共同制约：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TB
    Q[质量 Quality]
    S[范围 Scope]
    C[成本 Cost]
    T[进度 Time/Schedule]
    R[风险 Risk]
    RE[资源 Resources]

    Q --- S
    S --- C
    C --- T
    T --- R
    R --- RE
    RE --- Q&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;新人最常踩的坑&lt;/strong&gt;：客户说“加个小功能，不影响进度和成本”。你要意识到：&lt;strong&gt;范围变了，进度、成本、质量、风险几乎都会变&lt;/strong&gt;，只是影响大小不同。PM 的职责是把这些影响量化出来，让决策者做知情选择。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;四项目规划把大目标拆成可执行的小任务&#34;&gt;四、项目规划：把大目标拆成可执行的小任务&lt;/h2&gt;
&lt;p&gt;规划阶段是 PM 最需要下功夫的阶段。规划不好，执行再努力也白搭。&lt;/p&gt;
&lt;h3 id=&#34;41-计划分级不同人看不同粒度&#34;&gt;4.1 计划分级：不同人看不同粒度&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;级别&lt;/th&gt;
					&lt;th&gt;名称&lt;/th&gt;
					&lt;th&gt;用途&lt;/th&gt;
					&lt;th&gt;读者&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;0 级&lt;/td&gt;
					&lt;td&gt;里程碑计划&lt;/td&gt;
					&lt;td&gt;只显示关键节点&lt;/td&gt;
					&lt;td&gt;公司管理层、项目集经理&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;1 级&lt;/td&gt;
					&lt;td&gt;职能领域计划&lt;/td&gt;
					&lt;td&gt;各职能主要工作&lt;/td&gt;
					&lt;td&gt;项目经理、核心团队&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;2 级&lt;/td&gt;
					&lt;td&gt;专项详细计划&lt;/td&gt;
					&lt;td&gt;开发/测试/采购等展开&lt;/td&gt;
					&lt;td&gt;模块负责人&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;3 级&lt;/td&gt;
					&lt;td&gt;个人执行计划&lt;/td&gt;
					&lt;td&gt;任务到天/人&lt;/td&gt;
					&lt;td&gt;项目成员&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;42-wbs工作分解结构&#34;&gt;4.2 WBS：工作分解结构&lt;/h3&gt;
&lt;p&gt;WBS 是项目规划的骨架。核心原则：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;100% 原则&lt;/strong&gt;：所有项目工作都要被分解，不能遗漏。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;4-6 层原则&lt;/strong&gt;：一般 4 层左右，别超过 6 层。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;80 工时原则&lt;/strong&gt;：最底层任务一般不超过 80 小时（约 2 周）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;滚动式规划&lt;/strong&gt;：近期详细，远期粗略。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;干系人参与&lt;/strong&gt;：让相关人一起拆，不要 PM 一个人拍脑袋。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TD
    A[OTT 平台交付项目] --&amp;gt; B[需求与设计]
    A --&amp;gt; C[平台部署]
    A --&amp;gt; D[终端开发]
    A --&amp;gt; E[内容对接]
    A --&amp;gt; F[测试验收]
    A --&amp;gt; G[项目关闭]

    B --&amp;gt; B1[需求澄清会]
    B --&amp;gt; B2[方案设计]
    B --&amp;gt; B3[SOW 确认]

    C --&amp;gt; C1[云资源开通]
    C --&amp;gt; C2[流媒体部署]
    C --&amp;gt; C3[CDN 配置]

    D --&amp;gt; D1[Android STB]
    D --&amp;gt; D2[iOS Mobile]
    D --&amp;gt; D3[SmartTV]
    D --&amp;gt; D4[PC Web]

    E --&amp;gt; E1[直播源接入]
    E --&amp;gt; E2[VOD 内容上传]
    E --&amp;gt; E3[DRM 对接]

    F --&amp;gt; F1[E2E 测试]
    F --&amp;gt; F2[客户验收]
    F --&amp;gt; F3[问题整改]

    G --&amp;gt; G1[交付件归档]
    G --&amp;gt; G2[转维培训]
    G --&amp;gt; G3[项目总结]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;43-甘特图里程碑燃尽图&#34;&gt;4.3 甘特图、里程碑、燃尽图&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;甘特图&lt;/strong&gt;：横轴时间，纵轴任务，直观显示“谁什么时候做什么”。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;里程碑&lt;/strong&gt;：项目中的关键节点，通常零工期，用来标志阶段完成。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;燃尽图&lt;/strong&gt;：敏捷项目常用，显示剩余工作量随时间下降的趋势。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;gantt
    title 示例：OTT 项目关键里程碑
    dateFormat  YYYY-MM-DD
    section 启动与规划
    项目启动会           :a1, 2015-08-01, 7d
    SOW 确认             :milestone, after a1, 0d
    详细计划基线         :milestone, 2015-08-15, 0d
    section 执行
    平台部署             :2015-08-16, 14d
    终端开发             :2015-08-20, 20d
    内容对接             :2015-09-01, 10d
    section 验收
    E2E 测试             :2015-09-11, 10d
    客户验收             :milestone, 2015-09-25, 0d
    项目关闭             :2015-09-26, 5d&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;五项目执行与监控pdca-循环&#34;&gt;五、项目执行与监控：PDCA 循环&lt;/h2&gt;
&lt;p&gt;执行与监控不是“盯人”，而是&lt;strong&gt;计划 → 实施 → 反馈 → 调整&lt;/strong&gt;的循环。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TD
    P[Plan 计划] --&amp;gt; D[Do 执行]
    D --&amp;gt; C[Check 检查]
    C --&amp;gt; A[Act 调整]
    A --&amp;gt; P

    P -.-&amp;gt;|基线| M[范围/进度/成本基准]
    C -.-&amp;gt;|度量| D1[进度偏差&amp;lt;br/&amp;gt;成本偏差&amp;lt;br/&amp;gt;质量指标]
    A -.-&amp;gt;|措施| D2[纠正 / 预防 / 缺陷补救]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;监控阶段 PM 要回答的三个问题&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;我们现在在哪？（实际进度、成本、质量）&lt;/li&gt;
&lt;li&gt;我们离计划多远？（偏差）&lt;/li&gt;
&lt;li&gt;我们要怎么做？（纠正措施、变更、上报）&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;六沟通管理pm-70-时间都在沟通&#34;&gt;六、沟通管理：PM 70% 时间都在沟通&lt;/h2&gt;
&lt;p&gt;PMP 认为沟通管理是项目成败的关键。PM 不是传声筒，而是&lt;strong&gt;信息的过滤器、翻译器和加速器&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id=&#34;61-沟通管理四步法&#34;&gt;6.1 沟通管理四步法&lt;/h3&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    A[识别干系人] --&amp;gt; B[制定沟通计划]
    B --&amp;gt; C[执行沟通]
    C --&amp;gt; D[问题闭环]
    D --&amp;gt; A&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;62-干系人识别与分类&#34;&gt;6.2 干系人识别与分类&lt;/h3&gt;
&lt;p&gt;干系人就是对项目有影响或被项目影响的人。常见分类：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TB
    subgraph S[干系人四象限]
        direction LR
        A[高权力&amp;lt;br/&amp;gt;高利益] --- B[高权力&amp;lt;br/&amp;gt;低利益]
        C[低权力&amp;lt;br/&amp;gt;高利益] --- D[低权力&amp;lt;br/&amp;gt;低利益]
    end

    A --&amp;gt; A1[重点管理&amp;lt;br/&amp;gt;客户老板 / 项目发起人]
    B --&amp;gt; B1[令其满意&amp;lt;br/&amp;gt;职能部门领导]
    C --&amp;gt; C1[随时告知&amp;lt;br/&amp;gt;终端用户 / 运营人员]
    D --&amp;gt; D1[花最小精力监督&amp;lt;br/&amp;gt;外围支持人员]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;63-沟通方式选择&#34;&gt;6.3 沟通方式选择&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;场景&lt;/th&gt;
					&lt;th&gt;推荐方式&lt;/th&gt;
					&lt;th&gt;原因&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;复杂问题、有冲突&lt;/td&gt;
					&lt;td&gt;面对面 / 视频会议&lt;/td&gt;
					&lt;td&gt;能看到表情、即时反馈&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;需要留痕、正式确认&lt;/td&gt;
					&lt;td&gt;邮件 / 会议纪要&lt;/td&gt;
					&lt;td&gt;可追溯、可签字&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;日常进度同步&lt;/td&gt;
					&lt;td&gt;即时消息 / 日报&lt;/td&gt;
					&lt;td&gt;快速、轻量&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;跨部门协调&lt;/td&gt;
					&lt;td&gt;项目例会 / RACI 表&lt;/td&gt;
					&lt;td&gt;明确责任、统一节奏&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;64-高频沟通话术模板&#34;&gt;6.4 高频沟通话术模板&lt;/h3&gt;
&lt;h4 id=&#34;场景-1需求不明确需要客户确认&#34;&gt;场景 1：需求不明确，需要客户确认&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;“王总，关于 XX 功能，目前我们理解有两种实现方式：方案 A 是……，优点是……，缺点是……；方案 B 是……，优点是……，缺点是……。从项目范围和时间来看，我建议采用方案 A，您看是否可以确认？如果选 B，可能需要增加 3 天并调整后续测试计划。”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;要点&lt;/strong&gt;：给选项、讲影响、让客户做选择题而不是开放题。&lt;/p&gt;
&lt;h4 id=&#34;场景-2进度delay需要同步客户&#34;&gt;场景 2：进度Delay，需要同步客户&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;“李经理，想和您同步一个情况：受第三方接口延迟影响，模块 X 预计比原计划晚 2 天。我们已经采取了以下措施：1. 协调对方优先级；2. 并行启动模块 Y 测试；3. 准备临时方案。目前整体里程碑仍可控，我们会每天同步进展。这是详细的影响评估，您看是否需要召开专项会议？”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;要点&lt;/strong&gt;：先说事实、再说影响、最后给措施和选项。&lt;/p&gt;
&lt;h4 id=&#34;场景-3客户提出范围变更&#34;&gt;场景 3：客户提出范围变更&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;“张总，这个需求我们收到了。我先记录下来，明天下午 5 点前给您一份变更影响评估，包括：对进度、成本、质量、风险的影响，以及推荐方案。评估完成后我们再一起决策是否纳入本期交付。”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;要点&lt;/strong&gt;：不直接拒绝也不直接答应，用“评估 → 决策 → 实施”的流程争取时间。&lt;/p&gt;
&lt;h4 id=&#34;场景-4团队内部冲突&#34;&gt;场景 4：团队内部冲突&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;“你们两边的顾虑我都理解了：开发担心改动引发回归，测试希望尽早覆盖边界。我们的共同目标是按期高质量交付。这样，我们先用 15 分钟把边界场景列出来，评估改动范围，如果可控就本周内完成；如果范围大，就走变更流程。现在我们一起写一下场景清单。”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;要点&lt;/strong&gt;：点出共同目标、把冲突转化为任务、给明确截止时间。&lt;/p&gt;
&lt;h4 id=&#34;场景-5推动不愿配合的职能部门&#34;&gt;场景 5：推动不愿配合的职能部门&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;“刘经理，这个任务在咱们项目计划里是模块 X 的前置依赖，目前距离截止时间还有 3 天。如果这边不能按期提供，会导致下游 5 个人停工，整体里程碑风险会上升到高。您看能否协调资源优先处理？如果需要我向上汇报协调，我也可以同步项目发起人。”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;要点&lt;/strong&gt;：讲清楚依赖关系、量化影响、给对方台阶也保留升级路径。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;七变更管理拥抱变化拒绝侥幸&#34;&gt;七、变更管理：拥抱变化，拒绝侥幸&lt;/h2&gt;
&lt;p&gt;变更是项目常态，但 PM 不能当“传话筒”，必须建立变更控制机制。&lt;/p&gt;
&lt;h3 id=&#34;71-变更管理五步流程&#34;&gt;7.1 变更管理五步流程&lt;/h3&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TD
    A[变更识别] --&amp;gt; B[变更澄清]
    B --&amp;gt; C[变更分析]
    C --&amp;gt; D[变更决策]
    D --&amp;gt; E[变更实施与跟踪]
    E --&amp;gt; F[基线更新]

    A --&amp;gt;|任何人提出| A1[记录变更请求]
    B --&amp;gt;|聚焦价值| B1[明确变更内容和原因]
    C --&amp;gt;|四原则三标准| C1[范围/进度/成本/质量影响]
    D --&amp;gt;|CCB/客户| D1[批准/拒绝/暂缓]
    E --&amp;gt;|责任人| E1[执行并验证]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;变更分析四原则&lt;/strong&gt;：影响范围、进度、成本、质量都要评估。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;变更决策三标准&lt;/strong&gt;：必须做？值得做？现在做？&lt;/p&gt;
&lt;h3 id=&#34;72-变更管理话术&#34;&gt;7.2 变更管理话术&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;阶段&lt;/th&gt;
					&lt;th&gt;话术&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;识别&lt;/td&gt;
					&lt;td&gt;“收到，我先记录为变更请求 CR-001，稍后统一评估。”&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;澄清&lt;/td&gt;
					&lt;td&gt;“为了准确评估，能否确认一下：这个功能的使用场景是什么？必须在哪个版本上线？”&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;分析&lt;/td&gt;
					&lt;td&gt;“这个变更会影响 3 个模块，预计增加 5 人天，测试周期延长 2 天，风险等级为中。”&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;决策&lt;/td&gt;
					&lt;td&gt;“基于影响评估，建议本期不做，放到二期；如果必须做，需要追加预算并调整验收时间。”&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;实施&lt;/td&gt;
					&lt;td&gt;“变更已批准，这是更新后的计划和责任人，请大家按新基线执行。”&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&#34;八风险管理提前把坏事想清楚&#34;&gt;八、风险管理：提前把坏事想清楚&lt;/h2&gt;
&lt;p&gt;风险不是等问题发生了再处理，而是&lt;strong&gt;提前识别、评估、应对、监控&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id=&#34;81-风险管理四步法&#34;&gt;8.1 风险管理四步法&lt;/h3&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    A[风险识别] --&amp;gt; B[风险评估]
    B --&amp;gt; C[风险应对]
    C --&amp;gt; D[风险监控]
    D --&amp;gt; A

    A -.-&amp;gt;|工具| A1[头脑风暴 / 检查表 / 经验教训]
    B -.-&amp;gt;|维度| B1[概率 × 影响]&amp;lt;br/&amp;gt;高/中/低
    C -.-&amp;gt;|策略| C1[规避 / 转移 / 减轻 / 接受]
    D -.-&amp;gt;|动作| D1[跟踪 / 更新 / 触发应急]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;82-风险应对策略&#34;&gt;8.2 风险应对策略&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;策略&lt;/th&gt;
					&lt;th&gt;含义&lt;/th&gt;
					&lt;th&gt;例子&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;规避&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;不做或换方式，彻底消除风险&lt;/td&gt;
					&lt;td&gt;不用未经验证的新技术&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;转移&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;把风险后果转给第三方&lt;/td&gt;
					&lt;td&gt;买保险、签固定总价合同&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;减轻&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;降低概率或影响&lt;/td&gt;
					&lt;td&gt;增加测试、提前采购关键设备&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;接受&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;不采取措施，准备应急储备&lt;/td&gt;
					&lt;td&gt;预留缓冲时间或预算&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;83-风险登记册模板&#34;&gt;8.3 风险登记册模板&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;风险 ID&lt;/th&gt;
					&lt;th&gt;风险描述&lt;/th&gt;
					&lt;th&gt;概率&lt;/th&gt;
					&lt;th&gt;影响&lt;/th&gt;
					&lt;th&gt;等级&lt;/th&gt;
					&lt;th&gt;应对措施&lt;/th&gt;
					&lt;th&gt;责任人&lt;/th&gt;
					&lt;th&gt;状态&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;R01&lt;/td&gt;
					&lt;td&gt;第三方接口延迟&lt;/td&gt;
					&lt;td&gt;中&lt;/td&gt;
					&lt;td&gt;高&lt;/td&gt;
					&lt;td&gt;高&lt;/td&gt;
					&lt;td&gt;提前 2 周启动对接，准备 mock&lt;/td&gt;
					&lt;td&gt;张三&lt;/td&gt;
					&lt;td&gt;跟踪&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;R02&lt;/td&gt;
					&lt;td&gt;核心人员离职&lt;/td&gt;
					&lt;td&gt;低&lt;/td&gt;
					&lt;td&gt;高&lt;/td&gt;
					&lt;td&gt;中&lt;/td&gt;
					&lt;td&gt;建立备份机制，文档化&lt;/td&gt;
					&lt;td&gt;李四&lt;/td&gt;
					&lt;td&gt;跟踪&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;R03&lt;/td&gt;
					&lt;td&gt;客户需求频繁变更&lt;/td&gt;
					&lt;td&gt;高&lt;/td&gt;
					&lt;td&gt;中&lt;/td&gt;
					&lt;td&gt;高&lt;/td&gt;
					&lt;td&gt;固化 SOW，严格变更流程&lt;/td&gt;
					&lt;td&gt;PM&lt;/td&gt;
					&lt;td&gt;跟踪&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;84-风险沟通话术&#34;&gt;8.4 风险沟通话术&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;“我们在风险评审中发现，第三方 DRM 对接存在延期可能。当前概率评估为中等，但一旦发生会影响整个验收。我们的应对措施是：本周内完成技术预研，并准备一套降级方案。责任人是我，下次周会同步进展。”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;九项目验收与关闭&#34;&gt;九、项目验收与关闭&lt;/h2&gt;
&lt;p&gt;项目不是上线就结束了，验收和关闭同样重要。&lt;/p&gt;
&lt;h3 id=&#34;91-验收流程&#34;&gt;9.1 验收流程&lt;/h3&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TD
    A[完成全部交付件] --&amp;gt; B[配置审核]
    B --&amp;gt; C[入口条件审核]
    C --&amp;gt; D[提交验收申请]
    D --&amp;gt; E[客户组建验收组]
    E --&amp;gt; F[正式验收测试]
    F --&amp;gt; G{是否通过?}
    G --&amp;gt;|是| H[签署验收报告]
    G --&amp;gt;|否| I[问题整改]
    I --&amp;gt; F
    H --&amp;gt; J[项目关闭 / 转维]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;92-验收前-pm-自检清单&#34;&gt;9.2 验收前 PM 自检清单&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 合同 / SOW 约定的交付件是否全部完成？&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 测试报告、用户手册、运维文档是否归档？&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 已知缺陷是否有客户书面确认？&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 验收申请是否正式发出？&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 验收标准和测试用例是否与客户对齐？&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;93-项目关闭三件套&#34;&gt;9.3 项目关闭三件套&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;验收报告&lt;/strong&gt;：客户签字，确认交付完成。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;经验教训&lt;/strong&gt;：好的坏的都记下来，下次不再踩坑。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;转维交接&lt;/strong&gt;：让运维/运营团队能接手。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;十案例复盘为什么-a项目-能成transvision项目-不行&#34;&gt;十、案例复盘：为什么 A项目 能成，Transvision项目 不行&lt;/h2&gt;
&lt;h3 id=&#34;101-a项目成功交付的关键&#34;&gt;10.1 A项目：成功交付的关键&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;范围清晰&lt;/strong&gt;：直播/DVR/catchup + 付费/预付费模式 + launcher/广告/getsapp。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;计划可控&lt;/strong&gt;：首期 3 个月 12 天，二期 3 个月，节奏稳定。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;沟通及时&lt;/strong&gt;：与客户保持良好及时的沟通。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;风险质量进度都管住了&lt;/strong&gt;：最终客户满意度高，用户增长迅速。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;启示&lt;/strong&gt;：项目成功 = 清晰范围 + 可控计划 + 有效沟通 + 风险管理。&lt;/p&gt;
&lt;h3 id=&#34;102-transvision项目为什么不可交付&#34;&gt;10.2 Transvision项目：为什么不可交付&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;需求边界不清&lt;/strong&gt;：全终端、双 DRM、多支付、广告、CP Dashboard、用户割接、时移、ABR……堆在一起。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;成本无法核算&lt;/strong&gt;：套餐定价与 XXX公司 成本核算难以达成明确结论。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;商业可行性存疑&lt;/strong&gt;：POC 持续近一年，成本约 5000 美金，最终被拒。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;启示&lt;/strong&gt;：PM 要敢于在早期说“这个项目不可交付”——不是消极，而是对组织负责。项目经营责任者的角色要求 PM 评估商业可行性，而不仅是执行。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;十一给-pm-新人的三条成长建议&#34;&gt;十一、给 PM 新人的三条成长建议&lt;/h2&gt;
&lt;h3 id=&#34;1-先建立流程感再追求灵活性&#34;&gt;1. 先建立“流程感”，再追求“灵活性”&lt;/h3&gt;
&lt;p&gt;新人常犯的错误是觉得流程麻烦、想快速跳过。但流程是保护你的：变更流程保护你不被客户随意改需求，风险流程保护你不被突发问题打懵。先把流程跑熟，再谈灵活裁剪。&lt;/p&gt;
&lt;h3 id=&#34;2-把人当成项目最重要的风险&#34;&gt;2. 把“人”当成项目最重要的风险&lt;/h3&gt;
&lt;p&gt;进度延期、需求变更、技术问题，归根到底都是人的问题。PM 70% 的时间要花在沟通上：对齐期望、解决冲突、激励团队、管理客户。&lt;/p&gt;
&lt;h3 id=&#34;3-练习结构化表达&#34;&gt;3. 练习“结构化表达”&lt;/h3&gt;
&lt;p&gt;PM 的话术不是油滑，而是&lt;strong&gt;结构化&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;结论先行&lt;/li&gt;
&lt;li&gt;给数据和事实&lt;/li&gt;
&lt;li&gt;讲影响和选项&lt;/li&gt;
&lt;li&gt;明确下一步和责任人&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;十二总结一张图看懂-pm-的核心工作&#34;&gt;十二、总结：一张图看懂 PM 的核心工作&lt;/h2&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TB
    A[项目目标] --&amp;gt; B[范围管理]
    B --&amp;gt; C[WBS 分解]
    C --&amp;gt; D[进度/成本/质量计划]
    D --&amp;gt; E[执行 + 监控]
    E --&amp;gt; F[沟通 / 风险 / 变更]
    F --&amp;gt; G{验收通过?}
    G --&amp;gt;|是| H[项目关闭]
    G --&amp;gt;|否| I[整改 / 变更]
    I --&amp;gt; E

    style A fill:#e0f2fe
    style H fill:#dcfce7
    style I fill:#fee2e2&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;PM 的核心能力可以概括为三句话：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;把事情做对&lt;/strong&gt;：理解需求、拆清范围、管好进度成本质量。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;把人对齐&lt;/strong&gt;：识别干系人、制定沟通策略、化解冲突。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;把风险控住&lt;/strong&gt;：提前识别、量化影响、准备预案。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如果你刚转 PM，别急着背 49 个过程。先把这篇文章里的角色认知、五大过程组、WBS、沟通、变更、风险管理跑起来，你就已经比大多数新人走得更稳了。&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;参考&lt;/strong&gt;：本文部分内容结合《XXX PM 角色认知》培训材料与 PMBOK 第七版/第六版项目管理知识体系整理，融入一线 OTT 项目交付经验。&lt;/p&gt;
&lt;/blockquote&gt;
</description>
    </item>
    
  </channel>
</rss>
