public abstract class Element {
public abstract void accept ( Visitor visitor) ;
}
public abstract class Visitor {
public abstract void visitConcreteElementA ( ConcreteElementA concreteElementA) ;
public abstract void visitConcreteElementB ( ConcreteElementB concreteElementB) ;
}
public class ConcreteElementA extends Element {
@Override
public void accept ( Visitor visitor) {
visitor. visitConcreteElementA ( this ) ;
}
public void operationA ( ) {
}
}
public class ConcreteElementB extends Element {
@Override
public void accept ( Visitor visitor) {
visitor. visitConcreteElementB ( this ) ;
}
public void operationB ( ) {
}
}
public class ConcreteVisitor1 extends Visitor {
@Override
public void visitConcreteElementA ( ConcreteElementA concreteElementA) {
System. out. println ( concreteElementA. getClass ( ) . getName ( ) + " 被 " + this . getClass ( ) . getName ( ) + " 访问 " ) ;
}
@Override
public void visitConcreteElementB ( ConcreteElementB concreteElementB) {
System. out. println ( concreteElementB. getClass ( ) . getName ( ) + " 被 " + this . getClass ( ) . getName ( ) + " 访问 " ) ;
}
}
public class ObjectStructure {
private List< Element> elements = new LinkedList < Element> ( ) ;
public void attach ( Element element) {
elements. add ( element) ;
}
public void detach ( Element element) {
elements. remove ( element) ;
}
public void accept ( Visitor visitor) {
for ( Element e : elements) {
e. accept ( visitor) ;
}
}
}
public class ConcreteVisitor2 extends Visitor {
@Override
public void visitConcreteElementA ( ConcreteElementA concreteElementA) {
System. out. println ( concreteElementA. getClass ( ) . getName ( ) + " 被 " + this . getClass ( ) . getName ( ) + " 访问 " ) ;
}
@Override
public void visitConcreteElementB ( ConcreteElementB concreteElementB) {
System. out. println ( concreteElementB. getClass ( ) . getName ( ) + " 被 " + this . getClass ( ) . getName ( ) + " 访问 " ) ;
}
}
public class DemoEnter {
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) ;
}
}