abstract class Visitor {
abstract public void visitConcreteElementA(ConcreteElementA
concreteElementA);
abstract public void visitConcreteElementB(ConcreteElementB
concreteElementB);
}
public class ConcreteVisitor1 extends Visitor{
public void visitConcreteElementA(ConcreteElementA
concreteElementA){
System.out.println("ConcreteElementAがConcreteVisitor1によって訪問されました");
}
public void visitConcreteElementB(ConcreteElementB
concreteElementB){
System.out.println("ConcreteElementBがConcreteVisitor1によって訪問されました");
}
}
public class ConcreteVisitor2 extends Visitor{
public void visitConcreteElementA(ConcreteElementA
concreteElementA){
System.out.println("ConcreteElementAがConcreteVisitor2によって訪問されました");
}
public void visitConcreteElementB(ConcreteElementB
concreteElementB){
System.out.println("ConcreteElementBがConcreteVisitor2によって訪問されました");
}
}
public class ConcreteElementA extends Element{
public void accept(Visitor visitor) {
visitor.visitConcreteElementA(this);
}
public void operationA() {
}
}
public class ConcreteElementB extends Element{
public void accept(Visitor visitor) {
visitor.visitConcreteElementB(this);
}
public void operationA() {
}
}
import java.util.*;
public class ObjectStructure {
private ArrayList elements = new ArrayList();
public void attach(Element element) {
elements.add(element);
}
public void detatch(Element element) {
elements.remove(element);
}
public void accept(Visitor visitor) {
for (int i=0;i<elements.size();i++) {
Element e = (Element)elements.get(i);
e.accept(visitor);
}
}
}
public class Client {
public static void main(String[] args) {
ObjectStructure o = new ObjectStructure();
o.attach(new ConcreteElementA());
o.attach(new ConcreteElementB());
ConcreteVisitor1 v1 = new ConcreteVisitor1();
ConcreteVisitor2 v2 = new ConcreteVisitor2();
o.accept(v1);
o.accept(v2);
}
}