設計模式之一:訪問者模式

結構如圖:
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

相關文章
相關標籤/搜索