Visitor Design Pattern in Java
Visitor design pattern
- Add an
accept(Visitor)method to the "element" hierarchy - Create a "visitor" base class w/ a
visit()method for every "element" type - Create a "visitor" derived class for each "operation" to do on "elements"
- Client creates "visitor" objects and passes each to
accept()calls
interface Element { void accept(Visitor v); } class FOO implements Element { public void accept(Visitor v) { v.visit(this); } public String getFOO() { return "FOO"; } } class BAR implements Element { public void accept( Visitor v ) { v.visit( this ); } public String getBAR() { return "BAR"; } } class BAZ implements Element { public void accept(Visitor v) { v.visit(this); } public String getBAZ() { return "BAZ"; } } interface Visitor { void visit(FOO foo); void visit(BAR bar); void visit(BAZ baz); } class UpVisitor implements Visitor { public void visit(FOO foo) { System.out.println("do Up on " + foo.getFOO()); } public void visit(BAR bar) { System.out.println("do Up on " + bar.getBAR()); } public void visit(BAZ baz) { System.out.println( "do Up on " + baz.getBAZ() ); } } class DownVisitor implements Visitor { public void visit(FOO foo) { System.out.println("do Down on " + foo.getFOO()); } public void visit(BAR bar) { System.out.println("do Down on " + bar.getBAR()); } public void visit(BAZ baz ) { System.out.println("do Down on " + baz.getBAZ()); } } public class VisitorDemo { public static void main( String[] args ) { Element[] list = {new FOO(), new BAR(), new BAZ()}; UpVisitor up = new UpVisitor(); DownVisitor down = new DownVisitor(); for (Element element : list) { element.accept(up); } for (Element element : list) { element.accept(down); } } } Output
do Up on FOO do Up on BAR do Up on BAZ do Down on FOO do Down on BAR do Down on BAZ
