ビジターモードVisitor
2903 ワード
//Purpose. Visitor design pattern
//1. Add an accept(Visitor) method to the "element" hierarchy
//2. Create a "visitor" base class w/ a visit() method for every "element" type
//3. Create a "visitor" derived class for each "operation" to do on "elements"
//4. Client creates "visitor" objects and passes each to accept() calls
interface Element {
public void accept(Visitor v); // first dispatch // 1. accept(Visitor)
} // interface
class This implements Element {
public void accept(Visitor v) {
v.visit(this);
} // 1. accept(Visitor)
public String thiss() {
return "This";
} // implementation
}
class That implements Element {
public void accept(Visitor v) {
v.visit(this);
}
public String that() {
return "That";
}
}
class TheOther implements Element {
public void accept(Visitor v) {
v.visit(this);
}
public String theOther() {
return "TheOther";
}
}
interface Visitor { // 2. Create a "visitor"
public void visit(This e); // //// second dispatch // base class with a
public void visit(That e); // visit() method for
public void visit(TheOther e); // every "element"
} // type
class UpVisitor implements Visitor { // 3. Create a "visitor"
public void visit(This e) { // derived class for
System.out.println("do Up on " + e.thiss());
} // each "operation"
public void visit(That e) { // to perform on
System.out.println("do Up on " + e.that());
} // "elements"
public void visit(TheOther e) {
System.out.println("do Up on " + e.theOther());
}
}
class DownVisitor implements Visitor {
public void visit(This e) {
System.out.println("do Down on " + e.thiss());
}
public void visit(That e) {
System.out.println("do Down on " + e.that());
}
public void visit(TheOther e) {
System.out.println("do Down on " + e.theOther());
}
}
class VisitorDemo {
public static Element[] list = { new This(), new That(), new TheOther() };
public static void main(String[] args) {
UpVisitor up = new UpVisitor(); // 4. Client creates
DownVisitor down = new DownVisitor(); // "visitor" objects
for (int i = 0; i < list.length; i++)
// and passes each
list[i].accept(up); // to accept() calls
for (int i = 0; i < list.length; i++)
list[i].accept(down);
}
}