在Java中的通用访问者模式 [英] Generic visitor pattern in java

查看:143
本文介绍了在Java中的通用访问者模式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用泛型的下面的java实现访问者模式,一般来说有用吗? (我想是的)。

它能以某种方式得到改善吗?使用匿名类很容易调用是很重要的。谢谢。



(使用示例):

  Vector< Number> ; numbers = new Vector< Number>(); 

numbers.add(new Double(1.2));
numbers.add(new Float(-1.2));
numbers.add(new Double(4.8));
numbers.add(new Float(-3.4));
numbers.add(new Long(123456));
numbers.add(new Short(14));

For.each(数字,新访客< Number>(){
public void doIt(Double n){
System.out.println(doIt()for double :+ n);
}
public void doIt(Float n){
System.out.println(doIt()for float:+ n);
}
public void doIt(Number n){
System.out.println(doIt()for Number:+ n);
}
});

访客<号码> visi = new Visitor< Number>(){
private StringBuffer all = new StringBuffer();
public void doIt(Number n){
System.out.println(doIt()for Number:+ n);
all.append(n.toString()+);
}
public Object getResult(){
return all;
}
};

For each(numbers,visi);

System.out.println(all - >+ visi.getResult());

说明:

  // ........................................... 。
抽象类访客< T> {
public void visit(T n){
try {
this.getClass()。getDeclaredMethod(doIt,n.getClass())。invoke(this,n);
} catch(Exception ex){
doIt((T)n);


public void doIt(T n){
System.out.println(doIt()for base+ n);
}
public Object getResult(){
return null;
}
} // class

// ........................... .................
class对于{
public static< T> (v,c){
f.visit(v);
}
} //()
} // class


解决方案

感谢donroby关于我的初始代码没有实现访问者模式的答案,我来到了这个新版本。

我想现在它实现了访问者模式,而不需要用accept()方法修改visited元素。无论如何,它可以根据元素类型调用正确的方法(我想这就是accept()的使命),感谢反射。



首先,使用示例:

  Vector< Number> numbers = new Vector< Number>(); 

numbers.add(new Double(1.2));
numbers.add(new Float(-1.2));
numbers.add(new Double(4.8));
numbers.add(new Float(-3.4));
numbers.add(new Long(123456));
numbers.add(new Short(14));

For.each(数字,新访客< Number>(){
public void doIt(Double n){
System.out.println(doIt()for double :+ n);
}
public void doIt(Float n){
System.out.println(doIt()for float:+ n);
}
public void doIt(Number n){
System.out.println(doIt()for Number:+ n);
}
});

生成此输出

 
doIt()for double:1.2
doIt()for float:-1.2
doIt()for double:4.8
doIt()for float:-3.4
doIt()for Number:123456
doIt()for Number:14

最后代码

 抽象类Visitor< T> {
public void visit(T n){
try {
this.getClass()。getDeclaredMethod(doIt,n.getClass())。invoke(this,n);
} catch(Exception ex){
doIt((T)n);


public void doIt(T n){
System.out.println(doIt()for base+ n);
}
public Object getResult(){
return null;
}

}

  class For {
public static< T> (v,c){
f.visit(v);
}
} //()

}


Is the following java implementation of the visitor pattern using generics, general enough to be useful? (I suppose it is).

Could it be improved in some way? It's important to be easily call-able using anonymous classes. Thanks.

(Example of use):

Vector<Number> numbers = new Vector<Number>();

        numbers.add(new Double(1.2));
        numbers.add(new Float(-1.2));
        numbers.add(new Double(4.8));
        numbers.add(new Float(-3.4));
        numbers.add(new Long(123456));
        numbers.add(new Short("14"));

        For.each(numbers, new Visitor<Number>() {
            public void doIt(Double n) {
                System.out.println("doIt() for double: " + n);
            }
            public void doIt(Float n) {
                System.out.println("doIt() for float: " + n);
            }
            public void doIt(Number n) {
                System.out.println("doIt() for Number: " + n);
            }
        });

        Visitor<Number> visi =  new Visitor<Number>() {
            private StringBuffer  all = new StringBuffer ();
            public void doIt(Number n) {
                System.out.println("doIt() for Number: " + n);
                all.append(n.toString() + " ");
            }
            public Object getResult () {
                return all;
            }
        };

        For.each(numbers, visi);

        System.out.println ("all -> " + visi.getResult());

Definitions:

//............................................
abstract class Visitor<T> {
    public void visit(T n) {
        try {
            this.getClass().getDeclaredMethod("doIt", n.getClass()).invoke(this, n);
        } catch (Exception ex) {
            doIt((T) n);
        }
    }
    public void doIt(T n) {
        System.out.println("doIt() for base " + n);
    }
    public Object getResult() {
        return null;
    }
} // class

//............................................
class For {
    public static <T> void each (Collection<T> c, Visitor<T> f) {
        for (T v : c) {
            f.visit(v);
        }
    } // ()
} // class

解决方案

Thanks to the answer of donroby about my initial code not implementing the visitor pattern I came to this new version.

I suppose it now implements the visitor pattern without the need of modifying the visited element with an accept() method. Anyway, it is able to call the right method depending on the element type (I guess that's the mission for the accept()), thanks to reflection.

First, an example of use:

Vector<Number> numbers = new Vector<Number>();

    numbers.add(new Double(1.2));
    numbers.add(new Float(-1.2));
    numbers.add(new Double(4.8));
    numbers.add(new Float(-3.4));
    numbers.add(new Long(123456));
    numbers.add(new Short("14"));

    For.each(numbers, new Visitor<Number>() {
        public void doIt(Double n) {
            System.out.println("doIt() for double: " + n);
        }
        public void doIt(Float n) {
            System.out.println("doIt() for float: " + n);
        }
        public void doIt(Number n) {
            System.out.println("doIt() for Number: " + n);
        }
    });

That produces this output

doIt() for double: 1.2
doIt() for float: -1.2
doIt() for double: 4.8
doIt() for float: -3.4
doIt() for Number: 123456
doIt() for Number: 14

And finally the code

abstract class Visitor<T> {
public void visit(T n) {
    try {
        this.getClass().getDeclaredMethod("doIt", n.getClass()).invoke(this, n);
    } catch (Exception ex) {
        doIt((T) n);
    }
}
public void doIt(T n) {
    System.out.println("doIt() for base " + n);
}
public Object getResult() {
    return null;
}

}

class For {
public static <T> void each (Collection<T> c, Visitor<T> f) {
    for (T v : c) {
        f.visit(v);
    }
} // ()

}

这篇关于在Java中的通用访问者模式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆