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