1. 程式人生 > >GoF23種設計模式之行為型模式之訪問者模式

GoF23種設計模式之行為型模式之訪問者模式

部分 strong 操作 定義 狀態 arraylist his tro 不同的

概述
    表示一個作用於某對象結構中的各元素的操作。
    它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。
適用性
    1.一個對象結構包含很多類對象,它們有不同的接口,而你想對這些對象實施一些依賴於其具體類的操作。

    2.需要對一個對象結構中的對象進行很多不同的並且不相關的操作,而你想避免讓這些操作“汙染”這些對象的類。
      Visitor使得你可以將相關的操作集中起來定義在一個類中。
      當該對象結構被很多應用共享時,用Visitor模式讓每個應用僅包含需要用到的操作。

    3.定義對象結構的類很少改變,但經常需要在此結構上定義新的操作。
      改變對象結構類需要重定義對所有訪問者的接口,這可能需要很大的代價。
      如果對象結構類經常改變,那麽可能還是在這些類中定義這些操作較好。
			
參與者
    1.Visitor
      為該對象結構中ConcreteElement的每一個類聲明一個Visit操作。
      該操作的名字和特征標識了發送Visit請求給該訪問者的那個類。
      這使得訪問者可以確定正被訪問元素的具體的類。
      這樣訪問者就可以通過該元素的特定接口直接訪問它。

    2.ConcreteVisitor
      實現每個由Visitor聲明的操作。
      每個操作實現本算法的一部分,而該算法片斷乃是對應於結構中對象的類。
      ConcreteVisitor為該算法提供了上下文並存儲它的局部狀態。
      這一狀態常常在遍歷該結構的過程中累積結果。

    3.Element
      定義一個Accept操作,它以一個訪問者為參數。

    4.ConcreteElement
      實現Accept操作,該操作以一個訪問者為參數。

    5.ObjectStructure
      能枚舉它的元素。
      可以提供一個高層的接口以允許該訪問者訪問它的元素。
      可以是一個復合或是一個集合,如一個列表或一個無序集合。
類圖
例子
Visitor
public interface Visitor {

    public void visitString(StringElement stringE);
    
    public void visitFloat(FloatElement floatE);
    
    public void visitCollection(Collection collection); 
}
ConcreteVisitor
public class ConcreteVisitor implements Visitor {

    public void visitCollection(Collection collection) {
        // TODO Auto-generated method stub
        Iterator iterator = collection.iterator();
        while (iterator.hasNext()) {
            Object o = iterator.next();
            if (o instanceof Visitable) {
                ((Visitable)o).accept(this);
            }
        }
    }

    public void visitFloat(FloatElement floatE) {
        System.out.println(floatE.getFe());
    }

    public void visitString(StringElement stringE) {
        System.out.println(stringE.getSe());
    }
}
Element
public interface Visitable {

    public void accept(Visitor visitor);
}
ConcreteElement
public class FloatElement implements Visitable {

    private Float fe;
    
    public FloatElement(Float fe) {
        this.fe = fe;
    }
    
    public Float getFe() {
        return this.fe;
    }
    
    public void accept(Visitor visitor) {
        visitor.visitFloat(this);
    }
}
public class StringElement implements Visitable {

    private String se;
    
    public StringElement(String se) {
        this.se = se;
    }
    
    public String getSe() {
        return this.se;
    }
    
    public void accept(Visitor visitor) {
        visitor.visitString(this);
    }
}
Test
public class Test {

    public static void main(String[] args) {
        Visitor visitor = new ConcreteVisitor();
        StringElement se = new StringElement("abc");
        se.accept(visitor);
        
        FloatElement fe = new FloatElement(new Float(1.5));
        fe.accept(visitor);
        System.out.println("===========");
        List result = new ArrayList();
        result.add(new StringElement("abc"));
        result.add(new StringElement("abc"));
        result.add(new StringElement("abc"));
        result.add(new FloatElement(new Float(1.5)));
        result.add(new FloatElement(new Float(1.5)));
        result.add(new FloatElement(new Float(1.5)));
        visitor.visitCollection(result);
    }
}
result
abc
1.5
===========
abc
abc
abc
1.5
1.5
1.5

GoF23種設計模式之行為型模式之訪問者模式