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