ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

第 0 章 · 导航与内容提要

第 0 章 · 导航与内容提要 这一章不教任何模式。它回答三个问题这套教程有什么、怎么读、读完应该能做什么。建议花 20 分钟读完再进第 1 章跳读时把它当索引回来查。本教程口径g -stdc23 -Wall -Wextra本机 g 15.2.0。参考教材《Design Patterns in Modern C20: Reusable Approaches for Object-Oriented Software Design》Second Edition 。代码下载 设计模式 in Modern C 专栏配套代码一、全书写作大纲1.1 素材与目标这一套教程的主线很简单我把原书当作参考地图而不是命令书。设计模式不是“把书上的名字背熟”而是判断“这个问题该不该用这个模式为什么一旦用起来代价在哪里”。这也是为什么本教程的口径不是“照抄 C20 原书”而是“按 C23 重新检验”。如果原书写在 C20而标准和实践已经给出更清晰的答案我会说明哪一处变了、为什么变了、该用什么版本的写法。本教程统一按g -stdc23 -Wall -Wextra组织示例和论证。这个口径不是为了炫技而是因为很多讲法在 C20 和 C23 之间已经出现了明显差异尤其是生成器、std::expected、std::ranges这类题材。原书仍然重要但它不是唯一真相。我不会把它当成逐章复述的材料我会把它当成问题入口。哪些东西还成立哪些地方过时哪些地方需要重写这才是本书真正关心的问题。每一章最后都落回到一句话这个模式值不值得用什么时候值得什么时候不值得。参考书与本教程的关系原书提供材料、章节脉络和典型例子本教程负责筛选、校验、补足和反驳。它的任务不是把原书翻成中文而是把整套设计知识重新整理成一套在 C23 下可以直接使用的判断框架。目标读者起点已经熟悉 C 基础与 STL能写类、模板、容器、智能指针这些基础构件终点面对新需求时能判断“该不该引入模式、引入哪个、代价是什么、什么时候应该退回简单方案”风格这是深度阅读教程不是原书复述也不是零基础入门。难度预设中级偏上项内容主体必须全过讲机制、挂标准与语言特性、给出工程化写法、说明代价和替代方案、指出适用边界向上够到本档硬指标每章至少一处权衡矩阵与一处反例说明什么时候不该用不只给单一推荐明确不做不做零基础铺垫不解释“类、虚函数、模板、智能指针是什么”初级判据的用法只保留“可读性提醒”术语首次出现要解释示例要能单独看懂不堆新概念这本书不打算写成一套“每节都是模板”的教材。相反我会尽量保持一种更容易接受的方式先给真实问题再给方案再说明代价和边界。这样读起来会更像一个有经验的软件工程师在给你讲设计而不是一份知识综述。正文用两个深度标注分流〔核〕主体必读机制、工程写法、代价与替代方案、练习这些是全章的骨架〔深〕进阶深读权衡矩阵、标准措辞、实现差异、作者让位、未验证处、相邻范式关系。它们是加深判断力的地方但不构成断链。三条硬性约定每章至少有一条〔核〕准则和一条〔核〕配方并且这些内容都必须能独立编译运行每章至少一处权衡矩阵和一处反例 / 失效条件每章都要单独给出“最小可跑示例”不能拿一个故意危险或故意编不过的首例顶替真正的入口。1.2 选材地图用途材料怎么用主线精读原书 Ch1–Ch24 正文 各章 Summary 三个 Part 引言每章都要做页码引用Summary 往往能看出作者在强调什么规范手册C23 标准条款 cppreference遇到“标准怎么说”时查阅关键判断要给条款号按需查阅GoF 原书、Boost 文档、Google Test、C Core Guidelines只在对应章节做对照不做主线阅读公共知识模式的来路、演化史、争议、现代替代方案产物在设计模式/公共知识-设计模式.md只保留与设计模式判断直接相关的内容公共知识这部分的边界很重要它不是全 C 知识库也不是一份“我搜了很多资料”的索引。它只在三种情况下才进入正文原书与权威来源冲突必须说明差异一个观点会直接改变读者的工程判断这个结论有明确的误传来源需要澄清。我不会把公共知识写成文献综述。查资料是为了给判断做支撑不是为了把一堆来源硬塞进正文。原书章节在本教程中的位置原书 Ch1 ─┬─→ 教程 Ch1 语汇与静态多态工具箱 └─→ 教程 Ch2 SOLID 原书 Ch2 ────→ 教程 Ch3 Builder 原书 Ch3 ────→ 教程 Ch4 Factories 原书 Ch4,5 ───→ 教程 Ch5 Prototype 与 Singleton 原书 Ch6,10 ──→ 教程 Ch6 Adapter 与 Façade 原书 Ch7,12 ──→ 教程 Ch7 Bridge 与 Proxy 原书 Ch8 ────→ 教程 Ch8 Composite 原书 Ch9,11 ──→ 教程 Ch9 Decorator 与 Flyweight 原书 Ch13,14 ─→ 教程 Ch10 CoR 与 Command 原书 Ch15,16 ─→ 教程 Ch11 Interpreter 与 Iterator 原书 Ch17,20 ─→ 教程 Ch12 Mediator 与 Observer 原书 Ch21,22,23 → 教程 Ch13 State / Strategy / Template Method 原书 Ch24 ────→ 教程 Ch14 Visitor 原书 Ch18,19 ─→ 教程 Ch15 Memento、Null Object 与模式的位置1.3 全局设计编号体系每章复用前缀含义用途Pn.k准则Principle可迁移的判断原则Rn.k配方Recipe可直接抄用的写法Cn.k印证条款Clause原书原句带页码用来印证 P/RTn.k陷阱Trap反面示例、失效条件引用格式统一为原书页码。正文里不会摆一大堆“文献名录式”的引用它们只会在需要证明判断时出现。术语表规范每章必备 全书总表每章末尾都要有“本章术语表”固定三列术语、解释、首次出现位置。这里不是给百科全书收词而是给读者做回溯索引。任何只在正文里出现但不在术语表中出现的名词都会被视为不合格。术语表的写法很简单一句话说清“它是什么、干什么用”不要抄百科也不要堆形容词。英文术语放在括号里.代码计划与验证口径代码每章示例独立成文件ch章_名字.cpp练习答案ex章_题号_名字.cpp编译标准g -stdc23 -Wall -Wextra性能测试另用-O2要求预热 1 次并重复 ≥ 5 次取中位数UB / 崩溃示例用-fsanitizeaddress,undefined -g必须贴真实 sanitizer 报错不能只靠嘴说“它会崩”过时条款过滤表括号内是原书章节本教程章节在后面。这里的目的不是把所有旧东西都批倒而是把“还能用、需要改写、已经过时”分清楚。条目原书章本教程判定处理boost::signals2Ch13/17/20Ch10 / Ch12仍有效但非标准保留为工业做法同时给出std::function回调版Boost.DICh1/5Ch2 / Ch5未进入 Boost 正式库降级为了解即可主线用手写构造注入Boost.SerializationCh4Ch5仍有效保留为外部依赖主线另给手写深拷贝版Boost.MSMCh21Ch13仍有效保留为工业级对照主线用枚举 map版double-checked lockingCh5Ch5已过时只在“为什么现在不需要”里出现__declspec(property)Ch1/12Ch1 / Ch7编译器扩展非标准标注可移植性代价主线用PropertyT代理generatorT协程Ch16Ch11原书写作时候还未入标准库主线改用std::generatorGoogle TestCh5 测试示例Ch5仍有效保留为测试写法示例标注外部依赖1.4 章节结构正文共 15 章再加上本章共 16 份章节文档。每一章都围绕一个实战主题展开不会为了模式名称而硬分章节。每章正文固定七段实战主题 → 核心准则 → 关键配方 → 印证条款 → 综合练习 → 验收自测 → 本章术语表。这是一种稳妥的节奏先给问题再给规则再给例子再给验证。它既能教会“怎么做”也能教会“什么时候不该做”。七段是「每章都有什么」不是「每章都长一个样」。组织方式、分节理由、节末格式、导语写法、〔核〕/〔深〕的配比各章必须不同——具体约定见本章第四节的〈章节节律约定〉。章节总表章标题归并自实战主题一句话最小可跑示例1设计语汇与静态多态工具箱原书 Ch1Important ConceptsC 有四种编译期多态手法确立全书唯一判据每个模式都要当场报价ch01_plain_notifier.cpp2SOLID 五原则判据、代价与反面原书 Ch1SOLID五条原则经常被当口号背要拿到的是每条原则的判据、代价以及作者在哪一条上不按教科书走ch02_srp.cpp3Builder分步构造与流式接口原书 Ch2对象无法在一行构造函数里造完时怎么把构造过程变成一段可读的代码ch03_fluent.cpp4Factories把「能说不」交给创建者原书 Ch3构造函数无法拒绝构造创建可能失败 / 返回派生类型 / 需要缓存时创建职责应当外移ch04_factory_method.cpp5Prototype 与 Singleton复制与唯一原书 Ch4 Ch5不复用构造而是复制现成对象以及它的反面——全程序只允许一个ch05_virtual_clone.cpp6Adapter 与 Façade把接口接上把子系统收口原书 Ch6 Ch10两个各自成立的接口怎么在不改任何一方的前提下接起来一堆复杂子系统怎么给它开一扇简单的门ch06_adapter_iterator.cpp7Bridge 与 Proxy抽象与实现的分离以及接口不变的行为增强原书 Ch7 Ch12一组互相知道对方的参与者怎么各自独立演化调用方一行都不用改的前提下怎么改变行为ch07_pimpl.cpp8Composite把单个对象和一组对象一视同仁原书 Ch8树形结构里让叶子与分支走同一套代码以及为了这个目标你愿意付多少代价ch08_group_shapes.cpp9Decorator 与 Flyweight动态叠加与共享的重原书 Ch9 Ch11给对象加功能但不修改它、也不继承它对象数量巨大且高度相似时用共享压内存ch09_dynamic_decorator.cpp10Chain of Responsibility 与 Command请求的链式传递与对象化原书 Ch13 Ch14一串组件依次处理同一个请求把「怎么做」从方法调用提升为对象于是 undo、审计、宏录制才有可能ch10_pointer_chain.cpp11Interpreter 与 Iterator语言处理与遍历原书 Ch15 Ch16解释输入——从整数解析一路到 DSL以及手写迭代器并看到它的结构性缺陷ch11_preorder_iter.cpp主线版另见ch11_std_generator.cpp12Mediator 与 Observer组件怎么互相说话以及订阅的代价原书 Ch17 Ch20组件之间要通信但不该互相持有指针后者他写了整整一章、最后承认是过度工程ch12_chatroom.cpp13State、Strategy 与 Template Method把变化的那部分隔离出来原书 Ch21 Ch22 Ch23同一个问题的三种切法——状态驱动行为、算法可替换、骨架固定细节可变ch13_dynamic_strategy.cpp14Visitor给已有类型层次加操作原书 Ch24已有类型层次且没有源码修改权时怎么给每个类型加新操作给五种做法并逐一评分ch14_reflective.cpp15Memento、Null Object 与「模式在今天的位置」原书 Ch18 Ch19 新增收束把状态封装成只读 token 以便回滚给「缺席」造一个安全的替身回答全书唯一的真问题——这个模式现在还值不值得用ch15_null_logger.cpp难度定位中级偏上单一档 可选进阶深读主体要求〔核〕必须全过维度落点机制每个 P 条目必须回答「为什么这样设计 / 为什么能工作」不写「怎么做」就完事语言关联每条关键判断挂到核实过的标准条款号或具体语言特性不许凭记忆写条款号工程性示例贴近可复用 / 可测试的写法RAII、接口隔离、错误处理原书的裸new/delete风格要么现代化要么明确标注「原书如此代价是什么」对照原书覆盖原书要点的同时指出哪里是本教程的补充 / 简化 / 修正取舍每个模式都要当场报价多付多少复杂度、编译期还是运行期、对可测试性的影响练习每章综合练习三级梯度编号En.1照着做 →En.2改一改 →En.3自己设计答案与解析随章末给出。15 章已逐章落题不是承诺进阶深读要求〔深〕每章至少各一处硬指标说明落点举例权衡矩阵同一问题 ≥2 种方案对比性能 / 复杂度 / 可维护性不给单一推荐了事第 2 章 LSP 三修法、第 4 章 variant vs 虚函数、第 7 章 Proxy 三兄弟判别、第 13 章四种状态机实现、第 14 章 Visitor 五做法反例 / 失效条件明确「何时不该用」各章Tn.k陷阱条第 3 章构造过程不复杂就别用 Builder、第 4 章 Abstract Factory 罕见〔深〕的主线作者明确让位 / 未验证 / 未量化之处章作者让位 / 未做什么出处第 6 章Trading Terminal只有骨架无可编译代码第 185–190 页第 8 章concept-enabled CRTP编译失败作者说「我猜这不可能」第 157 页第 9 章拒绝给空间节省的统计数字第 194 页第 11 章Interpreter「一章书无法公正对待」明确让位给 Lex / Yacc / ANTLR第 260 页第 11 章迭代器遍历没有 benchmark—第 12 章Observer没有理想实现「不管选哪个都要妥协」第 322 页第 14 章Acyclic 的 10x 只是 “Empirical evidence”二手、未给测法第 373 页这些空白由本教程逐条补实测或如实标注「复现不出」——不替作者编数字。〔深〕必须处理的三组矛盾「完整主义」 vs 「这是过度工程」——第 3 章Builder 反调第 66 页、第 8 章Composite 自认多余第 161 页、第 12 章Observer 自认过度工程第 322 页「规则明确」 vs 「规则随例子翻转」——第 8 章继承std::vector三次翻转与第 10 章第 236 页对照「鸭子类型是糟糕主意」 vs 整章建立在鸭子类型上——第 8 章第 145 页 vs 第 155 页。可操作判据把上面的矛盾变成能用的规则同一条规则在 ≥3 处、跨 ≥2 章出现且方向一致才升级为原则否则按修辞站位处理。第 2 章P2.3就是这个判据的一次实际使用作者那句「OCP 不是真问题SRP 才是」在原书里只出现 1 次按这条判据不升级为原则。跨范式迁移协程第 11 章、std::variant/std::visit第 13、14、15 章、concepts第 1、8、9 章、函数式第 9、13 章。完成标志能指出本书哪些结论在 C23 / 26 下已经动摇哪些仍然成立。1.5 阅读路径与节奏默认节奏每周 2 章约 8 周15 章 ÷ 2 ≈ 7.5 周留半周缓冲。每章正文都只带〔核〕/〔深〕两个标注所以换节奏不需要改正文下面的慢档 / 快档只是把同一份正文读成不同的疏密随时可换。前置无论走哪档都建议先读第 1–2 章第 1 章CRTP / Mixin / concepts与第 2 章SOLID是全书的语汇前置——作者本人在原书里也是这么排的。跳过它们会直接撞上第 8、9 章的语法断层。注意这是「语汇前置」不是「零基础铺垫」——第 1 章假定你已经会写模板。默认档每周 2 章约 8 周一周两章每章先读〔核〕块、把该章code/跑一遍〔深〕块两章各挑一处读不追求当周全消化每周留一次「重编译 改一改」的动手时间三题练习至少做完En.1照做与En.2改一改En.3攒到复习时做每 4 周约 8 章插入一次复习回看这 8 章的模式只做第 15 章的决策树练习适合每周可投入 6–8 小时想按部就班读完 15 章。可换档同一份正文换节奏不换内容慢档每两周 1 章约 30 周最稳一章一周读、一周动手读完〔核〕块把该章code/全部跑一遍〔深〕块选读每 5 章插入一次复习回看这 5 章的模式只做第 15 章的决策树练习适合有全职工作每周可投入 2–3 小时。快档每周 3 章约 5 周冲刺只读〔核〕块代码只跑每章指定的「最小可跑示例」第 1–2 章仍然完整读前置不能跳冲刺完成后再挑 6 个最有用的模式第 3、5、9、10、12、14 章补读〔深〕块适合有时间窗口压力先建立全图景。三种走法与节奏正交顺序读第 1 → 15 章。适合第一次读。跳读按问题而非章节跳。索引见第 15 章的决策树「构造可能失败」→ 第 4 章「要在测试里换掉」→ 第 5 章「要给已有层次加操作」→ 第 14 章「接口不改但行为要变」→ 第 7 章「对象数量爆炸」→ 第 9 章「一整族要配套替换」→ 第 4 章Abstract Factory 那一节。复习读只读第 15 章 各章末的「验收标准」段 〔深〕块。二、各章内容提要每章三到五句回答三件事解决什么问题 / 用什么准则与配方 / 产出什么能力。第 1 章 · 设计语汇与静态多态工具箱原书 Ch1别名有四种编译期多态手法怎么在它们之间选本章把虚函数、CRTP、Mixin、concept 摆在一张表上每种当场报出价钱P1.1–P1.4配方是R1.1–R1.4四段能跑的对照代码。它同时确立全书唯一的判据每个模式都要当场报价。读完能得到给一个「基类只想调用派生类接口」的场景说得出 CRTP 与 concept 各自多付了什么。第 2 章 · SOLID 五原则判据、代价与反面原书 Ch1五条原则常被当口号背本章要的是每条原则能拿来判定的测试、照做之后的代价、以及它的失效边界。准则P2.1SRP 的操作定义、P2.2OCP 的现代说法、P2.3原则之间的优先级配方R2.1–R2.4SRP 形状 / Specification Filter / 拆接口 委托 / 构造注入。本章还修正了原书 OCP 一节里三处互不兼容的签名并把「组合子存引用」这笔账用 sanitizer 量了出来。读完能得到给出一个违反 LSP 的继承结构说出三种解法并各自定价。第 3 章 · Builder分步构造与流式接口原书 Ch2对象没法在一行构造函数里造完时怎么把构造过程变成一段能读的代码。准则只有两条P3.1流式接口的本质、P3.2约束靠机制不靠文档配方五段从最简链一路推到CRTP 修继承与 Builder Parameter。本章最有信息量的一处读数CRTP 链上每个 setter 返回的不是最派生类而是链上下一层——原书没写这一层。读完能得到说出 Builder 的代价更难用、更不直观并给出「什么情况下不该用」——包括 C20 指定初始化能替掉它的哪一半、替不掉哪一半。第 4 章 · Factories把「能说不」交给创建者原书 Ch3构造函数没有返回值所以它无法拒绝构造——这是全章的起点。准则P4.1工厂相对构造函数的四项能力、P4.2工厂与 Builder 的分界、P4.3模式实用度差异极大作者给 Abstract Factory 公开降级配方R4.1–R4.5覆盖五种工厂形态R4.5 是本教程在大纲 R4.1–R4.4 之外的显式扩展大纲把 Abstract Factory 留在 C4.2 的降级讨论里正文把它编成了一个配方。本章把「用工厂」与「用标准库的工厂」的冲突用实测钉住protected构造挡住了make_unique。读完能得到拿到一个「构造可能失败」的类型说出三种把失败表达出去的方式并各自定价。第 5 章 · Prototype 与 Singleton复制与唯一原书 Ch4 Ch5两个「对象数量」上的极端复制一个 vs 只留一个。前半章讲深拷贝、clone()与协变返回的限制后半章是原书态度最负面的部分——作者跳过了 double-checked locking理由值得单独看。读完能得到对double指针、unique_ptr成员分别判断「默认拷贝会发生什么」拿到任意一个单例代码当场指出它在测试里怎么卡住。第 6 章 · Adapter 与 Façade把接口接上把子系统收口原书 Ch6 Ch10两个各自成立的接口怎么在不改任何一方的前提下接起来一堆复杂子系统怎么给它开一扇简单的门。本章是原书「补桩最重」的一处——Trading Terminal 只有骨架、没有可编译代码本教程按「自建同进程玩具后端」的方式补齐。读完能得到判断一个适配器是否该存在vs 直接改接口指出它的静默失败模式判断什么时候该加 Façade、什么时候它只是多一层没用的包装。第 7 章 · Bridge 与 Proxy抽象与实现的分离以及接口不变的行为增强原书 Ch7 Ch12一组互相知道对方的参与者怎么各自独立演化Bridge / Pimpl以及调用方一行都不用改的前提下怎么改变行为Proxy。第 1 章留下的__declspec(property)那一笔账在这里落到 Property Proxy 上。读完能得到说出 Pimpl 的三个好处说出 Proxy vs Decorator vs Adapter 三者的判别标准而不是背定义。第 8 章 · Composite把单个对象和一组对象一视同仁原书 Ch8树形结构里让叶子和分支走同一套代码——以及为了这个目标你究竟愿意付多少代价。本章是全书〔深〕最重的章之一作者对「继承std::vector」这件事在书里翻转了三次还留下了一句「concept-enabled CRTP 我猜不可能」。读完能得到说出 Composite 与「简单容器」的分界解释 concept-enabled CRTP 为什么编不过本教程会亲手复现那次失败。第 9 章 · Decorator 与 Flyweight动态叠加与共享的重原书 Ch9 Ch11给对象加功能但不修改它、也不继承它以及对象数量巨大且高度相似时用共享把内存压下来。作者在这里拒绝给空间节省的统计数字本教程替他量ch09_measure.cpp是本机实测。读完能得到给定 N 个可选增强算出朴素的继承方案需要多少个类拿到一个内存场景算节省量级并说出代价。第 10 章 · Chain of Responsibility 与 Command请求的链式传递与对象化原书 Ch13 Ch14一串组件依次处理同一个请求可中途截断、可叠加修改以及把「怎么做」从方法调用提升为对象于是 undo、审计、宏录制才有可能。读完能得到说出「忘调基类」这类静默失效的风险并给出机制化防护判断一个命令对象是否需要 undo并说出实现 undo 需要额外记录什么。第 11 章 · Interpreter 与 Iterator语言处理与遍历原书 Ch15 Ch16解释输入——从整数解析一路到 DSL以及手写迭代器并看到它的结构性缺陷。本章有一处明确的代差原书写书时std::generator还没进标准库本教程按 C23 走并把迭代器 / 递归 / 协程三条遍历路线做了 benchmark。读完能得到写出一个能处理括号与优先级的求值器并说明它不支持什么说出「什么时候该写迭代器什么时候该用协程」。第 12 章 · Mediator 与 Observer组件怎么互相说话以及订阅的代价原书 Ch17 Ch20组件之间要通信但不该互相持有指针两页就讲完字段变化时要通知订阅者作者写了整整一章最后承认是过度工程。读完能得到判断一组组件该用 Mediator 还是直接引用并说出各自的失败模式说出「支持退订」的连锁代价重入、并发修改、锁并判断自己的场景该不该支持。第 13 章 · State、Strategy 与 Template Method把变化的那部分隔离出来原书 Ch21–Ch23同一个问题的三种切法——状态驱动行为、算法可替换、骨架固定细节可变。作者在这里系统性地否定 GoF 经典 State 实现并给出四种替代实现逐一评分。读完能得到对同一个状态机写出「表驱动」与「switch」两版并说出适用边界把同一段逻辑分别写成 Strategy 版与 Template Method 版并说出选择的判据。第 14 章 · Visitor给已有类型层次加操作原书 Ch24已有类型层次且没有源码修改权时怎么给每个类型加新操作。本章给出五种做法并逐一评分。读完能得到面对一个已有类型层次从五种做法中选出一种并说清另外四种为什么被排除。第 15 章 · Memento、Null Object 与「模式在今天的位置」原书 Ch18 Ch19 收束把状态封装成只读 token 以便回滚给「缺席」造一个安全的替身最后回答全书唯一的真问题——这个模式现在还值不值得用。本章带全书唯一的决策树索引跳读时的入口就在这儿。读完能得到实现一个 undo / redo 并说出「恢复操作本身是否应该入历史」的取舍给一个没见过的需求在没看答案的情况下说出该不该引入模式、引入哪个、代价是什么、什么时候该退回去。三、阅读路径见 1.5 节已随大纲搬入。这里只补三句「怎么用」的实操建议每章的「最小可跑示例」先跑一遍再读正文。章节总表里那一列就是给你按图索骥的〔深〕块不要一次性读完。它写的是权衡与边界没有对应的问题在手边时读不进去。建议一周挑一处读完立刻动手改一改那处代码。第 15 章的决策树是跳读索引。手上有一个具体问题时从那里倒着找章节比顺序翻快得多。四、术语总表入口全书术语总表《设计模式 in Modern C20 · 深度阅读教程》术语总表各章术语表在每章末尾第七段三列固定术语 / 一句话解释 / 首次出现每章表末尾有一行「→ 全书术语总表」。去重规则同一术语只在首现章收录后续章写「见第 N 章术语表」。因此术语总表里每一条都只有一个来源章——两条来源就是重复收录需要修。五、验收标准总表每章读完应该达到的状态这是各章末尾「验收标准」段的汇总逐条可自测章读完应达到1给一个「基类只想调用派生类接口」的场景说出 CRTP 与 concept 两种解法各自多付了什么代价2给出一个违反 LSP 的继承结构说出三种解法并各自定价3说出 Builder 相对构造函数的代价更难用、更不直观并给出「什么情况下不该用」4拿到一个「构造可能失败」的类型说出三种把失败表达出去的方式并各自定价5对double指针、unique_ptr成员分别判断「默认拷贝会发生什么」拿到任意一个单例代码当场指出它在测试里怎么卡住6判断一个适配器是否该存在vs 直接改接口指出它的静默失败模式判断什么时候该加 Façade、什么时候它只是多一层没用的包装7说出 Pimpl 的三个好处、Bridge 相对 Mediator 在解耦程度上差在哪说出 Proxy vs Decorator vs Adapter 三者的判别标准8说出 Composite 与「简单容器」的分界并判断一个树形设计该用哪个解释 concept-enabled CRTP 为什么编不过9给定 N 个可选增强算出朴素继承方案需要多少个类说明装饰器怎么避开拿到一个内存场景算出节省量级并说出代价10说出「忘调基类」这类静默失效的风险并给出机制化防护判断一个命令对象是否需要 undo说出实现 undo 需要额外记录什么信息11写出一个能处理括号与优先级的四则运算求值器并说明自己的实现不支持什么说出「什么时候该写迭代器什么时候该用协程」并解释原因12判断一组组件该用 Mediator 还是直接引用说出各自的失败模式说出「支持退订」的连锁代价重入、并发修改、锁并判断自己的场景该不该支持13对同一个状态机写出「表驱动」与「switch」两版并说出适用边界把同一段逻辑分别写成 Strategy 版与 Template Method 版说出选择的判据14面对一个已有类型层次从五种做法中选出一种并说清另外四种为什么被排除15实现一个 undo / redo 并说出「恢复操作本身是否应该入历史」的取舍判断一个接口该不该主动支持Null Object 并说出三种表达方式各自的代价给一个没见过的需求在不看答案的情况下说出该不该引入模式、引入哪个、代价是什么、什么时候该退回去全书级验收读完 15 章之后能指出本书哪些结论在 C23 / 26 下已经动摇哪些仍然成立能对着任意一个模式说出它的四项账多付多少复杂度、编译期还是运行期、对可测试性的影响、什么时候该退回去第 15 章的决策树能当场用起来——给一个没见过的需求倒着找到对应的章节。
返回列表