我试图使用ANTLR从PLSQL文件中提取信息。我使用的是 PLSQL语法,ANTLR在输入的plsql文件中使用该语法。我需要读取返回的"CommonTree“类(它表示AST)并获得不同的信息--比如表和相关列的名称。我在想,是否应该使用访问者模式来收集有关特定表上的表和相关列的信息。例如,这样的查询
SELECT s.name from students s, departments d WHERE d.did=10 and s.sid=d.did
将在AST中显示为
在这里获取表名和相关列需要首先从from元素捕获别名,然后与SELECT_LIST中使用的列进行匹配。
public class ChainingVisitors {
public static void main(String[] args) throws Exception {
ClassReader reader = new ClassReader("com.foo.Bar");
ClassWriter writer = new ClassWriter(COMPUTE_MAXS | COMPUTE_FRAMES);
ClassVisitor v3 = new Link(3, writer);
Class
我想做重载的方法调度,访问者模式看起来太复杂了。
我愚蠢的头脑想出了类似于下面的东西,它起作用了。跟这样的事走行吗?
接口
public interface Value {
default public Integer getValue(){
return 1;
}
}
可以有多种类型的值接口,例如下面的两个值接口实现。
class ConcreteValueA implements Value {
@Override
public Integer getValue() {
return
基本上,所有类都是从一个名为Element的基类派生出来的,但是在任何给定的时刻,结构都可能包含任何派生元素。
访问者应该以几种不同的样式打印元素,并实现接口ElementVisitor。
是否可以在不指定访问者接口中的所有派生类型的情况下实现访问者模式?
如果不是,考虑到Element和ElementVisitor是框架级组件,我们应该可以在任何时候扩展,而不会随时编辑,那么还有什么可供选择的呢?
Element可以在任何时候像这样的accept accept List<ElementVisitor>:
class Element
{
public void accept
在元素层次结构稳定且对这些元素进行操作所需的功能经常发生变化的情况下,访问者模式非常有用。
在元素层次结构发生变化的情况下,访问者模式会受到耦合的影响,这种耦合会强制重建元素和功能层次结构中的所有类。
为了改进这一点,非循环访问者使用额外的抽象级别,顶部有一个空的Visitor接口,元素层次结构中的每个类都有一个特定的接口。
假设有两种具体的元素类型IntMessage和StringMessage,那么一个非循环访问者应该如下所示:
abstract class Message // parent for the model/element/data classes
{
public
在我看来,访问者的设计模式非常类似于构图的工作方式。在组合中,我将在类中持有一个接口成员,并在构造函数中传递接口的具体实现,然后将一个方法委托给它,或者在类中使用它。
在访问者设计模式中,我也有一个接口的具体实现,并将它发送到访问方法,然后将访问方法委托给它。
要在代码中显示这种相似性,访问者应该如下:
VisitorInterface v = new ConcreteVisitor();
MyClass c = new MyClass();
c.visit(v);
VisitorInterface dv = new DifferentVisitor();
c.visit(dv);
其组成如下
在四人组的参考书“可重用面向对象软件的设计模式元素”中,访问者模式的意图解释如下:
表示要对对象结构的元素执行的操作。访问者允许您定义一个新操作,而不需要更改它所操作的元素的类。
我所读到的关于访问者模式的另一个优点是:
添加一个新的操作,而不需要类的源代码。
我在谷歌进行了深入的搜索,但没有找到任何例子来说明如何做到这一点。让我们举一个简单的例子:
public interface MyInterface {
public void myMethod();
}
public class MyClassA implements MyInterface {
/
我想知道是否有任何方法可以处理访问者模式的简单条件?
例如,如果我们有下面的代码,我们如何将访问者模式应用于它?
public class Elseif
{
private int total;
public int Condition(int x)
{
if(x==1)
{
total = 100;
}
else if(x==2)
{
total = 200;
}
return total;
}
}