《设计模式系列》---访问者模式

访问者模式:表示一个作用于某个对象结构中的个元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新的操作。

/**
 * @author stefanie zhao
 * @date 2014-8-21 下午04:48:20
 */
public abstract class Visitor {

    public abstract void visitConcreteElementA(ConcreteElementA a);

    public abstract void visitConcreteElementB(ConcreteElementB a);
}
import java.util.ArrayList;
import java.util.List;

/**
 * @author stefanie zhao
 * @date 2014-8-21 下午04:55:59
 */
public class ObjectStructure {

    private List<Element> elements = new ArrayList<Element>();

    public void accath(Element element) {
        elements.add(element);
    }

    public void detach(Element element) {
        elements.remove(element);
    }

    public void accept(Visitor visitor) {
        for (Element e : elements)
            e.accept(visitor);
    }
}
/**
 * @author stefanie zhao
 * @date 2014-8-21 下午04:50:48
 */
public abstract class Element {

    public abstract void accept(Visitor visitor);
}
public class ConcreteVisitor2 extends Visitor {

    /*
     * (non-Javadoc)
     * 
     * @see
     * us.echo.pattern.visitor.Visitor#visitConcreteElementA(us.echo.pattern
     * .visitor.ConcreteElementA)
     */
    @Override
    public void visitConcreteElementA(ConcreteElementA a) {
        System.out.println("2A 被访问");
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * us.echo.pattern.visitor.Visitor#visitConcreteElementB(us.echo.pattern
     * .visitor.ConcreteElementB)
     */
    @Override
    public void visitConcreteElementB(ConcreteElementB a) {
        System.out.println("2B 被访问");

    }

}
/**
 * @author stefanie zhao
 * @date 2014-8-21 下午04:49:32
 */
public class ConcreteVisitor1 extends Visitor {

    /*
     * (non-Javadoc)
     * 
     * @see
     * us.echo.pattern.visitor.Visitor#visitConcreteElementA(us.echo.pattern
     * .visitor.ConcreteElementA)
     */
    @Override
    public void visitConcreteElementA(ConcreteElementA a) {
        System.out.println("A 被访问");
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * us.echo.pattern.visitor.Visitor#visitConcreteElementB(us.echo.pattern
     * .visitor.ConcreteElementB)
     */
    @Override
    public void visitConcreteElementB(ConcreteElementB a) {
        System.out.println("B 被访问");

    }

}
/**
 * @author stefanie zhao
 * @date 2014-8-21 下午04:49:06
 */
public class ConcreteElementA extends Element {

    @Override
    public void accept(Visitor visitor) {
        visitor.visitConcreteElementA(this);
    }

    public void operationA() {
    }

}
/**
 * @author stefanie zhao
 * @date 2014-8-21 下午04:53:26
 */
public class ConcreteElementB extends Element {

    @Override
    public void accept(Visitor visitor) {
        visitor.visitConcreteElementB(this);
    }

    public void operationB() {
    }

}
public class Main {

    /**
     * @Description: TODO
     * @param @param args
     * @return void
     * @throws
     */
    public static void main(String[] args) {
        ObjectStructure o = new ObjectStructure();
        o.accath(new ConcreteElementA());
        o.accath(new ConcreteElementB());

        ConcreteVisitor1 v1 = new ConcreteVisitor1();
        ConcreteVisitor2 v2 = new ConcreteVisitor2();

        o.accept(v1);
        o.accept(v2);
    }

}


你可能感兴趣的:(java,设计模式,访问者模式)