結構如圖:
java
訪問者角色(Visitor): 爲該對象結構中具體元素角色聲明一個訪問操做接口.
具體訪問者角色(Concrete Visitor): 實現每一個由訪問者角色(Visitor)聲明的操做.
元素角色(Element): 定義一個Accept操做,它以一個訪問者爲參數.
具體元素角色(Concrete Element): 實現由元素角色提供的Accept操做.
對象結構角色(Object Structure): 這是使用訪問者模式必備的角色. 它要具有如下特徵: 能枚舉它的元素; 能夠提供一個高層的接口以容許該訪問者訪問它的元素; 能夠是一個複合(組合模式)或是一個集合, 如一個列表或一個無序集合.ide
實例:
this
public interface Visitor { public void visit(GladiolusConcreteElement gladiolus); public void visit(ChrysanthemumConreteElement chrysanthemum); } public interface FlowerElement { public void accept(Visitor visitor); } public class GladiolusConcreteElement implements FlowerElement { @Override public void accept(final Visitor visitor) { visitor.visit(this); } } public class ChrysanthemumConreteElement implements FlowerElement { @Override public void accept(final Visitor visitor) { visitor.visit(this); } } public class GladiolusVisitor implements Visitor { @Override public void visit(final GladiolusConcreteElement gladiolus) { System.out.println(this.getClass().getSimpleName() + " access " + gladiolus.getClass().getSimpleName()); } @Override public void visit(final ChrysanthemumConreteElement chrysanthemum) { System.out.println(this.getClass().getSimpleName() + " access " + chrysanthemum.getClass().getSimpleName()); } } public class ChrysanthemumConreteElement implements FlowerElement { @Override public void accept(final Visitor visitor) { visitor.visit(this); } } public class ObjectStructure { private final List<FlowerElement> elements = new ArrayList<FlowerElement>(); public void addElement(final FlowerElement e) { elements.add(e); } public void removeElement(final FlowerElement e) { elements.remove(e); } public void accept(final Visitor visitor) { for (final FlowerElement e : elements) { e.accept(visitor); } } } public class Client { public static void main(final String[] args) { final ObjectStructure os = new ObjectStructure(); os.addElement(new GladiolusConcreteElement()); os.addElement(new ChrysanthemumConreteElement()); final GladiolusVisitor gVisitor = new GladiolusVisitor(); final ChrysanthemumVisitor chVisitor = new ChrysanthemumVisitor(); os.accept(gVisitor); os.accept(chVisitor); } }
運行結果:
GladiolusVisitor access GladiolusConcreteElement
GladiolusVisitor access ChrysanthemumConreteElement
ChrysanthemumVisitor access GladiolusConcreteElement
ChrysanthemumVisitor access ChrysanthemumConreteElement
spa