这个visitor就可以随便添加,利用反射就可以做到了.
public abstract class Visitor {
final public void visit(Object object) {
Method method = getVisitMethod(object);
try {
method.invoke(this, new Object[] { object });
} catch (Exception e) {
String message = "invokeing method failed:visit("
+ object.getClass().getName() + ")";
throw new RuntimeException(message, e);
}
}
private Map visitMethods = new HashMap();
private Method getVisitMethod(Object object) {
//return (Method) visitMethods.get(object.getClass());
Iterator it = visitMethods.keySet().iterator();
for (; it.hasNext();) {
Class clazz = (Class) it.next();
if (clazz.isAssignableFrom(object.getClass())) {
return (Method) visitMethods.get(clazz);
}
}
throw new RuntimeException("method: visit(" + object.getClass().getName()
+ ") undefined in the class");
}
private Method visitMethod;
private void initVisitMethod() {
Method[] methods = getClass().getDeclaredMethods();
for (int i = 0; i < methods.length; i++) {
if (methods[i].getName().equals("visit")) {
Class[] paramTypes = methods[i].getParameterTypes();
if (paramTypes.length == 1) {
visitMethods.put(paramTypes[0], methods[i]);
}
}
}
}
{
initVisitMethod();
}
}
下面是两个具体的Visitor
public class PrintVisitor extends Visitor{
public void visit(Float f){
System.out.println("float:"+f);
}
public void visit(Date date){
System.out.println("date:"+date);
}
public void visit(String str){
System.out.println("string:"+str);
}
}
public class PrintVisitor2 extends Visitor{
public void visit(String str){
System.out.println("string2:"+str);
}
public void visit(List list){
System.out.println("list2:"+list);
}
}
public void testVisit(){
ArrayList list = new ArrayList();
list.add("a");
list.add("b");
Visitor v = new PrintVisitor();
v.visit("hello");
v.visit(new Date());
Visitor v1 = new PrintVisitor2();
v1.visit("hello");
v1.visit(list);
}
分享到:
相关推荐
Visitor
设计模式C++学习之访问者模式(Visitor)
也许最开始出现这种模式,是因为另外的原因: 我有一堆数据放在一个库里头,不想让其它人拿着, 如果你要用数据干活,那你就把函数指针给我,我来替你使用这个数据。...然后人们就说,这是visitor模式。
该PPT包含了Visitor里面所有的知识点和扩展,对于想要学习该模式的人来说是不二的选择,并且配上了源代,未经允许不可传至其他网站。
Laravel开发-visitor 以数据库、页面点击量记录您的访问者,并为Laravel 5生成访问计数器
Visitor模式.docVisitor模式.doc
Visitor TT1 BRK
23种设计模式之二十(行为模式)Visitor模式
visitor.js这个js文件能提供你关于你的网站的访客的详细信息(比如他在哪个城市,最后访问日期等等)。 该软件已改名为 session.js
Laravel开发-visitor-log Laravel 4记录所有访客的包
struts2中Visitor校验器以及域对象级别上验证和使用上下文优化的使用,我自己写的一个完整代码,详细的展示了如何使用Visitor校验器以及怎样在域对象上验证和注意事项,代码解压后可以直接部署到MyEclipse上运行,...
不错的统计+访客跟踪程序
将包useful:visitor-client和useful:visitor-server自动添加到您的应用程序。安装 meteor add useful:visitor你可以做什么在服务器上Visitor.init(options) 您必须在服务器上调用 init 以支持匿名用户跟踪。 原因是...
博文链接:https://notguru.iteye.com/blog/78260
NULL 博文链接:https://zhang-yingjie-qq-com.iteye.com/blog/344236
访问者模式(Java代码实现),博文附件
访问者模式(Visitor) 用意:适用于数据结构相对未定的系统,把数据结构和作用于结构上的操作间的耦合解开。
访问者模式(Visitor Pattern)是GoF提出的23种设计模式中的一种,属于行为模式。...总的来说,访问者模式提供了一种将数据结构与数据操作相分离的机制,使得在不改变数据结构的前提下可以定义新的操作。
面向对象 北工大 课设 使用多种设计模式,实现的求值引擎,包括表达式树的构建