diff --git a/extension-objects/pom.xml b/extension-objects/pom.xml
new file mode 100644
index 000000000..afdf010a2
--- /dev/null
+++ b/extension-objects/pom.xml
@@ -0,0 +1,15 @@
+
+
+
+ java-design-patterns
+ com.iluwatar
+ 1.16.0-SNAPSHOT
+
+ 4.0.0
+
+ extension-objects
+
+
+
\ No newline at end of file
diff --git a/extension-objects/src/main/java/App.java b/extension-objects/src/main/java/App.java
new file mode 100644
index 000000000..9aa934580
--- /dev/null
+++ b/extension-objects/src/main/java/App.java
@@ -0,0 +1,59 @@
+import abstractextensions.CommanderExtension;
+import abstractextensions.SergeantExtension;
+import abstractextensions.SoldierExtension;
+import units.CommanderUnit;
+import units.SergeantUnit;
+import units.SoldierUnit;
+import units.Unit;
+
+/**
+ * Created by Srdjan on 26-Apr-17.
+ */
+public class App {
+
+ /**
+ * Program entry point
+ *
+ * @param args command line args
+ */
+ public static void main(String[] args) {
+
+ //Create 3 different units
+ Unit unit = new SoldierUnit("SoldierUnit1");
+ Unit unit1 = new SergeantUnit("SergeantUnit1");
+ Unit unit2 = new CommanderUnit("CommanderUnit1");
+
+ //check for each unit to have an extension
+ checkExtensionsForUnit(unit);
+ checkExtensionsForUnit(unit1);
+ checkExtensionsForUnit(unit2);
+
+ }
+
+ private static void checkExtensionsForUnit(Unit unit) {
+ //separate for better view
+ System.out.println();
+
+ SoldierExtension soldierExtension = (SoldierExtension) unit.getUnitExtension("SoldierExtension");
+ SergeantExtension sergeantExtension = (SergeantExtension) unit.getUnitExtension("SergeantExtension");
+ CommanderExtension commanderExtension = (CommanderExtension) unit.getUnitExtension("CommanderExtension");
+
+ if (soldierExtension != null) {
+ soldierExtension.soldierReady();
+ } else {
+ System.out.println(unit.getName() + " without SoldierExtension");
+ }
+
+ if (sergeantExtension != null) {
+ sergeantExtension.sergeantReady();
+ } else {
+ System.out.println(unit.getName() + " without SergeantExtension");
+ }
+
+ if (commanderExtension != null) {
+ // commanderExtension.sergeantReady();
+ } else {
+ System.out.println(unit.getName() + " without CommanderExtension");
+ }
+ }
+}
diff --git a/extension-objects/src/main/java/abstractextensions/CommanderExtension.java b/extension-objects/src/main/java/abstractextensions/CommanderExtension.java
new file mode 100644
index 000000000..aa716a3ae
--- /dev/null
+++ b/extension-objects/src/main/java/abstractextensions/CommanderExtension.java
@@ -0,0 +1,7 @@
+package abstractextensions;
+
+/**
+ * Created by Srdjan on 27-Apr-17.
+ */
+public interface CommanderExtension extends UnitExtension {
+}
diff --git a/extension-objects/src/main/java/abstractextensions/SergeantExtension.java b/extension-objects/src/main/java/abstractextensions/SergeantExtension.java
new file mode 100644
index 000000000..dc7bbdc70
--- /dev/null
+++ b/extension-objects/src/main/java/abstractextensions/SergeantExtension.java
@@ -0,0 +1,9 @@
+package abstractextensions;
+
+/**
+ * Created by Srdjan on 27-Apr-17.
+ */
+public interface SergeantExtension extends UnitExtension {
+
+ void sergeantReady();
+}
diff --git a/extension-objects/src/main/java/abstractextensions/SoldierExtension.java b/extension-objects/src/main/java/abstractextensions/SoldierExtension.java
new file mode 100644
index 000000000..1715811f8
--- /dev/null
+++ b/extension-objects/src/main/java/abstractextensions/SoldierExtension.java
@@ -0,0 +1,8 @@
+package abstractextensions;
+
+/**
+ * Created by Srdjan on 26-Apr-17.
+ */
+public interface SoldierExtension extends UnitExtension {
+ void soldierReady();
+}
diff --git a/extension-objects/src/main/java/abstractextensions/UnitExtension.java b/extension-objects/src/main/java/abstractextensions/UnitExtension.java
new file mode 100644
index 000000000..03c58d181
--- /dev/null
+++ b/extension-objects/src/main/java/abstractextensions/UnitExtension.java
@@ -0,0 +1,7 @@
+package abstractextensions;
+
+/**
+ * Created by Srdjan on 26-Apr-17.
+ */
+public interface UnitExtension {
+}
diff --git a/extension-objects/src/main/java/concreteextensions/Commander.java b/extension-objects/src/main/java/concreteextensions/Commander.java
new file mode 100644
index 000000000..3de4d124a
--- /dev/null
+++ b/extension-objects/src/main/java/concreteextensions/Commander.java
@@ -0,0 +1,16 @@
+package concreteextensions;
+
+import abstractextensions.CommanderExtension;
+import units.CommanderUnit;
+
+/**
+ * Created by Srdjan on 27-Apr-17.
+ */
+public class Commander implements CommanderExtension {
+
+ private CommanderUnit unit;
+
+ public Commander(CommanderUnit commanderUnit) {
+ this.unit = commanderUnit;
+ }
+}
diff --git a/extension-objects/src/main/java/concreteextensions/Sergeant.java b/extension-objects/src/main/java/concreteextensions/Sergeant.java
new file mode 100644
index 000000000..b2d4485c3
--- /dev/null
+++ b/extension-objects/src/main/java/concreteextensions/Sergeant.java
@@ -0,0 +1,21 @@
+package concreteextensions;
+
+import abstractextensions.SergeantExtension;
+import units.SergeantUnit;
+
+/**
+ * Created by Srdjan on 27-Apr-17.
+ */
+public class Sergeant implements SergeantExtension {
+
+ private SergeantUnit unit;
+
+ public Sergeant(SergeantUnit sergeantUnit) {
+ this.unit = sergeantUnit;
+ }
+
+ @Override
+ public void sergeantReady() {
+ System.out.println("[Sergeant] " + unit.getName() + " do command! ");
+ }
+}
diff --git a/extension-objects/src/main/java/concreteextensions/Soldier.java b/extension-objects/src/main/java/concreteextensions/Soldier.java
new file mode 100644
index 000000000..e2d11e244
--- /dev/null
+++ b/extension-objects/src/main/java/concreteextensions/Soldier.java
@@ -0,0 +1,21 @@
+package concreteextensions;
+
+import abstractextensions.SoldierExtension;
+import units.SoldierUnit;
+
+/**
+ * Created by Srdjan on 26-Apr-17.
+ */
+public class Soldier implements SoldierExtension {
+
+ private SoldierUnit unit;
+
+ public Soldier(SoldierUnit soldierUnit) {
+ this.unit = soldierUnit;
+ }
+
+ @Override
+ public void soldierReady() {
+ System.out.println("[Solider] " + unit.getName() + " do command");
+ }
+}
diff --git a/extension-objects/src/main/java/units/CommanderUnit.java b/extension-objects/src/main/java/units/CommanderUnit.java
new file mode 100644
index 000000000..67a0f9a06
--- /dev/null
+++ b/extension-objects/src/main/java/units/CommanderUnit.java
@@ -0,0 +1,30 @@
+package units;
+
+import abstractextensions.CommanderExtension;
+import abstractextensions.UnitExtension;
+import concreteextensions.Commander;
+
+/**
+ * Created by Srdjan on 27-Apr-17.
+ */
+public class CommanderUnit extends Unit {
+
+ private CommanderExtension commanderExtension;
+
+ public CommanderUnit(String name) {
+ super(name);
+ }
+
+ @Override
+ public UnitExtension getUnitExtension(String extensionName) {
+
+ if (extensionName.equals("CommanderExtension")) {
+ if (commanderExtension == null) {
+ commanderExtension = new Commander(this);
+ }
+ return commanderExtension;
+ }
+
+ return super.getUnitExtension(extensionName);
+ }
+}
diff --git a/extension-objects/src/main/java/units/SergeantUnit.java b/extension-objects/src/main/java/units/SergeantUnit.java
new file mode 100644
index 000000000..3188f7e4e
--- /dev/null
+++ b/extension-objects/src/main/java/units/SergeantUnit.java
@@ -0,0 +1,30 @@
+package units;
+
+import abstractextensions.SergeantExtension;
+import abstractextensions.UnitExtension;
+import concreteextensions.Sergeant;
+
+/**
+ * Created by Srdjan on 27-Apr-17.
+ */
+public class SergeantUnit extends Unit {
+
+ private SergeantExtension sergeantExtension;
+
+ public SergeantUnit(String name) {
+ super(name);
+ }
+
+ @Override
+ public UnitExtension getUnitExtension(String extensionName) {
+
+ if (extensionName.equals("SergeantExtension")) {
+ if (sergeantExtension == null) {
+ sergeantExtension = new Sergeant(this);
+ }
+ return sergeantExtension;
+ }
+
+ return super.getUnitExtension(extensionName);
+ }
+}
diff --git a/extension-objects/src/main/java/units/SoldierUnit.java b/extension-objects/src/main/java/units/SoldierUnit.java
new file mode 100644
index 000000000..f96842465
--- /dev/null
+++ b/extension-objects/src/main/java/units/SoldierUnit.java
@@ -0,0 +1,30 @@
+package units;
+
+import abstractextensions.SoldierExtension;
+import abstractextensions.UnitExtension;
+import concreteextensions.Soldier;
+
+/**
+ * Created by Srdjan on 26-Apr-17.
+ */
+public class SoldierUnit extends Unit {
+
+ private SoldierExtension soldierExtension;
+
+ public SoldierUnit(String name) {
+ super(name);
+ }
+
+ @Override
+ public UnitExtension getUnitExtension(String extensionName) {
+
+ if (extensionName.equals("SoldierExtension")) {
+ if (soldierExtension == null) {
+ soldierExtension = new Soldier(this);
+ }
+
+ return soldierExtension;
+ }
+ return super.getUnitExtension(extensionName);
+ }
+}
diff --git a/extension-objects/src/main/java/units/Unit.java b/extension-objects/src/main/java/units/Unit.java
new file mode 100644
index 000000000..670c60aa8
--- /dev/null
+++ b/extension-objects/src/main/java/units/Unit.java
@@ -0,0 +1,27 @@
+package units;
+
+import abstractextensions.UnitExtension;
+
+/**
+ * Created by Srdjan on 26-Apr-17.
+ */
+public class Unit {
+
+ private String name;
+
+ public Unit(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public UnitExtension getUnitExtension(String extensionName) {
+ return null;
+ }
+}
diff --git a/pom.xml b/pom.xml
index a45f0e1f3..dab143e8b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -139,6 +139,7 @@
converter
guarded-suspension
balking
+ extension-objects