From 645e91ed23d436d5a535c88335d6d37f22189220 Mon Sep 17 00:00:00 2001 From: SrdjanPaunovic Date: Thu, 27 Apr 2017 13:58:58 +0200 Subject: [PATCH 01/10] first version of pattern without Tests --- extension-objects/pom.xml | 15 +++++ extension-objects/src/main/java/App.java | 59 +++++++++++++++++++ .../CommanderExtension.java | 7 +++ .../abstractextensions/SergeantExtension.java | 9 +++ .../abstractextensions/SoldierExtension.java | 8 +++ .../abstractextensions/UnitExtension.java | 7 +++ .../java/concreteextensions/Commander.java | 16 +++++ .../java/concreteextensions/Sergeant.java | 21 +++++++ .../main/java/concreteextensions/Soldier.java | 21 +++++++ .../src/main/java/units/CommanderUnit.java | 30 ++++++++++ .../src/main/java/units/SergeantUnit.java | 30 ++++++++++ .../src/main/java/units/SoldierUnit.java | 30 ++++++++++ .../src/main/java/units/Unit.java | 27 +++++++++ pom.xml | 1 + 14 files changed, 281 insertions(+) create mode 100644 extension-objects/pom.xml create mode 100644 extension-objects/src/main/java/App.java create mode 100644 extension-objects/src/main/java/abstractextensions/CommanderExtension.java create mode 100644 extension-objects/src/main/java/abstractextensions/SergeantExtension.java create mode 100644 extension-objects/src/main/java/abstractextensions/SoldierExtension.java create mode 100644 extension-objects/src/main/java/abstractextensions/UnitExtension.java create mode 100644 extension-objects/src/main/java/concreteextensions/Commander.java create mode 100644 extension-objects/src/main/java/concreteextensions/Sergeant.java create mode 100644 extension-objects/src/main/java/concreteextensions/Soldier.java create mode 100644 extension-objects/src/main/java/units/CommanderUnit.java create mode 100644 extension-objects/src/main/java/units/SergeantUnit.java create mode 100644 extension-objects/src/main/java/units/SoldierUnit.java create mode 100644 extension-objects/src/main/java/units/Unit.java 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 From 678524704c5a710d42f75d5d0c96fd74b31acea6 Mon Sep 17 00:00:00 2001 From: SrdjanPaunovic Date: Wed, 3 May 2017 13:21:13 +0200 Subject: [PATCH 02/10] Test done --- extension-objects/pom.xml | 8 ++++- extension-objects/src/main/java/App.java | 3 +- .../CommanderExtension.java | 2 ++ .../java/concreteextensions/Commander.java | 5 +++ .../java/concreteextensions/Sergeant.java | 2 +- .../main/java/concreteextensions/Soldier.java | 2 +- extension-objects/src/test/java/AppTest.java | 16 +++++++++ .../concreteextensions/CommanderTest.java | 19 +++++++++++ .../java/concreteextensions/SergeantTest.java | 19 +++++++++++ .../java/concreteextensions/SoldierTest.java | 19 +++++++++++ .../test/java/units/CommanderUnitTest.java | 22 +++++++++++++ .../src/test/java/units/SergeantUnitTest.java | 22 +++++++++++++ .../src/test/java/units/SoldierUnitTest.java | 24 ++++++++++++++ .../src/test/java/units/UnitTest.java | 33 +++++++++++++++++++ 14 files changed, 192 insertions(+), 4 deletions(-) create mode 100644 extension-objects/src/test/java/AppTest.java create mode 100644 extension-objects/src/test/java/concreteextensions/CommanderTest.java create mode 100644 extension-objects/src/test/java/concreteextensions/SergeantTest.java create mode 100644 extension-objects/src/test/java/concreteextensions/SoldierTest.java create mode 100644 extension-objects/src/test/java/units/CommanderUnitTest.java create mode 100644 extension-objects/src/test/java/units/SergeantUnitTest.java create mode 100644 extension-objects/src/test/java/units/SoldierUnitTest.java create mode 100644 extension-objects/src/test/java/units/UnitTest.java diff --git a/extension-objects/pom.xml b/extension-objects/pom.xml index afdf010a2..77f6ccfa2 100644 --- a/extension-objects/pom.xml +++ b/extension-objects/pom.xml @@ -10,6 +10,12 @@ 4.0.0 extension-objects + + + junit + junit + + - \ No newline at end of file + diff --git a/extension-objects/src/main/java/App.java b/extension-objects/src/main/java/App.java index 9aa934580..af76682b8 100644 --- a/extension-objects/src/main/java/App.java +++ b/extension-objects/src/main/java/App.java @@ -38,6 +38,7 @@ public class App { SergeantExtension sergeantExtension = (SergeantExtension) unit.getUnitExtension("SergeantExtension"); CommanderExtension commanderExtension = (CommanderExtension) unit.getUnitExtension("CommanderExtension"); + //if unit have extension call the method if (soldierExtension != null) { soldierExtension.soldierReady(); } else { @@ -51,7 +52,7 @@ public class App { } if (commanderExtension != null) { - // commanderExtension.sergeantReady(); + commanderExtension.commanderReady(); } 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 index aa716a3ae..3088c9f86 100644 --- a/extension-objects/src/main/java/abstractextensions/CommanderExtension.java +++ b/extension-objects/src/main/java/abstractextensions/CommanderExtension.java @@ -4,4 +4,6 @@ package abstractextensions; * Created by Srdjan on 27-Apr-17. */ public interface CommanderExtension extends UnitExtension { + + void commanderReady(); } diff --git a/extension-objects/src/main/java/concreteextensions/Commander.java b/extension-objects/src/main/java/concreteextensions/Commander.java index 3de4d124a..3ce183afb 100644 --- a/extension-objects/src/main/java/concreteextensions/Commander.java +++ b/extension-objects/src/main/java/concreteextensions/Commander.java @@ -13,4 +13,9 @@ public class Commander implements CommanderExtension { public Commander(CommanderUnit commanderUnit) { this.unit = commanderUnit; } + + @Override + public void commanderReady() { + System.out.println("[Commander] " + unit.getName() + " is ready!"); + } } diff --git a/extension-objects/src/main/java/concreteextensions/Sergeant.java b/extension-objects/src/main/java/concreteextensions/Sergeant.java index b2d4485c3..499ea4f63 100644 --- a/extension-objects/src/main/java/concreteextensions/Sergeant.java +++ b/extension-objects/src/main/java/concreteextensions/Sergeant.java @@ -16,6 +16,6 @@ public class Sergeant implements SergeantExtension { @Override public void sergeantReady() { - System.out.println("[Sergeant] " + unit.getName() + " do command! "); + System.out.println("[Sergeant] " + unit.getName() + " is ready! "); } } diff --git a/extension-objects/src/main/java/concreteextensions/Soldier.java b/extension-objects/src/main/java/concreteextensions/Soldier.java index e2d11e244..844abd57a 100644 --- a/extension-objects/src/main/java/concreteextensions/Soldier.java +++ b/extension-objects/src/main/java/concreteextensions/Soldier.java @@ -16,6 +16,6 @@ public class Soldier implements SoldierExtension { @Override public void soldierReady() { - System.out.println("[Solider] " + unit.getName() + " do command"); + System.out.println("[Solider] " + unit.getName() + " is ready!"); } } diff --git a/extension-objects/src/test/java/AppTest.java b/extension-objects/src/test/java/AppTest.java new file mode 100644 index 000000000..88ba70da9 --- /dev/null +++ b/extension-objects/src/test/java/AppTest.java @@ -0,0 +1,16 @@ +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by Srdjan on 03-May-17. + */ +public class AppTest { + @Test + public void main() throws Exception { + + String[] args = {}; + App.main(args); + } + +} \ No newline at end of file diff --git a/extension-objects/src/test/java/concreteextensions/CommanderTest.java b/extension-objects/src/test/java/concreteextensions/CommanderTest.java new file mode 100644 index 000000000..a5ac7b506 --- /dev/null +++ b/extension-objects/src/test/java/concreteextensions/CommanderTest.java @@ -0,0 +1,19 @@ +package concreteextensions; + +import org.junit.Test; +import units.CommanderUnit; + +import static org.junit.Assert.*; + +/** + * Created by Srdjan on 03-May-17. + */ +public class CommanderTest { + @Test + public void commanderReady() throws Exception { + final Commander commander = new Commander(new CommanderUnit("CommanderUnitTest")); + + commander.commanderReady(); + } + +} \ No newline at end of file diff --git a/extension-objects/src/test/java/concreteextensions/SergeantTest.java b/extension-objects/src/test/java/concreteextensions/SergeantTest.java new file mode 100644 index 000000000..163d5c1fc --- /dev/null +++ b/extension-objects/src/test/java/concreteextensions/SergeantTest.java @@ -0,0 +1,19 @@ +package concreteextensions; + +import org.junit.Test; +import units.SergeantUnit; + +import static org.junit.Assert.*; + +/** + * Created by Srdjan on 03-May-17. + */ +public class SergeantTest { + @Test + public void sergeantReady() throws Exception { + final Sergeant sergeant = new Sergeant(new SergeantUnit("SergeantUnitTest")); + + sergeant.sergeantReady(); + } + +} \ No newline at end of file diff --git a/extension-objects/src/test/java/concreteextensions/SoldierTest.java b/extension-objects/src/test/java/concreteextensions/SoldierTest.java new file mode 100644 index 000000000..dde222d61 --- /dev/null +++ b/extension-objects/src/test/java/concreteextensions/SoldierTest.java @@ -0,0 +1,19 @@ +package concreteextensions; + +import org.junit.Test; +import units.SoldierUnit; + +import static org.junit.Assert.*; + +/** + * Created by Srdjan on 03-May-17. + */ +public class SoldierTest { + @Test + public void soldierReady() throws Exception { + final Soldier soldier = new Soldier(new SoldierUnit("SoldierUnitTest")); + + soldier.soldierReady(); + } + +} \ No newline at end of file diff --git a/extension-objects/src/test/java/units/CommanderUnitTest.java b/extension-objects/src/test/java/units/CommanderUnitTest.java new file mode 100644 index 000000000..1ec498d91 --- /dev/null +++ b/extension-objects/src/test/java/units/CommanderUnitTest.java @@ -0,0 +1,22 @@ +package units; + +import abstractextensions.CommanderExtension; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by Srdjan on 03-May-17. + */ +public class CommanderUnitTest { + @Test + public void getUnitExtension() throws Exception { + + final Unit unit = new CommanderUnit("CommanderUnitName"); + + assertNull(unit.getUnitExtension("SoldierExtension")); + assertNull(unit.getUnitExtension("SergeantExtension")); + assertNotNull((CommanderExtension)unit.getUnitExtension("CommanderExtension")); + } + +} \ No newline at end of file diff --git a/extension-objects/src/test/java/units/SergeantUnitTest.java b/extension-objects/src/test/java/units/SergeantUnitTest.java new file mode 100644 index 000000000..8fe62298c --- /dev/null +++ b/extension-objects/src/test/java/units/SergeantUnitTest.java @@ -0,0 +1,22 @@ +package units; + +import abstractextensions.SergeantExtension; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by Srdjan on 03-May-17. + */ +public class SergeantUnitTest { + @Test + public void getUnitExtension() throws Exception { + + final Unit unit = new SergeantUnit("SergeantUnitName"); + + assertNull(unit.getUnitExtension("SoldierExtension")); + assertNotNull((SergeantExtension)unit.getUnitExtension("SergeantExtension")); + assertNull(unit.getUnitExtension("CommanderExtension")); + } + +} \ No newline at end of file diff --git a/extension-objects/src/test/java/units/SoldierUnitTest.java b/extension-objects/src/test/java/units/SoldierUnitTest.java new file mode 100644 index 000000000..8d1fe5667 --- /dev/null +++ b/extension-objects/src/test/java/units/SoldierUnitTest.java @@ -0,0 +1,24 @@ +package units; + +import abstractextensions.SoldierExtension; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by Srdjan on 03-May-17. + */ +public class SoldierUnitTest { + @Test + public void getUnitExtension() throws Exception { + + final Unit unit = new SoldierUnit("SoldierUnitName"); + + assertNotNull((SoldierExtension)unit.getUnitExtension("SoldierExtension")); + assertNull(unit.getUnitExtension("SergeantExtension")); + assertNull(unit.getUnitExtension("CommanderExtension")); + + + } + +} \ No newline at end of file diff --git a/extension-objects/src/test/java/units/UnitTest.java b/extension-objects/src/test/java/units/UnitTest.java new file mode 100644 index 000000000..08fd10d8e --- /dev/null +++ b/extension-objects/src/test/java/units/UnitTest.java @@ -0,0 +1,33 @@ +package units; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by Srdjan on 03-May-17. + */ +public class UnitTest { + + private Unit unit; + + @Test + public void testConstGetSet() throws Exception { + final String name = "testName"; + final Unit unit = new Unit(name); + assertEquals(name,unit.getName()); + + final String newName = "newName"; + unit.setName(newName); + assertEquals(newName,unit.getName()); + + + assertNull(unit.getUnitExtension("")); + assertNull(unit.getUnitExtension("SoldierExtension")); + assertNull(unit.getUnitExtension("SergeantExtension")); + assertNull(unit.getUnitExtension("CommanderExtension")); + } + +} \ No newline at end of file From c92a8daeda2997222b3c02bdc6bd9986f6cd8f1e Mon Sep 17 00:00:00 2001 From: SrdjanPaunovic Date: Wed, 3 May 2017 17:59:54 +0200 Subject: [PATCH 03/10] Class diagram & fix relation between units --- extension-objects/etc/extension_obj.png | Bin 0 -> 38018 bytes extension-objects/etc/extension_obj.ucls | 180 ++++++++++++++++++ extension-objects/etc/extension_obj1.png | Bin 0 -> 14390 bytes .../src/main/java/units/CommanderUnit.java | 8 +- .../src/main/java/units/SergeantUnit.java | 8 +- .../src/main/java/units/SoldierUnit.java | 8 +- .../src/main/java/units/Unit.java | 1 + .../src/test/java/units/UnitTest.java | 2 - 8 files changed, 190 insertions(+), 17 deletions(-) create mode 100644 extension-objects/etc/extension_obj.png create mode 100644 extension-objects/etc/extension_obj.ucls create mode 100644 extension-objects/etc/extension_obj1.png diff --git a/extension-objects/etc/extension_obj.png b/extension-objects/etc/extension_obj.png new file mode 100644 index 0000000000000000000000000000000000000000..a2b750e9deddee833ccbea50b0d789390060e986 GIT binary patch literal 38018 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 T5LYt!3F3OX`njxgN@xNAEupb; literal 0 HcmV?d00001 diff --git a/extension-objects/etc/extension_obj.ucls b/extension-objects/etc/extension_obj.ucls new file mode 100644 index 000000000..9471caa83 --- /dev/null +++ b/extension-objects/etc/extension_obj.ucls @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/extension-objects/etc/extension_obj1.png b/extension-objects/etc/extension_obj1.png new file mode 100644 index 0000000000000000000000000000000000000000..e3115661f4aa51559d553c7ca27ad9da97300336 GIT binary patch literal 14390 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 Z<{Bk;ux2a Date: Wed, 3 May 2017 21:40:54 +0200 Subject: [PATCH 04/10] #541 pom.xml fix align --- extension-objects/pom.xml | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/extension-objects/pom.xml b/extension-objects/pom.xml index 77f6ccfa2..4c0b0a230 100644 --- a/extension-objects/pom.xml +++ b/extension-objects/pom.xml @@ -2,20 +2,20 @@ - - java-design-patterns - com.iluwatar - 1.16.0-SNAPSHOT - - 4.0.0 - - extension-objects - - - junit - junit - - + + java-design-patterns + com.iluwatar + 1.16.0-SNAPSHOT + + 4.0.0 + extension-objects + + + junit + junit + test + + From 08c4202852b1b1a157fa77620f0d66d343ffe9c5 Mon Sep 17 00:00:00 2001 From: SrdjanPaunovic Date: Wed, 3 May 2017 22:08:04 +0200 Subject: [PATCH 05/10] #541 fix checkstyle errors --- execute-around/pom.xml | 4 +++- extension-objects/src/main/java/units/CommanderUnit.java | 1 - extension-objects/src/main/java/units/SergeantUnit.java | 1 - extension-objects/src/main/java/units/SoldierUnit.java | 1 - extension-objects/src/test/java/AppTest.java | 2 -- .../src/test/java/concreteextensions/CommanderTest.java | 2 -- .../src/test/java/concreteextensions/SergeantTest.java | 2 -- .../src/test/java/concreteextensions/SoldierTest.java | 2 -- .../src/test/java/units/CommanderUnitTest.java | 5 +++-- .../src/test/java/units/SergeantUnitTest.java | 5 +++-- .../src/test/java/units/SoldierUnitTest.java | 5 +++-- extension-objects/src/test/java/units/UnitTest.java | 9 ++++----- 12 files changed, 16 insertions(+), 23 deletions(-) diff --git a/execute-around/pom.xml b/execute-around/pom.xml index 765b52846..59f9b3dea 100644 --- a/execute-around/pom.xml +++ b/execute-around/pom.xml @@ -23,7 +23,9 @@ THE SOFTWARE. --> - 4.0.0 diff --git a/extension-objects/src/main/java/units/CommanderUnit.java b/extension-objects/src/main/java/units/CommanderUnit.java index 836d29487..a5ed60a76 100644 --- a/extension-objects/src/main/java/units/CommanderUnit.java +++ b/extension-objects/src/main/java/units/CommanderUnit.java @@ -1,6 +1,5 @@ package units; -import abstractextensions.CommanderExtension; import abstractextensions.UnitExtension; import concreteextensions.Commander; diff --git a/extension-objects/src/main/java/units/SergeantUnit.java b/extension-objects/src/main/java/units/SergeantUnit.java index d1a477ee8..876a50db5 100644 --- a/extension-objects/src/main/java/units/SergeantUnit.java +++ b/extension-objects/src/main/java/units/SergeantUnit.java @@ -1,6 +1,5 @@ package units; -import abstractextensions.SergeantExtension; import abstractextensions.UnitExtension; import concreteextensions.Sergeant; diff --git a/extension-objects/src/main/java/units/SoldierUnit.java b/extension-objects/src/main/java/units/SoldierUnit.java index 749e3aa8d..9e566796b 100644 --- a/extension-objects/src/main/java/units/SoldierUnit.java +++ b/extension-objects/src/main/java/units/SoldierUnit.java @@ -1,6 +1,5 @@ package units; -import abstractextensions.SoldierExtension; import abstractextensions.UnitExtension; import concreteextensions.Soldier; diff --git a/extension-objects/src/test/java/AppTest.java b/extension-objects/src/test/java/AppTest.java index 88ba70da9..287ffc131 100644 --- a/extension-objects/src/test/java/AppTest.java +++ b/extension-objects/src/test/java/AppTest.java @@ -1,7 +1,5 @@ import org.junit.Test; -import static org.junit.Assert.*; - /** * Created by Srdjan on 03-May-17. */ diff --git a/extension-objects/src/test/java/concreteextensions/CommanderTest.java b/extension-objects/src/test/java/concreteextensions/CommanderTest.java index a5ac7b506..82079c69a 100644 --- a/extension-objects/src/test/java/concreteextensions/CommanderTest.java +++ b/extension-objects/src/test/java/concreteextensions/CommanderTest.java @@ -3,8 +3,6 @@ package concreteextensions; import org.junit.Test; import units.CommanderUnit; -import static org.junit.Assert.*; - /** * Created by Srdjan on 03-May-17. */ diff --git a/extension-objects/src/test/java/concreteextensions/SergeantTest.java b/extension-objects/src/test/java/concreteextensions/SergeantTest.java index 163d5c1fc..7b29057f6 100644 --- a/extension-objects/src/test/java/concreteextensions/SergeantTest.java +++ b/extension-objects/src/test/java/concreteextensions/SergeantTest.java @@ -3,8 +3,6 @@ package concreteextensions; import org.junit.Test; import units.SergeantUnit; -import static org.junit.Assert.*; - /** * Created by Srdjan on 03-May-17. */ diff --git a/extension-objects/src/test/java/concreteextensions/SoldierTest.java b/extension-objects/src/test/java/concreteextensions/SoldierTest.java index dde222d61..02a3144c2 100644 --- a/extension-objects/src/test/java/concreteextensions/SoldierTest.java +++ b/extension-objects/src/test/java/concreteextensions/SoldierTest.java @@ -3,8 +3,6 @@ package concreteextensions; import org.junit.Test; import units.SoldierUnit; -import static org.junit.Assert.*; - /** * Created by Srdjan on 03-May-17. */ diff --git a/extension-objects/src/test/java/units/CommanderUnitTest.java b/extension-objects/src/test/java/units/CommanderUnitTest.java index 1ec498d91..75bf5f4fc 100644 --- a/extension-objects/src/test/java/units/CommanderUnitTest.java +++ b/extension-objects/src/test/java/units/CommanderUnitTest.java @@ -3,7 +3,8 @@ package units; import abstractextensions.CommanderExtension; import org.junit.Test; -import static org.junit.Assert.*; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; /** * Created by Srdjan on 03-May-17. @@ -16,7 +17,7 @@ public class CommanderUnitTest { assertNull(unit.getUnitExtension("SoldierExtension")); assertNull(unit.getUnitExtension("SergeantExtension")); - assertNotNull((CommanderExtension)unit.getUnitExtension("CommanderExtension")); + assertNotNull((CommanderExtension) unit.getUnitExtension("CommanderExtension")); } } \ No newline at end of file diff --git a/extension-objects/src/test/java/units/SergeantUnitTest.java b/extension-objects/src/test/java/units/SergeantUnitTest.java index 8fe62298c..af2eca7cc 100644 --- a/extension-objects/src/test/java/units/SergeantUnitTest.java +++ b/extension-objects/src/test/java/units/SergeantUnitTest.java @@ -3,7 +3,8 @@ package units; import abstractextensions.SergeantExtension; import org.junit.Test; -import static org.junit.Assert.*; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; /** * Created by Srdjan on 03-May-17. @@ -15,7 +16,7 @@ public class SergeantUnitTest { final Unit unit = new SergeantUnit("SergeantUnitName"); assertNull(unit.getUnitExtension("SoldierExtension")); - assertNotNull((SergeantExtension)unit.getUnitExtension("SergeantExtension")); + assertNotNull((SergeantExtension) unit.getUnitExtension("SergeantExtension")); assertNull(unit.getUnitExtension("CommanderExtension")); } diff --git a/extension-objects/src/test/java/units/SoldierUnitTest.java b/extension-objects/src/test/java/units/SoldierUnitTest.java index 8d1fe5667..19b0c2923 100644 --- a/extension-objects/src/test/java/units/SoldierUnitTest.java +++ b/extension-objects/src/test/java/units/SoldierUnitTest.java @@ -3,7 +3,8 @@ package units; import abstractextensions.SoldierExtension; import org.junit.Test; -import static org.junit.Assert.*; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; /** * Created by Srdjan on 03-May-17. @@ -14,7 +15,7 @@ public class SoldierUnitTest { final Unit unit = new SoldierUnit("SoldierUnitName"); - assertNotNull((SoldierExtension)unit.getUnitExtension("SoldierExtension")); + assertNotNull((SoldierExtension) unit.getUnitExtension("SoldierExtension")); assertNull(unit.getUnitExtension("SergeantExtension")); assertNull(unit.getUnitExtension("CommanderExtension")); diff --git a/extension-objects/src/test/java/units/UnitTest.java b/extension-objects/src/test/java/units/UnitTest.java index 42cb1037f..773b485ce 100644 --- a/extension-objects/src/test/java/units/UnitTest.java +++ b/extension-objects/src/test/java/units/UnitTest.java @@ -1,10 +1,9 @@ package units; -import org.junit.After; -import org.junit.Before; import org.junit.Test; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; /** * Created by Srdjan on 03-May-17. @@ -15,11 +14,11 @@ public class UnitTest { public void testConstGetSet() throws Exception { final String name = "testName"; final Unit unit = new Unit(name); - assertEquals(name,unit.getName()); + assertEquals(name, unit.getName()); final String newName = "newName"; unit.setName(newName); - assertEquals(newName,unit.getName()); + assertEquals(newName, unit.getName()); assertNull(unit.getUnitExtension("")); From 6857486f27c356da8c7770c27cc5ea5013bde011 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sr=C4=91an=20Paunovi=C4=87?= Date: Thu, 4 May 2017 12:33:25 +0200 Subject: [PATCH 06/10] #541 Create README.md file --- extension-objects/README.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 extension-objects/README.md diff --git a/extension-objects/README.md b/extension-objects/README.md new file mode 100644 index 000000000..e345952ed --- /dev/null +++ b/extension-objects/README.md @@ -0,0 +1,28 @@ +--- +layout: pattern +title: Extension objects +folder: extension-objects +permalink: /patterns/extension-objects/ +categories: Behavioral +tags: + - Java + - Difficulty-Intermediate +--- + +## Intent +Anticipate that an object’s interface needs to be extended in the future. Additional +interfaces are defined by extension objects. + +![alt text](./etc/extension_obj1.png "Extension objects") + +## Applicability +Use the Extension Objects pattern when: + +* you need to support the addition of new or unforeseen interfaces to existing classes and you don't want to impact clients that don't need this new interface. Extension Objects lets you keep related operations together by defining them in a separate class +* a class representing a key abstraction plays different roles for different clients. The number of roles the class can play should be open-ended. There is a need to preserve the key abstraction itself. For example, a customer object is still a customer object even if different subsystems view it differently. +* a class should be extensible with new behavior without subclassing from it. + +## Real world examples + +* [OpenDoc](https://en.wikipedia.org/wiki/OpenDoc) +* [Object Linking and Embedding](https://en.wikipedia.org/wiki/Object_Linking_and_Embedding) From 22a7c15accaa18b9c077a0ab756ab773dfb70629 Mon Sep 17 00:00:00 2001 From: SrdjanPaunovic Date: Fri, 2 Jun 2017 21:42:59 +0200 Subject: [PATCH 07/10] Reset execute-around/pom.xml from master --- execute-around/pom.xml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/execute-around/pom.xml b/execute-around/pom.xml index 59f9b3dea..765b52846 100644 --- a/execute-around/pom.xml +++ b/execute-around/pom.xml @@ -23,9 +23,7 @@ THE SOFTWARE. --> - 4.0.0 From 85acb1cf6c016238235f6890866123a5c6c4f42d Mon Sep 17 00:00:00 2001 From: SrdjanPaunovic Date: Sun, 4 Jun 2017 20:49:15 +0200 Subject: [PATCH 08/10] Replase system.println with logger --- extension-objects/etc/extension_obj1.png | Bin 14390 -> 0 bytes extension-objects/src/main/java/App.java | 23 +++++++++--------- .../java/concreteextensions/Commander.java | 6 ++++- .../java/concreteextensions/Sergeant.java | 6 ++++- .../main/java/concreteextensions/Soldier.java | 6 ++++- 5 files changed, 27 insertions(+), 14 deletions(-) delete mode 100644 extension-objects/etc/extension_obj1.png diff --git a/extension-objects/etc/extension_obj1.png b/extension-objects/etc/extension_obj1.png deleted file mode 100644 index e3115661f4aa51559d553c7ca27ad9da97300336..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14390 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 Z<{Bk;ux2a Date: Sun, 4 Jun 2017 21:09:17 +0200 Subject: [PATCH 09/10] Create meaningful JavaDocs instead of author names --- extension-objects/src/main/java/App.java | 3 ++- .../src/main/java/abstractextensions/CommanderExtension.java | 2 +- .../src/main/java/abstractextensions/SergeantExtension.java | 2 +- .../src/main/java/abstractextensions/SoldierExtension.java | 2 +- .../src/main/java/abstractextensions/UnitExtension.java | 2 +- .../src/main/java/concreteextensions/Commander.java | 2 +- .../src/main/java/concreteextensions/Sergeant.java | 2 +- .../src/main/java/concreteextensions/Soldier.java | 2 +- extension-objects/src/main/java/units/CommanderUnit.java | 2 +- extension-objects/src/main/java/units/SergeantUnit.java | 2 +- extension-objects/src/main/java/units/SoldierUnit.java | 2 +- extension-objects/src/main/java/units/Unit.java | 2 +- 12 files changed, 13 insertions(+), 12 deletions(-) diff --git a/extension-objects/src/main/java/App.java b/extension-objects/src/main/java/App.java index 6163f0ca2..91ee129ee 100644 --- a/extension-objects/src/main/java/App.java +++ b/extension-objects/src/main/java/App.java @@ -9,7 +9,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** - * Created by Srdjan on 26-Apr-17. + * Anticipate that an object’s interface needs to be extended in the future. + * Additional interfaces are defined by extension objects. */ public class App { diff --git a/extension-objects/src/main/java/abstractextensions/CommanderExtension.java b/extension-objects/src/main/java/abstractextensions/CommanderExtension.java index 3088c9f86..7f8b3ef25 100644 --- a/extension-objects/src/main/java/abstractextensions/CommanderExtension.java +++ b/extension-objects/src/main/java/abstractextensions/CommanderExtension.java @@ -1,7 +1,7 @@ package abstractextensions; /** - * Created by Srdjan on 27-Apr-17. + * Interface with their method */ 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 index dc7bbdc70..953d15fc0 100644 --- a/extension-objects/src/main/java/abstractextensions/SergeantExtension.java +++ b/extension-objects/src/main/java/abstractextensions/SergeantExtension.java @@ -1,7 +1,7 @@ package abstractextensions; /** - * Created by Srdjan on 27-Apr-17. + * Interface with their method */ public interface SergeantExtension extends UnitExtension { diff --git a/extension-objects/src/main/java/abstractextensions/SoldierExtension.java b/extension-objects/src/main/java/abstractextensions/SoldierExtension.java index 1715811f8..9d995bc0e 100644 --- a/extension-objects/src/main/java/abstractextensions/SoldierExtension.java +++ b/extension-objects/src/main/java/abstractextensions/SoldierExtension.java @@ -1,7 +1,7 @@ package abstractextensions; /** - * Created by Srdjan on 26-Apr-17. + * Interface with their method */ 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 index 03c58d181..073f49a48 100644 --- a/extension-objects/src/main/java/abstractextensions/UnitExtension.java +++ b/extension-objects/src/main/java/abstractextensions/UnitExtension.java @@ -1,7 +1,7 @@ package abstractextensions; /** - * Created by Srdjan on 26-Apr-17. + * Other Extensions will extend this interface */ public interface UnitExtension { } diff --git a/extension-objects/src/main/java/concreteextensions/Commander.java b/extension-objects/src/main/java/concreteextensions/Commander.java index 89720000a..a18f5412e 100644 --- a/extension-objects/src/main/java/concreteextensions/Commander.java +++ b/extension-objects/src/main/java/concreteextensions/Commander.java @@ -6,7 +6,7 @@ import org.slf4j.LoggerFactory; import units.CommanderUnit; /** - * Created by Srdjan on 27-Apr-17. + * Class defining Commander */ public class Commander implements CommanderExtension { diff --git a/extension-objects/src/main/java/concreteextensions/Sergeant.java b/extension-objects/src/main/java/concreteextensions/Sergeant.java index 13b641089..0f92a2170 100644 --- a/extension-objects/src/main/java/concreteextensions/Sergeant.java +++ b/extension-objects/src/main/java/concreteextensions/Sergeant.java @@ -6,7 +6,7 @@ import org.slf4j.LoggerFactory; import units.SergeantUnit; /** - * Created by Srdjan on 27-Apr-17. + * Class defining Sergeant */ public class Sergeant implements SergeantExtension { diff --git a/extension-objects/src/main/java/concreteextensions/Soldier.java b/extension-objects/src/main/java/concreteextensions/Soldier.java index 630fa1a97..790e78fb2 100644 --- a/extension-objects/src/main/java/concreteextensions/Soldier.java +++ b/extension-objects/src/main/java/concreteextensions/Soldier.java @@ -6,7 +6,7 @@ import org.slf4j.LoggerFactory; import units.SoldierUnit; /** - * Created by Srdjan on 26-Apr-17. + * Class defining Soldier */ public class Soldier implements SoldierExtension { diff --git a/extension-objects/src/main/java/units/CommanderUnit.java b/extension-objects/src/main/java/units/CommanderUnit.java index a5ed60a76..06ad6e127 100644 --- a/extension-objects/src/main/java/units/CommanderUnit.java +++ b/extension-objects/src/main/java/units/CommanderUnit.java @@ -4,7 +4,7 @@ import abstractextensions.UnitExtension; import concreteextensions.Commander; /** - * Created by Srdjan on 27-Apr-17. + * Class defining CommanderUnit */ public class CommanderUnit extends Unit { diff --git a/extension-objects/src/main/java/units/SergeantUnit.java b/extension-objects/src/main/java/units/SergeantUnit.java index 876a50db5..a84631b12 100644 --- a/extension-objects/src/main/java/units/SergeantUnit.java +++ b/extension-objects/src/main/java/units/SergeantUnit.java @@ -4,7 +4,7 @@ import abstractextensions.UnitExtension; import concreteextensions.Sergeant; /** - * Created by Srdjan on 27-Apr-17. + * Class defining SergeantUnit */ public class SergeantUnit extends Unit { diff --git a/extension-objects/src/main/java/units/SoldierUnit.java b/extension-objects/src/main/java/units/SoldierUnit.java index 9e566796b..957f68b86 100644 --- a/extension-objects/src/main/java/units/SoldierUnit.java +++ b/extension-objects/src/main/java/units/SoldierUnit.java @@ -4,7 +4,7 @@ import abstractextensions.UnitExtension; import concreteextensions.Soldier; /** - * Created by Srdjan on 26-Apr-17. + * Class defining SoldierUnit */ public class SoldierUnit extends Unit { diff --git a/extension-objects/src/main/java/units/Unit.java b/extension-objects/src/main/java/units/Unit.java index d6901ec75..411a3e3ff 100644 --- a/extension-objects/src/main/java/units/Unit.java +++ b/extension-objects/src/main/java/units/Unit.java @@ -3,7 +3,7 @@ package units; import abstractextensions.UnitExtension; /** - * Created by Srdjan on 26-Apr-17. + * Class defining Unit, other units will extend this class */ public class Unit { From a0916aab6c055d38ec2622cfd5fcf7d87fc8966b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sr=C4=91an=20Paunovi=C4=87?= Date: Sun, 4 Jun 2017 21:12:30 +0200 Subject: [PATCH 10/10] Update README.md --- extension-objects/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extension-objects/README.md b/extension-objects/README.md index e345952ed..9b5c93a22 100644 --- a/extension-objects/README.md +++ b/extension-objects/README.md @@ -13,7 +13,7 @@ tags: Anticipate that an object’s interface needs to be extended in the future. Additional interfaces are defined by extension objects. -![alt text](./etc/extension_obj1.png "Extension objects") +![Extension_objects](./etc/extension_obj.png "Extension objects") ## Applicability Use the Extension Objects pattern when: