访问者模式允许在不改变对象的类定义的情况下,新增对于对象的操作。
主要意图是将数据结构和数据操作分离,适用于稳定的数据结构和易变的操作耦合问题。
以SPESC-Compiler项目中的TermVisitor为例:
Parser在生成AST的过程中,访问到节点时通过调用visit方法,返回对应节点的对象。所以就需要重写访问对应节点context的visit方法
1 | public class ContractVisitor extends SpescBaseVisitor<ContractDefinition> { |
ContractDefinition中各种属性的填充也依赖于其子节点的visit方法。
通过对象的accept方法唤起visit方法
1 | public <T> T accept(ParseTreeVisitor<? extends T> visitor) { |
这里会判断访问者是否为根访问者SpescVisitor,如果是,则从顶端ContractDefinition开始访问
如果不是,则访问child
Comments
shortname
for Disqus. Please set it in_config.yml
.