Java访问者模式

    

  

结构对象会遍历它自己所保存的聚集中的所有节点,在本系统中就是节点NodeA和NodeB。首先NodeA会被访问到,这个访问是由以下的操作组成的:

  (1)NodeA对象的接受方法accept()被调用,并将VisitorA对象本身传入;

  (2)NodeA对象反过来调用VisitorA对象的访问方法,并将NodeA对象本身传入;

  (3)VisitorA对象调用NodeA对象的特有方法operationA()。

  从而就完成了双重分派过程,接着,NodeB会被访问,这个访问的过程和NodeA被访问的过程是一样的,这里不再叙述。

适用于 数据结构稳定,再增加就比较困难

  

/**
 * Created by nicknailo on 2018/9/1.
 */
public class VisitorDesign {
    
    public static void main(String[] args) {
        //创建一个结构对象
        ObjectStructure os = new ObjectStructure();
        //给结构增加一个节点
        os.add(new NodeA());
        //给结构增加一个节点
        os.add(new NodeB());
        //创建一个访问者
        Visitor visitor = new VisitorB();
        os.action(visitor);
    }

}
interface Visitor {
    /** 对应于NodeA的访问操作 */
    public void visit(NodeA node);

    /** 对应于NodeB的访问操作 */
    public void visit(NodeB node);
}
class VisitorA implements Visitor {
    /** 对应于NodeA的访问操作 */
    @Override
    public void visit(NodeA node) {
        System.out.println(node.operationA());
    }

    /** 对应于NodeB的访问操作 */
    @Override
    public void visit(NodeB node) {
        System.out.println(node.operationB());
    }
}
class VisitorB implements Visitor {
    /** 对应于NodeA的访问操作 */
    @Override
    public void visit(NodeA node) {
        System.out.println(node.operationA());
    }

    /** 对应于NodeB的访问操作 */
    @Override
    public void visit(NodeB node) {
        System.out.println(node.operationB());
    }
}
interface  Node {
    /** 接受操作 */
    public abstract void accept(Visitor visitor);
}
class NodeA implements Node{
    /** 接受操作 */
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }

    /** NodeA特有的方法 */
    public String operationA(){
        return "NodeA";
    }
}
class NodeB implements Node{
    /** 接受方法 */
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }

    /** NodeB特有的方法 */
    public String operationB(){
        return "NodeB";
    }
}
class ObjectStructure {

    private List<Node> nodes = new ArrayList<Node>();

    /** 执行方法操作 */
    public void action(Visitor visitor) {
        for(Node node : nodes) {
            node.accept(visitor);
        }
    }

    /** 添加一个新元素 */
    public void add(Node node){
        nodes.add(node);
    }
}

运行后

NodeA

NodeB

 

posted @ 2018-11-06 15:14  nicknailo  阅读(196)  评论(0编辑  收藏  举报