BEFORE

AFTER

package gPackage;

 

public class Application {

        public static void main(String[] args) {

               Picture p = new Picture();

               p.add(new Square());

               p.add(new Triangle());

               // ...

               p.draw();

        }

}

package gPackage;

 
public class Application {
        public static void main(String[] args) {
               Picture p = new Picture();
               p.add(new Square());
               p.add(new Triangle());
               // ..
               p.accept(gPackage.DrawVisitor.instance);
        }
}

package gPackage;

 
public class Graphic {
        public void draw() {
               System.out.println("draw() in Graphic");
        }
}

package gPackage;

 
public class Graphic {
        public void accept(DrawVisitor gpackage_drawvisitor) {
               gpackage_drawvisitor.visit(this);
        }
}

package gPackage;

 
import java.util.ArrayList;
 
public class Picture extends Graphic {
        public ArrayList<Graphic> gList = new ArrayList<Graphic>();
        
        public void add(Graphic g) {
               gList.add(g);
        }
        
        public void draw() {
               System.out.println("draw() in Picture");
               
               for(Graphic g : gList)
                       g.draw();
        }
}

package gPackage;

 
import java.util.ArrayList;
 
public class Picture extends Graphic {
        public ArrayList<Graphic> gList = new ArrayList<Graphic>();
        
        public void add(Graphic g) {
               gList.add(g);
        }
 
        public void accept(DrawVisitor gpackage_drawvisitor) {
               gpackage_drawvisitor.visit(this);
        }
}

package gPackage;

 
public class Square extends Graphic {
        public void draw() {
               System.out.println("draw() in Square");
        }
}

package gPackage;

 
public class Square extends Graphic {
        public void accept(DrawVisitor gpackage_drawvisitor) {
               gpackage_drawvisitor.visit(this);
        }
}

package gPackage;

 
public class Triangle extends Graphic {
        public void draw() {
               System.out.println("draw() in Triangle");
        }
}

package gPackage;

 
public class Triangle extends Graphic {
        public void accept(DrawVisitor gpackage_drawvisitor) {
               gpackage_drawvisitor.visit(this);
        }
}

 

package gPackage;

 
public class DrawVisitor {
 
        public static final DrawVisitor instance = new DrawVisitor();
        
        public void visit(gPackage.Graphic gpackage_graphic) {
               System.out.println("draw() in Graphic");
        }
        public void visit(gPackage.Triangle gpackage_triangle) {
               System.out.println("draw() in Triamgle");
        }
        public void visit(gPackage.Square gpackage_square) {
               System.out.println("draw() in Square");
        }
        
        public void visit(gPackage.Picture gpackage_picture) {
               System.out.println("draw() in Picture");
               
               for(gPackage.Graphic g : gpackage_picture.gList)
                       g.accept(gPackage.DrawVisitor.instance);
        }
}