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

  Java深入到一定程度,就不可避免的碰到设计模式这一概念,了解设计模式,将使自

己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广

泛,遵循一定的编程模式,才能使自己的代码便于理解,易于交流,Visitor(访问者)模

式是比较常用的一个模式.

   应用场景:对于某对象结构中各元素的操作。如果需要在不修改各元素类的前提

下定义作用于这些元素的新操作,也就是动态的增加新的方法应该考虑访问者模式。

   想让数个不同的访问者对同一个对象集合进行访问时,Visitor模式可以发挥它

的强大作用。Visitor先调用了Visitable类中的方法,这个方法又回调到Visitor类中


   在此写了7个java类来描述说明Visitor设计模式;
  1、 NodeA.java  可访问节点A
  2、 NodeB.java  可访问节点B
  3、 NodeC.java  可访问节点C
  4、 Visitable.java 可访问对象接口
  5、 Visitor.java  访问者接口
  6、 VisitorA.java  访问者A

  7、 VisitorTest.java  带有main方法的测试类

===============   1、 NodeA.java
package visitor;
public class NodeA implements Visitable {
  public void accept(Visitor visitor) {
    visitor.visit(this);
  }
}
===============   1 end
 
===============   2、 NodeB.java
package visitor;
public class NodeB implements Visitable {
  public void accept(Visitor visitor) {
    visitor.visit(this);
  }
}
===============   2 end
 
===============   3、 NodeC.java
package visitor;
public class NodeC implements Visitable {
  public void accept(Visitor visitor) {
    visitor.visit(this);
  }
}
===============   3 end
 
===============   4、 Visitable.java
package visitor;
public interface Visitable {
   public void accept(Visitor visitor);
}
===============   4 end
 
===============   5、 Visitor.java
package visitor;
import java.util.Collection;
public interface Visitor {
  //访问节点A
  public void visit(NodeA nodeA);
  //访问节点B
  public void visit(NodeB nodeB);
  //访问节点C
  public void visit(NodeC nodeC);
  //访问节点集合
  public void visitCollection(Collection  collection); 
}
===============   5 end
 
===============   6、 VisitorA.java
package visitor;
import java.util.Collection;
import java.util.Iterator;
public class VisitorA implements Visitor {
  public void visit(NodeA a){
    System.out.println("Execute visitNodeA method!");;
  }
  public void visit(NodeB b){
    System.out.println("Execute visitNodeB method!");;
  }
  public void visit(NodeC c){
    System.out.println("Execute visitNodeC method!");;
  }
  public void visitCollection(Collection collection){
    Iterator iterator = collection.iterator();
    while (iterator.hasNext()) {
      Object o = iterator.next();
      if (o instanceof Visitable)
        ((Visitable)o).accept(this);
      }
  }
}
===============   6 end
 
===============   7、 VisitorTest.java
package visitor;
import java.util.ArrayList;
import java.util.List;
public class VisitorTest {
  public static void main(String[] args) {
    NodeA nodeA = new NodeA();
    NodeB nodeB = new NodeB();
    NodeC nodeC = new NodeC();
    VisitorTest nodeD = new VisitorTest();
    //访问单个对象
    VisitorA visitorA = new VisitorA();
    visitorA.visit(nodeA);
    visitorA.visit(nodeB);
    visitorA.visit(nodeC);
    //访问集合
    List list = new ArrayList();
    list.add(nodeA);
    list.add(nodeB);
    list.add(nodeC);
    visitorA.visitCollection(list);
  }
}
===============   7 end

在两个接口Visitor和Visitable中,确保Visitable很少变化,也就是说,确保不能

老有新的Element元素类型加进来,可以变化的是访问者行为或操作,也就是

Visitor的不同子类可以有多种,这样使用访问者模式最方便.



你可能感兴趣的:(java设计模式)