拡張モードのVisitor(ビジター)モード

6271 ワード

1.クラス階層を変更することなく、開発者が新しい操作を定義できるようにするには、Visitor(ビジター)モードを使用します.例を挙げる
//     
interface IVisitor {
    void visit(Node node);
}
//     
abstract class Node {
    abstract void accept(IVisitor iVisitor);
    abstract void doSomethings();
}
//  A :               
public class NodeA extends Node{

    @Override
    void accept(IVisitor iVisitor) {
        // TODO Auto-generated method stub
        iVisitor.visit(this);
    }

    @Override
    void doSomethings() {
        // TODO Auto-generated method stub
        System.out.println("NodeA do it");
    }

}
//  B :               
public class NodeB extends Node{

    @Override
    void accept(IVisitor iVisitor) {
        // TODO Auto-generated method stub
        iVisitor.visit(this);
    }

    @Override
    void doSomethings() {
        // TODO Auto-generated method stub
        System.out.println("NodeB do it");
    }

}
//      :       
public class FirstVisitor implements IVisitor{

    @Override
    public void visit(Node node) {
        // TODO Auto-generated method stub
        System.out.print("FirstVisitor ");
        node.doSomethings();
    }

}
//      :       
public class SecondVisitor implements IVisitor{

    @Override
    public void visit(Node node) {
        // TODO Auto-generated method stub
        System.out.print("SecondVisitor ");
        node.doSomethings();
    }

}
import java.util.ArrayList;
import java.util.List;
//     :   Node          
public class ObjectStructure {
    private List<Node> nodes = new ArrayList<Node>();

    public void doIt(IVisitor iVisitor){
        for(Node node : nodes){
            node.accept(iVisitor);
        }
    }

    public void add(Node node){
        nodes.add(node);
    }
}
//   
public class Test {
    public static void main(String[] args) {
        ObjectStructure os = new ObjectStructure();

        os.add(new NodeA());
        os.add(new NodeB());
        //          
        os.doIt(new FirstVisitor());
        os.doIt(new SecondVisitor());
    }
}
//  
FirstVisitor NodeA do it
FirstVisitor NodeB do it
SecondVisitor NodeA do it
SecondVisitor NodeB do it

3.まとめ:Visitor(ビジター)モードの意図は、コードユーザが既存のクラス階層を変更しない前提で、そのクラス階層操作を定義できるようにすることである.accep()メソッドは、「2回の配布」テクノロジーを使用して呼び出し結果をアクセサクラスに返します.visit()メソッドは、アクセサクラスで定義され、クラス階層内のクラスオブジェクトがそのタイプに応じて適切なvisit()メソッドを呼び出すことができます.4.参考:http://www.cnblogs.com/java-my-life/archive/2012/06/14/2545381.html