程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java設計形式之拜訪形式(Visitor者形式)引見

Java設計形式之拜訪形式(Visitor者形式)引見

編輯:關於JAVA

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技巧處理了這個成績。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved