对访问者模式(Visitor)的疑问?

chishan911 2006-09-19 12:03:09
要实现Visitor模式,得为访问者建立一个Visitor接口,还要为被访问的集合建立一个Visitable接口。然后,让具体类实现Visitor和Visitable接口。这两个接口如下所示:
  
  public interface Visitor
  {
  public void visitCollection(Collection collection);
  public void visitString(String string);
  public void visitFloat(Float float);
  }
  
  public interface Visitable
  {
  public void accept(Visitor visitor);
  }
  
  对于具体的String,可能是这样:
  
  public class VisitableString implements Visitable
  {
  private String value;
  public VisitableString(String string) {
  value = string;
  }
  public void accept(Visitor visitor) {
   visitor.visitString(this);
  }
  }
  
  在accept方法中,对this类型调用正确的visitor方法:
  
  visitor.visitString(this)
  
  这样,就可以如下实现具体的Visitor:
  
  public class PrintVisitor implements Visitor
  {
  public void visitCollection(Collection collection) {
  Iterator iterator = collection.iterator()
  while (iterator.hasNext()) {
   Object o = iterator.next();
   if (o instanceof Visitable)
   ((Visitable)o).accept(this);
  }
  
  public void visitString(String string) {
  System.out.println("""+string+""");
  }
  
  public void visitFloat(Float float) {
  System.out.println(float.toString()+"f");
  }
  }
问题:在VisitableString类别中,方法:
public void accept(Visitor visitor) {
   visitor.visitString(this);
  }
是否是错误的?在Visitor接口中visitString方法接收的是String类型,为什么这里用this?
...全文
220 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
chishan911 2006-09-21
  • 打赏
  • 举报
回复
OK,问题解决,原因是转贴人写错了,
Visitor接口中每个方法接收的参数就应该是Visitable型别或其子型别.
cosmowang 2006-09-20
  • 打赏
  • 举报
回复
不懂
是不是该visitString方法接收的是VisitableString
或者传递的 VisitableString 本身是 String
chishan911 2006-09-20
  • 打赏
  • 举报
回复
难道没人用过Visitor模式模式?

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧