设计模式 之 访问者模式

访问者模式允许在不改变对象的类定义的情况下,新增对于对象的操作。
主要意图是将数据结构和数据操作分离,适用于稳定的数据结构和易变的操作耦合问题。

以SPESC-Compiler项目中的TermVisitor为例:

Parser在生成AST的过程中,访问到节点时通过调用visit方法,返回对应节点的对象。所以就需要重写访问对应节点context的visit方法

1
2
3
4
5
6
7
8
9
public class ContractVisitor extends SpescBaseVisitor<ContractDefinition> {
private Scope scope;

@Override
public ContractDefinition visitContractDefinition(SpescParser.ContractDefinitionContext ctx) {
...
return new ContractDefinition(contractTitle, parties, terms);
}
}

ContractDefinition中各种属性的填充也依赖于其子节点的visit方法。

通过对象的accept方法唤起visit方法

1
2
3
4
5
6
public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
if ( visitor instanceof SpescVisitor )
return ((SpescVisitor<? extends T>)visitor).visitContractDefinition(this);
else
return visitor.visitChildren(this);
}

这里会判断访问者是否为根访问者SpescVisitor,如果是,则从顶端ContractDefinition开始访问
如果不是,则访问child

数据结构与算法笔记 | 栈和队列 JVM language development

Comments

You forgot to set the shortname for Disqus. Please set it in _config.yml.
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×