diff --git a/pom.xml b/pom.xml
index 298732fd5..612cce368 100644
--- a/pom.xml
+++ b/pom.xml
@@ -40,6 +40,7 @@
state
strategy
template-method
+ visitor
diff --git a/visitor/pom.xml b/visitor/pom.xml
new file mode 100644
index 000000000..af1cb739d
--- /dev/null
+++ b/visitor/pom.xml
@@ -0,0 +1,23 @@
+
+
+ 4.0.0
+
+ com.iluwatar
+ java-design-patterns
+ 1.0-SNAPSHOT
+
+ com.iluwatar
+ visitor
+ 1.0-SNAPSHOT
+ visitor
+ http://maven.apache.org
+
+
+ junit
+ junit
+ 3.8.1
+ test
+
+
+
diff --git a/visitor/src/main/java/com/iluwatar/App.java b/visitor/src/main/java/com/iluwatar/App.java
new file mode 100644
index 000000000..1bf7cbf26
--- /dev/null
+++ b/visitor/src/main/java/com/iluwatar/App.java
@@ -0,0 +1,16 @@
+package com.iluwatar;
+
+public class App
+{
+ public static void main( String[] args )
+ {
+
+ Commander commander = new Commander(
+ new Sergeant(new Soldier(), new Soldier(), new Soldier()),
+ new Sergeant(new Soldier(), new Soldier(), new Soldier()));
+ commander.accept(new SoldierVisitor());
+ commander.accept(new SergeantVisitor());
+ commander.accept(new CommanderVisitor());
+
+ }
+}
diff --git a/visitor/src/main/java/com/iluwatar/Commander.java b/visitor/src/main/java/com/iluwatar/Commander.java
new file mode 100644
index 000000000..6366abeaf
--- /dev/null
+++ b/visitor/src/main/java/com/iluwatar/Commander.java
@@ -0,0 +1,19 @@
+package com.iluwatar;
+
+public class Commander extends Unit {
+
+ public Commander(Unit ... children) {
+ super(children);
+ }
+
+ @Override
+ public void accept(UnitVisitor visitor) {
+ visitor.visitCommander(this);
+ super.accept(visitor);
+ }
+
+ @Override
+ public String toString() {
+ return "commander";
+ }
+}
diff --git a/visitor/src/main/java/com/iluwatar/CommanderVisitor.java b/visitor/src/main/java/com/iluwatar/CommanderVisitor.java
new file mode 100644
index 000000000..63904aa2c
--- /dev/null
+++ b/visitor/src/main/java/com/iluwatar/CommanderVisitor.java
@@ -0,0 +1,22 @@
+package com.iluwatar;
+
+public class CommanderVisitor implements UnitVisitor {
+
+ @Override
+ public void visitSoldier(Soldier soldier) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void visitSergeant(Sergeant sergeant) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void visitCommander(Commander commander) {
+ System.out.println("Good to see you " + commander);
+ }
+
+}
diff --git a/visitor/src/main/java/com/iluwatar/Sergeant.java b/visitor/src/main/java/com/iluwatar/Sergeant.java
new file mode 100644
index 000000000..f56b3fc7a
--- /dev/null
+++ b/visitor/src/main/java/com/iluwatar/Sergeant.java
@@ -0,0 +1,19 @@
+package com.iluwatar;
+
+public class Sergeant extends Unit {
+
+ public Sergeant(Unit ... children) {
+ super(children);
+ }
+
+ @Override
+ public void accept(UnitVisitor visitor) {
+ visitor.visitSergeant(this);
+ super.accept(visitor);
+ }
+
+ @Override
+ public String toString() {
+ return "sergeant";
+ }
+}
diff --git a/visitor/src/main/java/com/iluwatar/SergeantVisitor.java b/visitor/src/main/java/com/iluwatar/SergeantVisitor.java
new file mode 100644
index 000000000..5257ca4b5
--- /dev/null
+++ b/visitor/src/main/java/com/iluwatar/SergeantVisitor.java
@@ -0,0 +1,22 @@
+package com.iluwatar;
+
+public class SergeantVisitor implements UnitVisitor {
+
+ @Override
+ public void visitSoldier(Soldier soldier) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void visitSergeant(Sergeant sergeant) {
+ System.out.println("Hello " + sergeant);
+ }
+
+ @Override
+ public void visitCommander(Commander commander) {
+ // TODO Auto-generated method stub
+
+ }
+
+}
diff --git a/visitor/src/main/java/com/iluwatar/Soldier.java b/visitor/src/main/java/com/iluwatar/Soldier.java
new file mode 100644
index 000000000..45b9b1554
--- /dev/null
+++ b/visitor/src/main/java/com/iluwatar/Soldier.java
@@ -0,0 +1,19 @@
+package com.iluwatar;
+
+public class Soldier extends Unit {
+
+ public Soldier(Unit ... children) {
+ super(children);
+ }
+
+ @Override
+ public void accept(UnitVisitor visitor) {
+ visitor.visitSoldier(this);
+ super.accept(visitor);
+ }
+
+ @Override
+ public String toString() {
+ return "soldier";
+ }
+}
diff --git a/visitor/src/main/java/com/iluwatar/SoldierVisitor.java b/visitor/src/main/java/com/iluwatar/SoldierVisitor.java
new file mode 100644
index 000000000..fd80d553c
--- /dev/null
+++ b/visitor/src/main/java/com/iluwatar/SoldierVisitor.java
@@ -0,0 +1,22 @@
+package com.iluwatar;
+
+public class SoldierVisitor implements UnitVisitor {
+
+ @Override
+ public void visitSoldier(Soldier soldier) {
+ System.out.println("Greetings " + soldier);
+ }
+
+ @Override
+ public void visitSergeant(Sergeant sergeant) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void visitCommander(Commander commander) {
+ // TODO Auto-generated method stub
+
+ }
+
+}
diff --git a/visitor/src/main/java/com/iluwatar/Unit.java b/visitor/src/main/java/com/iluwatar/Unit.java
new file mode 100644
index 000000000..df77a9776
--- /dev/null
+++ b/visitor/src/main/java/com/iluwatar/Unit.java
@@ -0,0 +1,16 @@
+package com.iluwatar;
+
+public abstract class Unit {
+
+ private Unit[] children;
+
+ public Unit(Unit ... children) {
+ this.children = children;
+ }
+
+ public void accept(UnitVisitor visitor) {
+ for (Unit child: children) {
+ child.accept(visitor);
+ }
+ }
+}
diff --git a/visitor/src/main/java/com/iluwatar/UnitVisitor.java b/visitor/src/main/java/com/iluwatar/UnitVisitor.java
new file mode 100644
index 000000000..dd55508c1
--- /dev/null
+++ b/visitor/src/main/java/com/iluwatar/UnitVisitor.java
@@ -0,0 +1,9 @@
+package com.iluwatar;
+
+public interface UnitVisitor {
+
+ void visitSoldier(Soldier soldier);
+ void visitSergeant(Sergeant sergeant);
+ void visitCommander(Commander commander);
+
+}