Iterator iterator = collection.iterator() while (iterator.hasNext()) { Object o = iterator.next(); if (o instanceof Collection) messyPRintCollection((Collection)o); else if (o instanceof String) System.out.println("'"+o.toString()+"'"); else if (o instanceof Float) System.out.println(o.toString()+"f"); else System.out.println(o.toString()); }
在上例中,我們使用了 instanceof來判定 o的類型.
很顯然,這樣做的缺點代碼If else if 很繁瑣.我們就可以使用Visitor模式解決它.
如何使用Visitor? 針對上例,我們設計一個接口visitor訪問者:
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); }
好了,有了兩個接口,我們就要定義他們的具體實現(Concrete class):
public class ConcreteElement implements Visitable { private String value; public ConcreteElement(String string) { value = string; } //定義accept的具體內容 這里是很簡單的一句調用 public void accept(Visitor visitor) { visitor.visitString(this); } }
再看看訪問者的Concrete實現:
public class ConcreteVisitor implements Visitor { //在本方法中,我們實現了對Collection的元素的成功訪問 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"); } }