Visitor Pattern:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作(double dispatch)。
Acceptable.java
package com.flyingh.acceptable;
import com.flyingh.visitable.Visitor;
public interface Acceptable {
void accept(Visitor visitor);
void action();
}
Visitor.java
package com.flyingh.visitable;
import com.flyingh.place.PlaceA;
import com.flyingh.place.PlaceB;
public interface Visitor {
void visit(PlaceA placeA);
void visit(PlaceB placeB);
}
PlaceA.java
package com.flyingh.place;
import com.flyingh.acceptable.Acceptable;
import com.flyingh.visitable.Visitor;
public class PlaceA implements Acceptable {
@Override
public void accept(Visitor visitor) {
// TODO Auto-generated method stub
visitor.visit(this);
}
@Override
public void action() {
System.out.println("PlaceA.action()");
}
}
PlaceB.java
package com.flyingh.place;
import com.flyingh.acceptable.Acceptable;
import com.flyingh.visitable.Visitor;
public class PlaceB implements Acceptable {
@Override
public void accept(Visitor visitor) {
// TODO Auto-generated method stub
visitor.visit(this);
}
public void action() {
// TODO Auto-generated method stub
System.out.println("PlaceB.action()");
}
}
ConcreteActionVisitor.java
package com.flyingh.visitor;
import com.flyingh.place.PlaceA;
import com.flyingh.place.PlaceB;
import com.flyingh.visitable.Visitor;
public class ConcreteActionVisitor implements Visitor {
@Override
public void visit(PlaceA placeA) {
// TODO Auto-generated method stub
placeA.action();
}
@Override
public void visit(PlaceB placeB) {
// TODO Auto-generated method stub
placeB.action();
}
}
ConcreteInfoVisitor.java
package com.flyingh.visitor;
import com.flyingh.place.PlaceA;
import com.flyingh.place.PlaceB;
import com.flyingh.visitable.Visitor;
public class ConcreteInfoVisitor implements Visitor {
@Override
public void visit(PlaceA placeA) {
// TODO Auto-generated method stub
System.out.println("placeA's info");
}
@Override
public void visit(PlaceB placeB) {
// TODO Auto-generated method stub
System.out.println("placeB's info");
}
}
ObjectStructure.java
package com.flyingh.sth;
import java.util.ArrayList;
import java.util.List;
import com.flyingh.acceptable.Acceptable;
import com.flyingh.place.PlaceA;
import com.flyingh.place.PlaceB;
import com.flyingh.visitable.Visitor;
public class ObjectStructure {
private List<Acceptable> list = new ArrayList<Acceptable>();
public ObjectStructure() {
super();
Acceptable placeA = new PlaceA();
Acceptable placeB = new PlaceB();
list.add(placeA);
list.add(placeB);
}
public void action(Visitor visitor) {
for (Acceptable acceptable : list) {
acceptable.accept(visitor);
}
}
}
Client.java
package com.flyingh.client;
import com.flyingh.sth.ObjectStructure;
import com.flyingh.visitable.Visitor;
import com.flyingh.visitor.ConcreteActionVisitor;
import com.flyingh.visitor.ConcreteInfoVisitor;
public class Client {
public static void main(String[] args) {
Visitor visitor = new ConcreteActionVisitor();
Visitor visitor2=new ConcreteInfoVisitor();
ObjectStructure os = new ObjectStructure();
os.action(visitor);
System.out.println("************");
os.action(visitor2);
}
}
程序运行结果如下:
PlaceA.action()
PlaceB.action()
************
placeA's info
placeB's info