JiveJdon Community Forums
在线62人 Home | 论坛 | 培训咨询 | 精华 | 查搜 | 注册 | 登陆 |
首页 » 论坛 » 设计模式、框架和架构
???en_US.forumThreadPrev.name??? 上一主题
Go back to the topic listing   返回主题列表
???en_US.forumThreadNext.name??? 下一主题
这个主题共有 2 回复 / 1 页 [ ]  发表新帖子  回复该主题贴
thinkjava

发表文章: 109
注册时间: 2007年11月03日 19:22
给他发消息
谁说visitor不可以添加新元素? 发表: 2007年02月08日 14:52 回复
这个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.k**Set().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.getName().equals("visit")) {
Class[] paramTypes = methods.getParameterTypes();
if (paramTypes.length == 1) {
visitMethods.put(paramTypes[0], methods);
}
}
}
}

{
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);
}
youngjiang

发表文章: 8
注册时间: 2007年02月26日 15:41
给他发消息
re:谁说visitor不可以添加新元素? 发表: 2007年03月09日 17:02 回复
兄弟,辛苦啦,顶一下下
Coolyu0916

发表文章: 196
注册时间: 2007年04月23日 11:29
给他发消息
re:谁说visitor不可以添加新元素? 发表: 2007年03月10日 22:44 回复
this is a Visitor???
这个主题有 2 回复 / 1 页 [ ]
???en_US.forumThreadPrev.name??? 上一主题
Go back to the topic listing   返回主题列表    返回页首  返回页首
???en_US.forumThreadNext.name??? 下一主题
热点TAG: AOP cache DDD EJB 集群 设计模式 Hibernate IOC JiveJdon OO RBAC Spring Struts
查询本论坛内 回复超过的热门帖子
快速发表回复
标题
 
粗体 斜体 下划线 插入图片 插入代码 插入url链接 插入附件
内容
 

解惑之道在J道 ,打造中国最具影响力的的企业软件社区
OpenSource JIVEJDON v3.0 Powered by JdonFramework Code © 2002-08 jdon.com

anti spam