熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

java設計模式之Visitor

2013-11-23 19:54:01  來源: Java高級技術 

  Visitor定義
  作用於某個對象群中各個對象的操作 它可以使你在不改變這些對象本身的情況下定義作用於這些對象的新操作
  
  在Java中Visitor模式實際上是分離了collection結構中的元素和對這些元素進行操作的行為
  
  為何使用Visitor?
  Java的Collection(包括Vector和Hashtable)是我們最經常使用的技術可是Collection好象是個黑色大染缸本來有各種鮮明類型特征的對象一旦放入後再取出時這些類型就消失了那麼我們勢必要用If來判斷如:
  
  Iterator iterator = erator()
  while (iteratorhasNext()) {
     Object o = iteratornext();
     if (o instanceof Collection)
        messyPrintCollection((Collection)o);
     else if (o instanceof String)
        Systemoutprintln(+otoString()+);
     else if (o instanceof Float)
        Systemoutprintln(otoString()+f);
     else
        Systemoutprintln(otoString());
  }
  
  在上例中我們使用了 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) {
        visitorvisitString(this);
     }
  }
  
  再看看訪問者的Concrete實現:
  
  public class ConcreteVisitor implements Visitor
  {
     //在本方法中我們實現了對Collection的元素的成功訪問
     public void visitCollection(Collection collection) {
        Iterator iterator = erator()
        while (iteratorhasNext()) {
           Object o = iteratornext();
           if (o instanceof Visitable)
              ((Visitable)o)accept(this);
        }
  
     public void visitString(String string) {
        Systemoutprintln(+string+);
     }
  
     public void visitFloat(Float float) {
        Systemoutprintln(floattoString()+f);
     }
  }
  
  在上面的visitCollection我們實現了對Collection每個元素訪問只使用了一個判斷語句只要判斷其是否可以訪問
  
  至此我們完成了Visitor模式基本架構
  
  使用Visitor模式的前提
  對象群結構中(Collection) 中的對象類型很少改變也就是說訪問者的身份類型很少改變如上面中Visitor中的類型很少改變如果需要增加新的操作比如上例中我們在ConcreteElement具體實現外還需要新的ConcreteElement ConcreteElement
  
  可見使用Visitor模式是有前提的在兩個接口Visitor和Visitable中確保Visitor很少變化變化的是Visitable這樣使用Visitor最方便
  
  如果Visitor也經常變化 也就是說對象群中的對象類型經常改變一般建議是不如在這些對象類中逐個定義操作但是Java的Reflect技術解決了這個問題
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27651.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.