Java設計形式之拜訪形式(Visitor者形式)引見。本站提示廣大學習愛好者:(Java設計形式之拜訪形式(Visitor者形式)引見)文章只能為提供參考,不一定能成為您想要的結果。以下是Java設計形式之拜訪形式(Visitor者形式)引見正文
Visitor界說:感化於某個對象群中各個對象的操作。它可使你在不轉變這些對象自己的情形下,界說感化於這些對象的新操作。
在Java中,Visitor形式現實上是分別了collection構造中的元素和對這些元素停止操作的行動。
為什麼應用Visitor形式
Java的Collection(包含Vector和Hashtable)是我們最常常應用的技巧,可是Collection好象是個黑色年夜染缸,原來有各類光鮮類型特點的對象一旦放入後,再掏出時,這些類型就消逝了。那末我們必將要用If來斷定,如:
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);
}
在這個接口中,將我們以為Collection有能夠的類的類型放入個中。
有了拜訪者,我們須要被拜訪者,被拜訪者就是我們Collection的每一個元素Element,我們要為這些Element界說一個可以接收拜訪的接口(拜訪和被拜訪是互動的,只要拜訪者,被拜訪者假如表現不迎接,拜訪者就不克不及拜訪)。
我們界說這個接口叫Visitable,用來界說一個Accept操作,也就是說讓Collection每一個元素具有可拜訪性。
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");
}
}
在下面的visitCollection我們完成了對Collection每一個元素拜訪,只應用了一個斷定語句,只需斷定其能否可以拜訪。
至此,我們完成了Visitor形式根本架構。
應用Visitor形式的條件
對象群構造中(Collection) 中的對象類型很少轉變,也就是說拜訪者的身份類型很少轉變,如下面中Visitor中的類型很少轉變,假如須要增長新的操作,好比上例中我們在ConcreteElement詳細完成外,還須要新的ConcreteElement2 ConcreteElement3。
可見應用Visitor形式是有條件的,在兩個接口Visitor和Visitable中,確保Visitor很少變更,變更的是Visitable,如許應用Visitor最便利。
假如Visitor也常常變更,也就是說,對象群中的對象類型常常轉變,普通建議是,不如在這些對象類中逐一界說操作,然則Java的Reflect技巧處理了這個成績。