某编译器已经建立稳定的抽象语法树,树中包含常量节点、变量节点、运算节点等多种元素。团队需要不断增加类型检查、代码生成、格式化输出等操作,但不希望每增加一种操作就修改所有节点类。较适合采用的设计模式是()。
访问者模式适合对象结构相对稳定、但需要经常增加新操作的场景。抽象语法树节点类型相对稳定,而类型检查、代码生成、格式化等操作可能持续扩展,把这些操作封装为不同访问者,可以避免把所有操作都堆进节点类。
选项分析
正确。访问者把不同操作封装起来,并能针对不同元素类型执行相应处理。
错误。状态模式解决对象因内部状态变化而改变行为的问题,不以扩展对象结构上的新操作为核心。
错误。建造者模式关注复杂对象的分步构造,与遍历稳定元素结构并增加操作无关。
错误。中介者模式用于降低多个同事对象之间的直接耦合,不解决题干中的操作扩展问题。
本题为什么容易错
访问者模式并不是“只要遍历对象就用”。它的关键取舍是变化方向:新增操作方便,新增元素类型麻烦。忽略这一点,就容易把模式名字背对,却不会判断适用场景。
简短答案
访问者模式适合在什么场景使用,正确答案是 A(访问者模式,将作用于元素结构的操作封装到独立访问者中)。访问者模式适合对象结构相对稳定、但需要经常增加新操作的场景。抽象语法树节点类型相对稳定,而类型检查、代码生成、格式化等操作可能持续扩展,把这些操作封装为不同访问者,可以避免把所有操作都堆进节点类。
易混淆概念对比表
| 概念 | 本题判断 | 区别要点 | 记忆提示 |
|---|---|---|---|
| 访问者模式,将作用于元素结构的操作封装到独立访问者中 | 本题正确答案 | 正确。访问者把不同操作封装起来,并能针对不同元素类型执行相应处理。 | 看到题干核心场景时优先联想到它 |
| 状态模式,让对象在内部状态变化时改变行为 | 本题干扰项 | 错误。状态模式解决对象因内部状态变化而改变行为的问题,不以扩展对象结构上的新操作为核心。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
| 建造者模式,分步骤构造复杂对象 | 本题干扰项 | 错误。建造者模式关注复杂对象的分步构造,与遍历稳定元素结构并增加操作无关。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
| 中介者模式,用统一对象封装多个对象之间的交互 | 本题干扰项 | 错误。中介者模式用于降低多个同事对象之间的直接耦合,不解决题干中的操作扩展问题。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
本题易混淆选项怎么区分
- 状态模式,让对象在内部状态变化时改变行为:错误。状态模式解决对象因内部状态变化而改变行为的问题,不以扩展对象结构上的新操作为核心。
- 建造者模式,分步骤构造复杂对象:错误。建造者模式关注复杂对象的分步构造,与遍历稳定元素结构并增加操作无关。
- 中介者模式,用统一对象封装多个对象之间的交互:错误。中介者模式用于降低多个同事对象之间的直接耦合,不解决题干中的操作扩展问题。
知识点详解
访问者模式把作用于某个对象结构中各元素的操作封装为访问者。元素通常提供接受访问者的方法,由具体元素把自身交给访问者对应的访问方法处理。这种协作常被用来解释双分派:最终执行哪个处理逻辑,同时受访问者类型和元素类型影响。它的优势是增加新操作时,可以新增访问者而不必修改每个元素类;代价是新增一种元素类型时,往往需要修改访问者接口及所有具体访问者。因此,访问者适合元素结构稳定、操作集合经常扩展的系统。
备考速记
速记:结构稳定、操作常变,用访问者把操作搬出去。
双分派在双分派场景中的作用
双分派在本题中的核心价值,是解决“某编译器已经建立稳定的抽象语法树,树中包含常量节点、变量节点、运算节点等多种元素。团队需要不断增加类型检查、代码生成、格式化输出等操作,但不希望每增加一种操作就修改所有节点类。较适合采用的设计模式是()”这个场景问题。复习时不要只背选项名称,还要理解它为什么适用于该场景,以及它能解决哪类安全、流程或管理问题。
同类题怎么考
- 给出双分派场景,判断应该选择哪个概念、工具、协议或管理过程。
- 考查双分派的作用,要求从四个相近选项中找出最符合题干目标的一项。
- 把双分派和状态模式,让对象在内部状态变化时改变行为、建造者模式,分步骤构造复杂对象、中介者模式,用统一对象封装多个对象之间的交互放在一起考,重点看适用场景是否一致。
- 题干通常会出现一个关键动作或目标,先定位关键词,再回到选项逐一排除。
双分派在软件设计师软考中的考法
软考选择题通常不会只考概念定义,还会把双分派放到双分派场景中,要求判断它的作用、适用范围或与相近概念的区别。遇到这类题时,先抓住题干中的业务场景,再看哪个选项最能解决该场景下的核心问题。
解题思路
先别看到“树”就选组合模式。题干不是问树怎么组织,而是问怎样给一组稳定节点不断增加新操作。老师讲访问者时常用编译器 AST 举例:节点还是那些节点,但今天做类型检查,明天做代码生成,后天做格式化。操作变化快、结构变化慢,访问者模式就有用。
考点定位
访问者模式的题眼是“元素类型较稳定、作用于元素的操作经常变化”。如果元素类型本身频繁新增,访问者反而会带来较高修改成本。
易错提醒
- 对象元素类型还在频繁变化,却过早引入大量访问者。
- 把访问者模式和迭代器模式混淆:迭代器重在遍历,访问者重在对不同元素执行操作。
- 只记双分派术语,不理解它为何能根据访问者和元素类型选择处理逻辑。
备考提示
- 看到报表、编译器语法树、文档对象模型上不断增加新操作,可以考虑访问者模式。
- 把访问者和组合、迭代器一起对比:组合管树形结构,迭代器管遍历,访问者管作用于元素的新操作。
- 做设计模式题时先判断什么变化、什么稳定,再选模式,命中率会比死背定义高。
你可能还想了解
- 访问者模式适合在什么场景使用?
- 双分派是什么?
- 双分派在软件设计师考试中怎么考?
- 软件设计师双分派题怎么理解?
- 访问者模式适用场景怎么考?
- 访问者模式双分派怎么考?
本文小结
本题核心考点是双分派在双分派场景中的判断和应用。遇到类似题目时,先看题干描述的目标,再判断哪个选项最符合场景;本题应选择 A(访问者模式,将作用于元素结构的操作封装到独立访问者中)。