JAVA设计模式---访问者模式

访问者模式一般被用户一些数据结构稳定的场合,数据对象稳定,而实际对它的操作是不稳定的,他可以接受不同的对象而做出不同的反应,对与稳定的数据结构,它的功能和方法也就稳定,所以就把它抽象出来,抽取出来,而对于访问它的对象是经常改变的,传递不同的实际对象也就得到不同的运行效果,多态的体现


访问者模式的参与对象:
     抽象节点:也就是稳定的数据结构对象,同时也声明具体数据结构对象的操作,操作方法接收访问者
     具体节点:具体稳定数据结构的实现,接受访问者,调用访问者。
     抽象访问者:对与不同的具体节点,做出相应的反应,具体节点是稳定的,从而访问者的一般具体操作也就相对稳定
     具体访问者:具体实现对不同具体节点的操作
     结构对象:封装起来的所有具体节点,当一个新的访问者增加的时候,只要调用结构对象的方法,就可以看到,他作用于所有具体节点上的效果。


类的实现:
//抽象节点
public interface Node {
    //抽象节点接受不同访问者产生相应的结果
    void accept(Visitor visitor);
}
//具体节点,具体节点一般是有限的,因为数据结构是稳定,比如人类,具体只能是男人女人
public class NodeMan implements Node{
    public void accept(Visitor visitor) {
        System.out.println(this.getClass().getName() + "对" + visitor.getClass().getName() + "的反应" + visitor.operate(this));
    }
}
public class NodeWomen implements Node{
    public void accept(Visitor visitor) {
        System.out.println(this.getClass().getName() + "对" + visitor.getClass().getName() + "的反应" + visitor.operate(this));
);
    }
}

//抽象访问者,对每个节点做出的相应,即时每个节点接受不同访问者的反应
public interface Visitor {
    void operator(NodeA node);
    void operator(NodeB node);
}
public class VisitorA implements Visitor {
    public void operator(NodeA node) {
        System.out.println(this.getClass().getName() + "作用于" + node.getClass().getName() + "的效果");

    }
    public void operator(NodeB node) {
        System.out.println(this.getClass().getName() + "作用于" + node.getClass().getName() + "的效果");

    }

}
public class VisitorB implements Visitor {
        public void operator(NodeA node) {
        System.out.println(this.getClass().getName() + "作用于" + node.getClass().getName() + "的效果");

    }
    public void operator(NodeB node) {
        System.out.println(this.getClass().getName() + "作用于" + node.getClass().getName() + "的效果");

    }

}

//结构对象,封装了所有具体节点,一简化在客户端调用的时候,每个访问者传递过来,还需要一次作用于每个具体节点,有了结构对象,调用它的方法,他会帮你遍历所有的节点对象,做出对访问者的反应结果

public class StructObject {
   private List<Node> nodes = new ArrayList<Node>();

   public StructObject() {};

   public void addNode(Node node) {
       this.nodes.add(node);
   }

   public void accpetVisitor(Visitor visitor) {
       for(Node node:nodes) {
           node.accept(visitor);
       }
   }
}
客户端调用实现:

public class Test {
    public static void main(String[] args) {
        StructObject s = new StructObject();
        NodeA a = new NodeA();
        NodeB b = new NodeB();
        s.addNode(a);
        s.addNode(b);
        //一般上面的情况就是很稳定的了,因为节点对象是稳定数据结构
         VisitorA a1 = new VisitorA();
        s.acceptVistor(a1);
        VisitorB a2 = new VisitorB();
        s.acceptVistor(a2);
        //这样的话,上面情况,当增加新的访问者,只需要直接增加即可,不需要对节点等进行改变。

    }
}

猜你喜欢

转载自why7282.iteye.com/blog/1044035
今日推荐