访问者模式
//访问者模式
//CopyRight(C) CAnca software Office.2006
//Created by CAnca.
import java.util.*;
public class VisitorMode{
public static void main(String[] args){
// Setup structure
ObjectStructure o = new ObjectStructure();
o.Attach(new ConcreteElementA());
o.Attach(new ConcreteElementB());
// Create visitor objects
ConcreteVisitorA v1 = new ConcreteVisitorA();
ConcreteVisitorB v2 = new ConcreteVisitorB();
// Structure accepting visitors
o.Accept(v1);
o.Accept(v2);
}
}
//Visitor
abstract class Visitor{
abstract void VisitorConcreteElementA(ConcreteElementA element);
abstract void VisitorConcreteElementB(ConcreteElementB elelemt);
}
class ConcreteVisitorA extends Visitor{
public void VisitorConcreteElementA(ConcreteElementA element){
System.out.println(element.getClass().getName() + " visited by " + this.getClass().getName());
}
public void VisitorConcreteElementB(ConcreteElementB element){
System.out.println(element.getClass().getName() + " visited by " + this.getClass().getName());
}
}
class ConcreteVisitorB extends Visitor{
public void VisitorConcreteElementA(ConcreteElementA element){
System.out.println(element.getClass().getName() + " visited by " + this.getClass().getName());
}
public void VisitorConcreteElementB(ConcreteElementB element){
System.out.println(element.getClass().getName() + " visited by " + this.getClass().getName());
}
}
//Element
abstract class Element{
abstract void Accept(Visitor visitor);
}
class ConcreteElementA extends Element{
public void Accept(Visitor visitor){
visitor.VisitorConcreteElementA(this);
}
}
class ConcreteElementB extends Element{
public void Accept(Visitor visitor){
visitor.VisitorConcreteElementB(this);
}
}
//ObjectStructure
class ObjectStructure{
private ArrayList elements = new ArrayList();
public void Attach(Element element)
{
elements.add(element);
}
public void Detach(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);
}
}
}