From fb890e80ddfd8ac5f4f8be4e84140b2eb1f61015 Mon Sep 17 00:00:00 2001 From: Vladislav Golubinov Date: Thu, 3 Sep 2020 20:02:52 +0300 Subject: [PATCH 01/36] refactor --- .../com/iluwatar/abstractfactory/App.java | 12 ----------- .../abstractfactory/AbstractFactoryTest.java | 21 +++++++++++++------ 2 files changed, 15 insertions(+), 18 deletions(-) diff --git a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java index e158ece74..21b4af305 100644 --- a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java +++ b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java @@ -58,10 +58,6 @@ public class App { setArmy(factory.createArmy()); } - King getKing(final KingdomFactory factory) { - return factory.createKing(); - } - public King getKing() { return king; } @@ -70,10 +66,6 @@ public class App { this.king = king; } - Castle getCastle(final KingdomFactory factory) { - return factory.createCastle(); - } - public Castle getCastle() { return castle; } @@ -82,10 +74,6 @@ public class App { this.castle = castle; } - Army getArmy(final KingdomFactory factory) { - return factory.createArmy(); - } - public Army getArmy() { return army; } diff --git a/abstract-factory/src/test/java/com/iluwatar/abstractfactory/AbstractFactoryTest.java b/abstract-factory/src/test/java/com/iluwatar/abstractfactory/AbstractFactoryTest.java index f3db525a1..1506844cf 100644 --- a/abstract-factory/src/test/java/com/iluwatar/abstractfactory/AbstractFactoryTest.java +++ b/abstract-factory/src/test/java/com/iluwatar/abstractfactory/AbstractFactoryTest.java @@ -48,30 +48,39 @@ public class AbstractFactoryTest { @Test public void king() { - final var elfKing = app.getKing(elfFactory); + app.createKingdom(elfFactory); + final var elfKing = app.getKing(); assertTrue(elfKing instanceof ElfKing); assertEquals(ElfKing.DESCRIPTION, elfKing.getDescription()); - final var orcKing = app.getKing(orcFactory); + + app.createKingdom(orcFactory); + final var orcKing = app.getKing(); assertTrue(orcKing instanceof OrcKing); assertEquals(OrcKing.DESCRIPTION, orcKing.getDescription()); } @Test public void castle() { - final var elfCastle = app.getCastle(elfFactory); + app.createKingdom(elfFactory); + final var elfCastle = app.getCastle(); assertTrue(elfCastle instanceof ElfCastle); assertEquals(ElfCastle.DESCRIPTION, elfCastle.getDescription()); - final var orcCastle = app.getCastle(orcFactory); + + app.createKingdom(orcFactory); + final var orcCastle = app.getCastle(); assertTrue(orcCastle instanceof OrcCastle); assertEquals(OrcCastle.DESCRIPTION, orcCastle.getDescription()); } @Test public void army() { - final var elfArmy = app.getArmy(elfFactory); + app.createKingdom(elfFactory); + final var elfArmy = app.getArmy(); assertTrue(elfArmy instanceof ElfArmy); assertEquals(ElfArmy.DESCRIPTION, elfArmy.getDescription()); - final var orcArmy = app.getArmy(orcFactory); + + app.createKingdom(orcFactory); + final var orcArmy = app.getArmy(); assertTrue(orcArmy instanceof OrcArmy); assertEquals(OrcArmy.DESCRIPTION, orcArmy.getDescription()); } From e89042a782b55202c1945e445df4f73d2a09a2b4 Mon Sep 17 00:00:00 2001 From: Vladislav Golubinov Date: Thu, 3 Sep 2020 20:04:29 +0300 Subject: [PATCH 02/36] remove boilerplate code --- abstract-factory/pom.xml | 5 ++ .../com/iluwatar/abstractfactory/App.java | 54 +++++++------------ 2 files changed, 25 insertions(+), 34 deletions(-) diff --git a/abstract-factory/pom.xml b/abstract-factory/pom.xml index 2328c60a8..e10a9436f 100644 --- a/abstract-factory/pom.xml +++ b/abstract-factory/pom.xml @@ -31,6 +31,11 @@ junit-jupiter-engine test + + org.projectlombok + lombok + 1.18.12 + diff --git a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java index 21b4af305..6cdaf865f 100644 --- a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java +++ b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java @@ -24,6 +24,9 @@ package com.iluwatar.abstractfactory; import com.iluwatar.abstractfactory.App.FactoryMaker.KingdomType; +import lombok.Getter; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -41,12 +44,19 @@ import org.slf4j.LoggerFactory; * and its implementations ( {@link ElfKingdomFactory}, {@link OrcKingdomFactory}). The example uses * both concrete implementations to create a king, a castle and an army. */ +@Slf4j public class App { - private static final Logger LOGGER = LoggerFactory.getLogger(App.class); - + @Setter + @Getter private King king; + + @Setter + @Getter private Castle castle; + + @Setter + @Getter private Army army; /** @@ -58,30 +68,6 @@ public class App { setArmy(factory.createArmy()); } - public King getKing() { - return king; - } - - private void setKing(final King king) { - this.king = king; - } - - public Castle getCastle() { - return castle; - } - - private void setCastle(final Castle castle) { - this.castle = castle; - } - - public Army getArmy() { - return army; - } - - private void setArmy(final Army army) { - this.army = army; - } - /** * The factory of kingdom factories. */ @@ -118,16 +104,16 @@ public class App { var app = new App(); - LOGGER.info("Elf Kingdom"); + log.info("Elf Kingdom"); app.createKingdom(FactoryMaker.makeFactory(KingdomType.ELF)); - LOGGER.info(app.getArmy().getDescription()); - LOGGER.info(app.getCastle().getDescription()); - LOGGER.info(app.getKing().getDescription()); + log.info(app.getArmy().getDescription()); + log.info(app.getCastle().getDescription()); + log.info(app.getKing().getDescription()); - LOGGER.info("Orc Kingdom"); + log.info("Orc Kingdom"); app.createKingdom(FactoryMaker.makeFactory(KingdomType.ORC)); - LOGGER.info(app.getArmy().getDescription()); - LOGGER.info(app.getCastle().getDescription()); - LOGGER.info(app.getKing().getDescription()); + log.info(app.getArmy().getDescription()); + log.info(app.getCastle().getDescription()); + log.info(app.getKing().getDescription()); } } \ No newline at end of file From bd48d6ce1046c51aaf93ee48f4887ba4b04e89fd Mon Sep 17 00:00:00 2001 From: Vladislav Golubinov Date: Fri, 4 Sep 2020 17:31:50 +0300 Subject: [PATCH 03/36] refactor --- .../com/iluwatar/abstractfactory/App.java | 82 +++++-------------- .../com/iluwatar/abstractfactory/Kingdom.java | 38 +++++++++ .../abstractfactory/AbstractFactoryTest.java | 47 ++++++----- 3 files changed, 88 insertions(+), 79 deletions(-) create mode 100644 abstract-factory/src/main/java/com/iluwatar/abstractfactory/Kingdom.java diff --git a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java index 6cdaf865f..71af19b37 100644 --- a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java +++ b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java @@ -23,12 +23,8 @@ package com.iluwatar.abstractfactory; -import com.iluwatar.abstractfactory.App.FactoryMaker.KingdomType; import lombok.Getter; -import lombok.Setter; import lombok.extern.slf4j.Slf4j; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * The Abstract Factory pattern provides a way to encapsulate a group of individual factories that @@ -45,55 +41,10 @@ import org.slf4j.LoggerFactory; * both concrete implementations to create a king, a castle and an army. */ @Slf4j -public class App { +public class App implements Runnable { - @Setter @Getter - private King king; - - @Setter - @Getter - private Castle castle; - - @Setter - @Getter - private Army army; - - /** - * Creates kingdom. - */ - public void createKingdom(final KingdomFactory factory) { - setKing(factory.createKing()); - setCastle(factory.createCastle()); - setArmy(factory.createArmy()); - } - - /** - * The factory of kingdom factories. - */ - public static class FactoryMaker { - - /** - * Enumeration for the different types of Kingdoms. - */ - public enum KingdomType { - ELF, ORC - } - - /** - * The factory method to create KingdomFactory concrete objects. - */ - public static KingdomFactory makeFactory(KingdomType type) { - switch (type) { - case ELF: - return new ElfKingdomFactory(); - case ORC: - return new OrcKingdomFactory(); - default: - throw new IllegalArgumentException("KingdomType not supported."); - } - } - } + private final Kingdom kingdom = new Kingdom(); /** * Program entry point. @@ -101,19 +52,30 @@ public class App { * @param args command line args */ public static void main(String[] args) { - var app = new App(); + } + @Override + public void run() { log.info("Elf Kingdom"); - app.createKingdom(FactoryMaker.makeFactory(KingdomType.ELF)); - log.info(app.getArmy().getDescription()); - log.info(app.getCastle().getDescription()); - log.info(app.getKing().getDescription()); + createKingdom(Kingdom.FactoryMaker.makeFactory(Kingdom.FactoryMaker.KingdomType.ELF)); + log.info(kingdom.getArmy().getDescription()); + log.info(kingdom.getCastle().getDescription()); + log.info(kingdom.getKing().getDescription()); log.info("Orc Kingdom"); - app.createKingdom(FactoryMaker.makeFactory(KingdomType.ORC)); - log.info(app.getArmy().getDescription()); - log.info(app.getCastle().getDescription()); - log.info(app.getKing().getDescription()); + createKingdom(Kingdom.FactoryMaker.makeFactory(Kingdom.FactoryMaker.KingdomType.ORC)); + log.info(kingdom.getArmy().getDescription()); + log.info(kingdom.getCastle().getDescription()); + log.info(kingdom.getKing().getDescription()); + } + + /** + * Creates kingdom. + */ + public void createKingdom(final KingdomFactory factory) { + kingdom.setKing(factory.createKing()); + kingdom.setCastle(factory.createCastle()); + kingdom.setArmy(factory.createArmy()); } } \ No newline at end of file diff --git a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/Kingdom.java b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/Kingdom.java new file mode 100644 index 000000000..6e24005ab --- /dev/null +++ b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/Kingdom.java @@ -0,0 +1,38 @@ +package com.iluwatar.abstractfactory; + +import lombok.Data; + +@Data +public class Kingdom { + + private King king; + private Castle castle; + private Army army; + + /** + * The factory of kingdom factories. + */ + public static class FactoryMaker { + + /** + * Enumeration for the different types of Kingdoms. + */ + public enum KingdomType { + ELF, ORC + } + + /** + * The factory method to create KingdomFactory concrete objects. + */ + public static KingdomFactory makeFactory(KingdomType type) { + switch (type) { + case ELF: + return new ElfKingdomFactory(); + case ORC: + return new OrcKingdomFactory(); + default: + throw new IllegalArgumentException("KingdomType not supported."); + } + } + } +} diff --git a/abstract-factory/src/test/java/com/iluwatar/abstractfactory/AbstractFactoryTest.java b/abstract-factory/src/test/java/com/iluwatar/abstractfactory/AbstractFactoryTest.java index 1506844cf..db6fd04ee 100644 --- a/abstract-factory/src/test/java/com/iluwatar/abstractfactory/AbstractFactoryTest.java +++ b/abstract-factory/src/test/java/com/iluwatar/abstractfactory/AbstractFactoryTest.java @@ -23,14 +23,13 @@ package com.iluwatar.abstractfactory; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -import com.iluwatar.abstractfactory.App.FactoryMaker; -import com.iluwatar.abstractfactory.App.FactoryMaker.KingdomType; +import lombok.val; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + /** * Test for abstract factory. */ @@ -42,19 +41,21 @@ public class AbstractFactoryTest { @BeforeEach public void setUp() { - elfFactory = FactoryMaker.makeFactory(KingdomType.ELF); - orcFactory = FactoryMaker.makeFactory(KingdomType.ORC); + elfFactory = Kingdom.FactoryMaker.makeFactory(Kingdom.FactoryMaker.KingdomType.ELF); + orcFactory = Kingdom.FactoryMaker.makeFactory(Kingdom.FactoryMaker.KingdomType.ORC); } @Test public void king() { app.createKingdom(elfFactory); - final var elfKing = app.getKing(); + val kingdom = app.getKingdom(); + + val elfKing = kingdom.getKing(); assertTrue(elfKing instanceof ElfKing); assertEquals(ElfKing.DESCRIPTION, elfKing.getDescription()); app.createKingdom(orcFactory); - final var orcKing = app.getKing(); + val orcKing = kingdom.getKing(); assertTrue(orcKing instanceof OrcKing); assertEquals(OrcKing.DESCRIPTION, orcKing.getDescription()); } @@ -62,12 +63,14 @@ public class AbstractFactoryTest { @Test public void castle() { app.createKingdom(elfFactory); - final var elfCastle = app.getCastle(); + val kingdom = app.getKingdom(); + + val elfCastle = kingdom.getCastle(); assertTrue(elfCastle instanceof ElfCastle); assertEquals(ElfCastle.DESCRIPTION, elfCastle.getDescription()); app.createKingdom(orcFactory); - final var orcCastle = app.getCastle(); + val orcCastle = kingdom.getCastle(); assertTrue(orcCastle instanceof OrcCastle); assertEquals(OrcCastle.DESCRIPTION, orcCastle.getDescription()); } @@ -75,12 +78,14 @@ public class AbstractFactoryTest { @Test public void army() { app.createKingdom(elfFactory); - final var elfArmy = app.getArmy(); + val kingdom = app.getKingdom(); + + val elfArmy = kingdom.getArmy(); assertTrue(elfArmy instanceof ElfArmy); assertEquals(ElfArmy.DESCRIPTION, elfArmy.getDescription()); app.createKingdom(orcFactory); - final var orcArmy = app.getArmy(); + val orcArmy = kingdom.getArmy(); assertTrue(orcArmy instanceof OrcArmy); assertEquals(OrcArmy.DESCRIPTION, orcArmy.getDescription()); } @@ -88,9 +93,11 @@ public class AbstractFactoryTest { @Test public void createElfKingdom() { app.createKingdom(elfFactory); - final var king = app.getKing(); - final var castle = app.getCastle(); - final var army = app.getArmy(); + val kingdom = app.getKingdom(); + + val king = kingdom.getKing(); + val castle = kingdom.getCastle(); + val army = kingdom.getArmy(); assertTrue(king instanceof ElfKing); assertEquals(ElfKing.DESCRIPTION, king.getDescription()); assertTrue(castle instanceof ElfCastle); @@ -102,9 +109,11 @@ public class AbstractFactoryTest { @Test public void createOrcKingdom() { app.createKingdom(orcFactory); - final var king = app.getKing(); - final var castle = app.getCastle(); - final var army = app.getArmy(); + val kingdom = app.getKingdom(); + + val king = kingdom.getKing(); + val castle = kingdom.getCastle(); + val army = kingdom.getArmy(); assertTrue(king instanceof OrcKing); assertEquals(OrcKing.DESCRIPTION, king.getDescription()); assertTrue(castle instanceof OrcCastle); From 2e36a11e24b09f43c0a6983f29191596d50c18e9 Mon Sep 17 00:00:00 2001 From: Vladislav Golubinov Date: Sun, 6 Sep 2020 11:42:39 +0300 Subject: [PATCH 04/36] remove lombok, related to #1503 --- abstract-factory/pom.xml | 5 --- .../com/iluwatar/abstractfactory/App.java | 14 +++++--- .../com/iluwatar/abstractfactory/Kingdom.java | 27 ++++++++++++-- .../abstractfactory/AbstractFactoryTest.java | 35 +++++++++---------- 4 files changed, 51 insertions(+), 30 deletions(-) diff --git a/abstract-factory/pom.xml b/abstract-factory/pom.xml index e10a9436f..2328c60a8 100644 --- a/abstract-factory/pom.xml +++ b/abstract-factory/pom.xml @@ -31,11 +31,6 @@ junit-jupiter-engine test - - org.projectlombok - lombok - 1.18.12 - diff --git a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java index 71af19b37..bebf5c894 100644 --- a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java +++ b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java @@ -23,8 +23,10 @@ package com.iluwatar.abstractfactory; -import lombok.Getter; -import lombok.extern.slf4j.Slf4j; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; /** * The Abstract Factory pattern provides a way to encapsulate a group of individual factories that @@ -40,12 +42,16 @@ import lombok.extern.slf4j.Slf4j; * and its implementations ( {@link ElfKingdomFactory}, {@link OrcKingdomFactory}). The example uses * both concrete implementations to create a king, a castle and an army. */ -@Slf4j public class App implements Runnable { - @Getter + private static Logger log = LoggerFactory.getLogger(App.class); + private final Kingdom kingdom = new Kingdom(); + public Kingdom getKingdom() { + return kingdom; + } + /** * Program entry point. * diff --git a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/Kingdom.java b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/Kingdom.java index 6e24005ab..82fa0b368 100644 --- a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/Kingdom.java +++ b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/Kingdom.java @@ -1,14 +1,35 @@ package com.iluwatar.abstractfactory; -import lombok.Data; - -@Data public class Kingdom { private King king; private Castle castle; private Army army; + public King getKing() { + return king; + } + + public Castle getCastle() { + return castle; + } + + public Army getArmy() { + return army; + } + + public void setKing(King king) { + this.king = king; + } + + public void setCastle(Castle castle) { + this.castle = castle; + } + + public void setArmy(Army army) { + this.army = army; + } + /** * The factory of kingdom factories. */ diff --git a/abstract-factory/src/test/java/com/iluwatar/abstractfactory/AbstractFactoryTest.java b/abstract-factory/src/test/java/com/iluwatar/abstractfactory/AbstractFactoryTest.java index db6fd04ee..54c3b68f1 100644 --- a/abstract-factory/src/test/java/com/iluwatar/abstractfactory/AbstractFactoryTest.java +++ b/abstract-factory/src/test/java/com/iluwatar/abstractfactory/AbstractFactoryTest.java @@ -23,7 +23,6 @@ package com.iluwatar.abstractfactory; -import lombok.val; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -48,14 +47,14 @@ public class AbstractFactoryTest { @Test public void king() { app.createKingdom(elfFactory); - val kingdom = app.getKingdom(); + final var kingdom = app.getKingdom(); - val elfKing = kingdom.getKing(); + final var elfKing = kingdom.getKing(); assertTrue(elfKing instanceof ElfKing); assertEquals(ElfKing.DESCRIPTION, elfKing.getDescription()); app.createKingdom(orcFactory); - val orcKing = kingdom.getKing(); + final var orcKing = kingdom.getKing(); assertTrue(orcKing instanceof OrcKing); assertEquals(OrcKing.DESCRIPTION, orcKing.getDescription()); } @@ -63,14 +62,14 @@ public class AbstractFactoryTest { @Test public void castle() { app.createKingdom(elfFactory); - val kingdom = app.getKingdom(); + final var kingdom = app.getKingdom(); - val elfCastle = kingdom.getCastle(); + final var elfCastle = kingdom.getCastle(); assertTrue(elfCastle instanceof ElfCastle); assertEquals(ElfCastle.DESCRIPTION, elfCastle.getDescription()); app.createKingdom(orcFactory); - val orcCastle = kingdom.getCastle(); + final var orcCastle = kingdom.getCastle(); assertTrue(orcCastle instanceof OrcCastle); assertEquals(OrcCastle.DESCRIPTION, orcCastle.getDescription()); } @@ -78,14 +77,14 @@ public class AbstractFactoryTest { @Test public void army() { app.createKingdom(elfFactory); - val kingdom = app.getKingdom(); + final var kingdom = app.getKingdom(); - val elfArmy = kingdom.getArmy(); + final var elfArmy = kingdom.getArmy(); assertTrue(elfArmy instanceof ElfArmy); assertEquals(ElfArmy.DESCRIPTION, elfArmy.getDescription()); app.createKingdom(orcFactory); - val orcArmy = kingdom.getArmy(); + final var orcArmy = kingdom.getArmy(); assertTrue(orcArmy instanceof OrcArmy); assertEquals(OrcArmy.DESCRIPTION, orcArmy.getDescription()); } @@ -93,11 +92,11 @@ public class AbstractFactoryTest { @Test public void createElfKingdom() { app.createKingdom(elfFactory); - val kingdom = app.getKingdom(); + final var kingdom = app.getKingdom(); - val king = kingdom.getKing(); - val castle = kingdom.getCastle(); - val army = kingdom.getArmy(); + final var king = kingdom.getKing(); + final var castle = kingdom.getCastle(); + final var army = kingdom.getArmy(); assertTrue(king instanceof ElfKing); assertEquals(ElfKing.DESCRIPTION, king.getDescription()); assertTrue(castle instanceof ElfCastle); @@ -109,11 +108,11 @@ public class AbstractFactoryTest { @Test public void createOrcKingdom() { app.createKingdom(orcFactory); - val kingdom = app.getKingdom(); + final var kingdom = app.getKingdom(); - val king = kingdom.getKing(); - val castle = kingdom.getCastle(); - val army = kingdom.getArmy(); + final var king = kingdom.getKing(); + final var castle = kingdom.getCastle(); + final var army = kingdom.getArmy(); assertTrue(king instanceof OrcKing); assertEquals(OrcKing.DESCRIPTION, king.getDescription()); assertTrue(castle instanceof OrcCastle); From 87cf6b791cefcba99a5894141078464d2805c870 Mon Sep 17 00:00:00 2001 From: Vladislav Golubinov Date: Sun, 6 Sep 2020 11:48:40 +0300 Subject: [PATCH 05/36] refactor --- .../com/iluwatar/abstractfactory/App.java | 16 ++++++------ .../abstractfactory/AbstractFactoryTest.java | 25 ++++++------------- 2 files changed, 16 insertions(+), 25 deletions(-) diff --git a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java index bebf5c894..05aa8d118 100644 --- a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java +++ b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java @@ -26,8 +26,6 @@ package com.iluwatar.abstractfactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.List; - /** * The Abstract Factory pattern provides a way to encapsulate a group of individual factories that * have a common theme without specifying their concrete classes. In normal usage, the client @@ -64,13 +62,13 @@ public class App implements Runnable { @Override public void run() { log.info("Elf Kingdom"); - createKingdom(Kingdom.FactoryMaker.makeFactory(Kingdom.FactoryMaker.KingdomType.ELF)); + createKingdom(Kingdom.FactoryMaker.KingdomType.ELF); log.info(kingdom.getArmy().getDescription()); log.info(kingdom.getCastle().getDescription()); log.info(kingdom.getKing().getDescription()); log.info("Orc Kingdom"); - createKingdom(Kingdom.FactoryMaker.makeFactory(Kingdom.FactoryMaker.KingdomType.ORC)); + createKingdom(Kingdom.FactoryMaker.KingdomType.ORC); log.info(kingdom.getArmy().getDescription()); log.info(kingdom.getCastle().getDescription()); log.info(kingdom.getKing().getDescription()); @@ -78,10 +76,12 @@ public class App implements Runnable { /** * Creates kingdom. + * @param kingdomType */ - public void createKingdom(final KingdomFactory factory) { - kingdom.setKing(factory.createKing()); - kingdom.setCastle(factory.createCastle()); - kingdom.setArmy(factory.createArmy()); + public void createKingdom(final Kingdom.FactoryMaker.KingdomType kingdomType) { + final KingdomFactory kingdomFactory = Kingdom.FactoryMaker.makeFactory(kingdomType); + kingdom.setKing(kingdomFactory.createKing()); + kingdom.setCastle(kingdomFactory.createCastle()); + kingdom.setArmy(kingdomFactory.createArmy()); } } \ No newline at end of file diff --git a/abstract-factory/src/test/java/com/iluwatar/abstractfactory/AbstractFactoryTest.java b/abstract-factory/src/test/java/com/iluwatar/abstractfactory/AbstractFactoryTest.java index 54c3b68f1..17c09be88 100644 --- a/abstract-factory/src/test/java/com/iluwatar/abstractfactory/AbstractFactoryTest.java +++ b/abstract-factory/src/test/java/com/iluwatar/abstractfactory/AbstractFactoryTest.java @@ -23,7 +23,6 @@ package com.iluwatar.abstractfactory; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -35,25 +34,17 @@ import static org.junit.jupiter.api.Assertions.assertTrue; public class AbstractFactoryTest { private final App app = new App(); - private KingdomFactory elfFactory; - private KingdomFactory orcFactory; - - @BeforeEach - public void setUp() { - elfFactory = Kingdom.FactoryMaker.makeFactory(Kingdom.FactoryMaker.KingdomType.ELF); - orcFactory = Kingdom.FactoryMaker.makeFactory(Kingdom.FactoryMaker.KingdomType.ORC); - } @Test public void king() { - app.createKingdom(elfFactory); + app.createKingdom(Kingdom.FactoryMaker.KingdomType.ELF); final var kingdom = app.getKingdom(); final var elfKing = kingdom.getKing(); assertTrue(elfKing instanceof ElfKing); assertEquals(ElfKing.DESCRIPTION, elfKing.getDescription()); - app.createKingdom(orcFactory); + app.createKingdom(Kingdom.FactoryMaker.KingdomType.ORC); final var orcKing = kingdom.getKing(); assertTrue(orcKing instanceof OrcKing); assertEquals(OrcKing.DESCRIPTION, orcKing.getDescription()); @@ -61,14 +52,14 @@ public class AbstractFactoryTest { @Test public void castle() { - app.createKingdom(elfFactory); + app.createKingdom(Kingdom.FactoryMaker.KingdomType.ELF); final var kingdom = app.getKingdom(); final var elfCastle = kingdom.getCastle(); assertTrue(elfCastle instanceof ElfCastle); assertEquals(ElfCastle.DESCRIPTION, elfCastle.getDescription()); - app.createKingdom(orcFactory); + app.createKingdom(Kingdom.FactoryMaker.KingdomType.ORC); final var orcCastle = kingdom.getCastle(); assertTrue(orcCastle instanceof OrcCastle); assertEquals(OrcCastle.DESCRIPTION, orcCastle.getDescription()); @@ -76,14 +67,14 @@ public class AbstractFactoryTest { @Test public void army() { - app.createKingdom(elfFactory); + app.createKingdom(Kingdom.FactoryMaker.KingdomType.ELF); final var kingdom = app.getKingdom(); final var elfArmy = kingdom.getArmy(); assertTrue(elfArmy instanceof ElfArmy); assertEquals(ElfArmy.DESCRIPTION, elfArmy.getDescription()); - app.createKingdom(orcFactory); + app.createKingdom(Kingdom.FactoryMaker.KingdomType.ORC); final var orcArmy = kingdom.getArmy(); assertTrue(orcArmy instanceof OrcArmy); assertEquals(OrcArmy.DESCRIPTION, orcArmy.getDescription()); @@ -91,7 +82,7 @@ public class AbstractFactoryTest { @Test public void createElfKingdom() { - app.createKingdom(elfFactory); + app.createKingdom(Kingdom.FactoryMaker.KingdomType.ELF); final var kingdom = app.getKingdom(); final var king = kingdom.getKing(); @@ -107,7 +98,7 @@ public class AbstractFactoryTest { @Test public void createOrcKingdom() { - app.createKingdom(orcFactory); + app.createKingdom(Kingdom.FactoryMaker.KingdomType.ORC); final var kingdom = app.getKingdom(); final var king = kingdom.getKing(); From 29eecfd0489c79c8c86850039e55b3bff008d377 Mon Sep 17 00:00:00 2001 From: Vladislav Golubinov Date: Sun, 6 Sep 2020 11:52:16 +0300 Subject: [PATCH 06/36] forgot to run the App --- .../src/main/java/com/iluwatar/abstractfactory/App.java | 1 + 1 file changed, 1 insertion(+) diff --git a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java index 05aa8d118..2d49768ec 100644 --- a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java +++ b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java @@ -57,6 +57,7 @@ public class App implements Runnable { */ public static void main(String[] args) { var app = new App(); + app.run(); } @Override From bab48efd7c24ee74ba4ad599d08b9942814a57ca Mon Sep 17 00:00:00 2001 From: Vladislav Golubinov Date: Sun, 6 Sep 2020 12:01:48 +0300 Subject: [PATCH 07/36] fix style --- .../src/main/java/com/iluwatar/abstractfactory/App.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java index 2d49768ec..baf2d7569 100644 --- a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java +++ b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java @@ -77,7 +77,7 @@ public class App implements Runnable { /** * Creates kingdom. - * @param kingdomType + * @param kingdomType type of Kingdom */ public void createKingdom(final Kingdom.FactoryMaker.KingdomType kingdomType) { final KingdomFactory kingdomFactory = Kingdom.FactoryMaker.makeFactory(kingdomType); From 93aa1046aa6b277ed29a6a498271ee6da9c63a7e Mon Sep 17 00:00:00 2001 From: Mike Date: Fri, 11 Sep 2020 09:34:11 +0800 Subject: [PATCH 08/36] translate decorator and factory method pattern in Chinese --- zh/decorator/README.md | 139 ++++++++++++++++++++++++++++++++++++ zh/factory-method/README.md | 88 +++++++++++++++++++++++ 2 files changed, 227 insertions(+) create mode 100644 zh/decorator/README.md create mode 100644 zh/factory-method/README.md diff --git a/zh/decorator/README.md b/zh/decorator/README.md new file mode 100644 index 000000000..ef23eda0b --- /dev/null +++ b/zh/decorator/README.md @@ -0,0 +1,139 @@ +--- +layout: pattern +title: Decorator +folder: decorator +permalink: /patterns/decorator/ +categories: Structural +tags: + - Gang Of Four + - Extensibility +--- + +## 或称 +包装器 + +## 目的 +动态的为对象附加额外的职责。装饰器为子类提供了灵活的替代方案,以扩展功能。 + +## 解释 + +真实世界例子 + +> 附近的山丘上住着一个愤怒的巨魔。通常它是徒手的,但有时它有武器。为了武装巨魔不必创建新的巨魔,而是用合适的武器动态的装饰它。 + +通俗的说 + +> 装饰者模式让你可以在运行时通过把对象包装进一个装饰类对象中来动态的改变一个对象的行为。 + +维基百科说 + +> 在面向对象的编程中,装饰器模式是一种设计模式,它允许将行为静态或动态地添加到单个对象中,而不会影响同一类中其他对象的行为。装饰器模式通常对于遵守单一责任原则很有用,因为它允许将功能划分到具有唯一关注领域的类之间。 + +**程序示例** + +以巨魔的为例。首先我有有一个简单的巨魔,实现了巨魔接口。 + +程序mple. First of all we have a simple troll implementing the troll interface + +```java +public interface Troll { + void attack(); + int getAttackPower(); + void fleeBattle(); +} + +public class SimpleTroll implements Troll { + + private static final Logger LOGGER = LoggerFactory.getLogger(SimpleTroll.class); + + @Override + public void attack() { + LOGGER.info("The troll tries to grab you!"); + } + + @Override + public int getAttackPower() { + return 10; + } + + @Override + public void fleeBattle() { + LOGGER.info("The troll shrieks in horror and runs away!"); + } +} +``` + +下面我们想为巨魔添加球棒。我们可以用装饰者来动态的实现。 + +```java +public class ClubbedTroll implements Troll { + + private static final Logger LOGGER = LoggerFactory.getLogger(ClubbedTroll.class); + + private final Troll decorated; + + public ClubbedTroll(Troll decorated) { + this.decorated = decorated; + } + + @Override + public void attack() { + decorated.attack(); + LOGGER.info("The troll swings at you with a club!"); + } + + @Override + public int getAttackPower() { + return decorated.getAttackPower() + 10; + } + + @Override + public void fleeBattle() { + decorated.fleeBattle(); + } +} +``` + +这里是巨魔的实战 + +```java +// simple troll +var troll = new SimpleTroll(); +troll.attack(); // The troll tries to grab you! +troll.fleeBattle(); // The troll shrieks in horror and runs away! + +// change the behavior of the simple troll by adding a decorator +var clubbedTroll = new ClubbedTroll(troll); +clubbedTroll.attack(); // The troll tries to grab you! The troll swings at you with a club! +clubbedTroll.fleeBattle(); // The troll shrieks in horror and runs away! +``` + +## 类图 +![alt text](../../decorator/etc/decorator.urm.png "Decorator pattern class diagram") + +## 适用性 +使用装饰者 + +* 动态透明地向单个对象添加职责,即不影响其他对象 +* 对于可以撤销的责任 +* 当通过子类化进行扩展是不切实际的。有时可能会有大量的独立扩展,并且会产生大量的子类来支持每种组合。 否则类定义可能被隐藏或无法用于子类化。 + +## 教程 +* [Decorator Pattern Tutorial](https://www.journaldev.com/1540/decorator-design-pattern-in-java-example) + +## Java世界的例子 + * [java.io.InputStream](http://docs.oracle.com/javase/8/docs/api/java/io/InputStream.html), [java.io.OutputStream](http://docs.oracle.com/javase/8/docs/api/java/io/OutputStream.html), + [java.io.Reader](http://docs.oracle.com/javase/8/docs/api/java/io/Reader.html) and [java.io.Writer](http://docs.oracle.com/javase/8/docs/api/java/io/Writer.html) + * [java.util.Collections#synchronizedXXX()](http://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#synchronizedCollection-java.util.Collection-) + * [java.util.Collections#unmodifiableXXX()](http://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#unmodifiableCollection-java.util.Collection-) + * [java.util.Collections#checkedXXX()](http://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#checkedCollection-java.util.Collection-java.lang.Class-) + + +## 鸣谢 + +* [Design Patterns: Elements of Reusable Object-Oriented Software](https://www.amazon.com/gp/product/0201633612/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0201633612&linkCode=as2&tag=javadesignpat-20&linkId=675d49790ce11db99d90bde47f1aeb59) +* [Functional Programming in Java: Harnessing the Power of Java 8 Lambda Expressions](https://www.amazon.com/gp/product/1937785467/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=1937785467&linkCode=as2&tag=javadesignpat-20&linkId=7e4e2fb7a141631491534255252fd08b) +* [J2EE Design Patterns](https://www.amazon.com/gp/product/0596004273/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596004273&linkCode=as2&tag=javadesignpat-20&linkId=48d37c67fb3d845b802fa9b619ad8f31) +* [Head First Design Patterns: A Brain-Friendly Guide](https://www.amazon.com/gp/product/0596007124/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596007124&linkCode=as2&tag=javadesignpat-20&linkId=6b8b6eea86021af6c8e3cd3fc382cb5b) +* [Refactoring to Patterns](https://www.amazon.com/gp/product/0321213351/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0321213351&linkCode=as2&tag=javadesignpat-20&linkId=2a76fcb387234bc71b1c61150b3cc3a7) +* [J2EE Design Patterns](https://www.amazon.com/gp/product/0596004273/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596004273&linkCode=as2&tag=javadesignpat-20&linkId=f27d2644fbe5026ea448791a8ad09c94) diff --git a/zh/factory-method/README.md b/zh/factory-method/README.md new file mode 100644 index 000000000..420653d1b --- /dev/null +++ b/zh/factory-method/README.md @@ -0,0 +1,88 @@ +--- +layout: pattern +title: Factory Method +folder: factory-method +permalink: /patterns/factory-method/ +categories: Creational +tags: + - Extensibility + - Gang Of Four +--- + +## Also known as +# 或称 + +虚拟构造器 + +## 目的 +为创建一个对象定义一个接口,但是让子类决定实例化哪个类。工厂方法允许类将实例化延迟到子类。 + +## 解释 +真实世界例子 + +> 铁匠生产武器。精灵需要精灵武器,而兽人需要兽人武器。根据客户来召唤正确类型的铁匠。 + +通俗的说 + +> 它为类提供了一种把实例化的逻辑委托给子类的方式。 + +维基百科上说 + +> 在基于类的编程中,工厂方法模式是一种创建型设计模式用来解决创建对象的问题,而不需要指定将要创建对象的确切类。这是通过调用工厂方法创建对象来完成的,而不是通过调用构造器。该工厂方法在接口中指定并由子类实现,或者在基类实现并可以选择由子类重写。 + + **程序示例** + +以上面的铁匠为例,首先我们有铁匠的接口和一些它的实现。 + +```java +public interface Blacksmith { + Weapon manufactureWeapon(WeaponType weaponType); +} + +public class ElfBlacksmith implements Blacksmith { + public Weapon manufactureWeapon(WeaponType weaponType) { + return ELFARSENAL.get(weaponType); + } +} + +public class OrcBlacksmith implements Blacksmith { + public Weapon manufactureWeapon(WeaponType weaponType) { + return ORCARSENAL.get(weaponType); + } +} +``` + +现在随着客户的到来,会召唤出正确类型的铁匠并制造出要求的武器。 + +```java +var blacksmith = new ElfBlacksmith(); +blacksmith.manufactureWeapon(WeaponType.SPEAR); +blacksmith.manufactureWeapon(WeaponType.AXE); +// Elvish weapons are created +``` + +## 类图 +![alt text](../../factory-method/etc/factory-method.urm.png "Factory Method pattern class diagram") + +## 适用性 +使用工厂方法模式当 + +* 一个类无法预料它所要必须创建的对象的类 +* 一个类想要它的子类来指定它要创建的对象 +* 类将责任委派给几个帮助子类中的一个,而你想定位了解是具体之中的哪一个 + +## Java中的例子 + +* [java.util.Calendar](http://docs.oracle.com/javase/8/docs/api/java/util/Calendar.html#getInstance--) +* [java.util.ResourceBundle](http://docs.oracle.com/javase/8/docs/api/java/util/ResourceBundle.html#getBundle-java.lang.String-) +* [java.text.NumberFormat](http://docs.oracle.com/javase/8/docs/api/java/text/NumberFormat.html#getInstance--) +* [java.nio.charset.Charset](http://docs.oracle.com/javase/8/docs/api/java/nio/charset/Charset.html#forName-java.lang.String-) +* [java.net.URLStreamHandlerFactory](http://docs.oracle.com/javase/8/docs/api/java/net/URLStreamHandlerFactory.html#createURLStreamHandler-java.lang.String-) +* [java.util.EnumSet](https://docs.oracle.com/javase/8/docs/api/java/util/EnumSet.html#of-E-) +* [javax.xml.bind.JAXBContext](https://docs.oracle.com/javase/8/docs/api/javax/xml/bind/JAXBContext.html#createMarshaller--) + +## 鸣谢 + +* [Design Patterns: Elements of Reusable Object-Oriented Software](https://www.amazon.com/gp/product/0201633612/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0201633612&linkCode=as2&tag=javadesignpat-20&linkId=675d49790ce11db99d90bde47f1aeb59) +* [Head First Design Patterns: A Brain-Friendly Guide](https://www.amazon.com/gp/product/0596007124/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596007124&linkCode=as2&tag=javadesignpat-20&linkId=6b8b6eea86021af6c8e3cd3fc382cb5b) +* [Refactoring to Patterns](https://www.amazon.com/gp/product/0321213351/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0321213351&linkCode=as2&tag=javadesignpat-20&linkId=2a76fcb387234bc71b1c61150b3cc3a7) From 9f3f5322d2226274b3e6a7b96bdc5ca0424bb9b0 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 12 Sep 2020 17:00:58 +0000 Subject: [PATCH 09/36] docs: update README.md [skip ci] --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index c60b27f09..ca3e8fbaa 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ [![Coverage](https://sonarcloud.io/api/project_badges/measure?project=iluwatar_java-design-patterns&metric=coverage)](https://sonarcloud.io/dashboard?id=iluwatar_java-design-patterns) [![Join the chat at https://gitter.im/iluwatar/java-design-patterns](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/iluwatar/java-design-patterns?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) -[![All Contributors](https://img.shields.io/badge/all_contributors-131-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-132-orange.svg?style=flat-square)](#contributors-) # Introduction @@ -246,7 +246,7 @@ This project is licensed under the terms of the MIT license.
Nishant Arora

💻
Peeyush

💻 -
Rakesh

💻 +
Rakesh

💻 👀
Wei Seng

💻 @@ -262,10 +262,10 @@ This project is licensed under the terms of the MIT license.
Michał Krzywański

💻 -
Rakesh

💻 👀
Stefan Birkner

💻
Fedor Skvorcov

💻
samilAyoub

💻 +
Vladislav Golubinov

💻 From c63af2ccbf6389d8c67e17116283d255ed977a24 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 12 Sep 2020 17:00:59 +0000 Subject: [PATCH 10/36] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index c7c53aae4..7abdd7ea9 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1195,6 +1195,15 @@ "contributions": [ "code" ] + }, + { + "login": "vdlald", + "name": "Vladislav Golubinov", + "avatar_url": "https://avatars0.githubusercontent.com/u/29997701?v=4", + "profile": "https://github.com/vdlald", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 4, From 74b968942f69a893d8f832e5482cf481429638a5 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 13 Sep 2020 14:23:52 +0000 Subject: [PATCH 11/36] docs: update README.md [skip ci] --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ca3e8fbaa..51ed89f82 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ [![Coverage](https://sonarcloud.io/api/project_badges/measure?project=iluwatar_java-design-patterns&metric=coverage)](https://sonarcloud.io/dashboard?id=iluwatar_java-design-patterns) [![Join the chat at https://gitter.im/iluwatar/java-design-patterns](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/iluwatar/java-design-patterns?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) -[![All Contributors](https://img.shields.io/badge/all_contributors-132-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-133-orange.svg?style=flat-square)](#contributors-) # Introduction @@ -267,6 +267,9 @@ This project is licensed under the terms of the MIT license.
samilAyoub

💻
Vladislav Golubinov

💻 + +
Swaraj

💻 + From 6f592f5e8a7c66116d8035e16a3d299b6a1c9e82 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 13 Sep 2020 14:23:53 +0000 Subject: [PATCH 12/36] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 7abdd7ea9..43103ead1 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1204,6 +1204,15 @@ "contributions": [ "code" ] + }, + { + "login": "swarajsaaj", + "name": "Swaraj", + "avatar_url": "https://avatars2.githubusercontent.com/u/6285049?v=4", + "profile": "https://github.com/swarajsaaj", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 4, From 2e98dcf2179f4aa13478d36fd8967d068a98eff0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sun, 13 Sep 2020 17:39:10 +0300 Subject: [PATCH 13/36] Update README.md --- separated-interface/README.md | 43 +++++++++++++++++++++++++---------- 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/separated-interface/README.md b/separated-interface/README.md index ca7a12e44..35c9e5fe0 100644 --- a/separated-interface/README.md +++ b/separated-interface/README.md @@ -10,23 +10,35 @@ tags: ## Intent -Separate the interface definition and implementation in different packages. This allows the client to be completely unaware of the implementation. + +Separate the interface definition and implementation in different packages. This allows the client +to be completely unaware of the implementation. ## Explanation Real world example -> An Invoice generator may be created with ability to use different Tax calculators that may be added in the invoice depending upon type of purchase, region etc. +> An Invoice generator may be created with ability to use different Tax calculators that may be +> added in the invoice depending upon type of purchase, region etc. In plain words -> Separated interface pattern encourages to keep the implementations of an interface decoupled from the client and its definition, so the client is not dependent on the implementation. +> Separated interface pattern encourages to keep the implementations of an interface decoupled from +> the client and its definition, so the client is not dependent on the implementation. -A client code may abstract some specific functionality to an interface, and define the definition of the interface as an SPI ([Service Programming Interface](https://en.wikipedia.org/wiki/Service_provider_interface) is an API intended and open to be implemented or extended by a third party). Another package may implement this interface definition with a concrete logic, which will be injected into the client code at runtime (with a third class, injecting the implementation in the client) or at compile time (using Plugin pattern with some configurable file). +A client code may abstract some specific functionality to an interface, and define the definition of +the interface as an SPI ([Service Programming Interface](https://en.wikipedia.org/wiki/Service_provider_interface) +is an API intended and open to be implemented or extended by a third party). Another package may +implement this interface definition with a concrete logic, which will be injected into the client +code at runtime (with a third class, injecting the implementation in the client) or at compile time +(using Plugin pattern with some configurable file). **Programmatic Example** -**Client** An Invoice generator class accepts the cost of the product and calculates the total amount payable inclusive of tax +**Client** + +`InvoiceGenerator` class accepts the cost of the product and calculates the total +amount payable inclusive of tax. ```java public class InvoiceGenerator { @@ -46,21 +58,23 @@ public class InvoiceGenerator { } ``` -The tax calculation logic is delegated to the ```TaxCalculator``` interface + +The tax calculation logic is delegated to the `TaxCalculator` interface. ```java - public interface TaxCalculator { double calculate(double amount); } - ``` **Implementation package** -In another package (which the client is completely unaware of) there exist multiple implementations of the ```TaxCalculator``` interface -```ForeignTaxCalculator``` which levies 60% tax for international products. + +In another package (which the client is completely unaware of) there exist multiple implementations +of the `TaxCalculator` interface. `ForeignTaxCalculator` is one of them which levies 60% tax +for international products. + ```java public class ForeignTaxCalculator implements TaxCalculator { @@ -74,7 +88,8 @@ public class ForeignTaxCalculator implements TaxCalculator { } ``` -```DomesticTaxCalculator``` which levies 20% tax for international products. +Another is `DomesticTaxCalculator` which levies 20% tax for international products. + ```java public class DomesticTaxCalculator implements TaxCalculator { @@ -88,7 +103,8 @@ public class DomesticTaxCalculator implements TaxCalculator { } ``` -These both implementations are instantiated and injected in the client class by the ```App.java``` class +These both implementations are instantiated and injected in the client class by the ```App.java``` +class. ```java var internationalProductInvoice = new InvoiceGenerator(PRODUCT_COST, new ForeignTaxCalculator()); @@ -101,9 +117,11 @@ These both implementations are instantiated and injected in the client class by ``` ## Class diagram + ![alt text](./etc/class_diagram.png "Separated Interface") ## Applicability + Use the Separated interface pattern when * You are developing a framework package, and your framework needs to call some application code through interfaces. @@ -117,3 +135,4 @@ Use the Separated interface pattern when ## Credits * [Martin Fowler](https://www.martinfowler.com/eaaCatalog/separatedInterface.html) +* [Patterns of Enterprise Application Architecture](https://www.amazon.com/gp/product/0321127420/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=javadesignpat-20&creative=9325&linkCode=as2&creativeASIN=0321127420&linkId=e08dfb7f2cf6153542ef1b5a00b10abc) From c204b242dfb84a1b6e43d2dddc56252ddceb47e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sun, 13 Sep 2020 17:53:50 +0300 Subject: [PATCH 14/36] Update README.md --- singleton/README.md | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/singleton/README.md b/singleton/README.md index 60a103a3b..915b3c810 100644 --- a/singleton/README.md +++ b/singleton/README.md @@ -9,14 +9,16 @@ tags: --- ## Intent -Ensure a class only has one instance, and provide a global point of -access to it. + +Ensure a class only has one instance, and provide a global point of access to it. ## Explanation + Real world example -> There can only be one ivory tower where the wizards study their magic. The same enchanted ivory tower is always used by the wizards. Ivory tower here is singleton. +> There can only be one ivory tower where the wizards study their magic. The same enchanted ivory +> tower is always used by the wizards. Ivory tower here is singleton. In plain words @@ -24,7 +26,9 @@ In plain words Wikipedia says -> In software engineering, the singleton pattern is a software design pattern that restricts the instantiation of a class to one object. This is useful when exactly one object is needed to coordinate actions across the system. +> In software engineering, the singleton pattern is a software design pattern that restricts the +> instantiation of a class to one object. This is useful when exactly one object is needed to +> coordinate actions across the system. **Programmatic Example** @@ -38,7 +42,7 @@ public enum EnumIvoryTower { } ``` -Then in order to use +Then in order to use: ```java var enumIvoryTower1 = EnumIvoryTower.INSTANCE; @@ -47,9 +51,11 @@ assertEquals(enumIvoryTower1, enumIvoryTower2); // true ``` ## Class diagram + ![alt text](./etc/singleton.urm.png "Singleton pattern class diagram") ## Applicability + Use the Singleton pattern when * There must be exactly one instance of a class, and it must be accessible to clients from a well-known access point From e6cca86e25c6571e2e98091cd4face248fafa019 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sun, 13 Sep 2020 17:59:12 +0300 Subject: [PATCH 15/36] Update README.md --- spatial-partition/README.md | 31 ++++++++++++++----- .../SpatialPartitionBubbles.java | 1 - 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/spatial-partition/README.md b/spatial-partition/README.md index 29d54533d..0114fadba 100644 --- a/spatial-partition/README.md +++ b/spatial-partition/README.md @@ -10,12 +10,17 @@ tags: --- ## Intent -As explained in the book [Game Programming Patterns](http://gameprogrammingpatterns.com/spatial-partition.html) by Bob Nystrom, spatial partition pattern helps to -> efficiently locate objects by storing them in a data structure organized by their positions. +As explained in the book [Game Programming Patterns](http://gameprogrammingpatterns.com/spatial-partition.html) +by Bob Nystrom, spatial partition pattern helps to efficiently locate objects by storing them in a +data structure organized by their positions. ## Explanation -Say, you are building a war game with hundreds, or maybe even thousands of players, who are clashing on the battle field. Each player's position is getting updated every frame. The simple way to handle all interactions taking place on the field is to check each player's position against every other player's position: + +Say, you are building a war game with hundreds, or maybe even thousands of players, who are clashing +on the battle field. Each player's position is getting updated every frame. The simple way to handle +all interactions taking place on the field is to check each player's position against every other +player's position: ```java public void handleMeLee(Unit units[], int numUnits) { @@ -32,21 +37,33 @@ public void handleMeLee(Unit units[], int numUnits) { } ``` -This will include a lot of unnecessary checks between players which are too far apart to have any influence on each other. The nested loops gives this operation an O(n^2) complexity, which has to be performed every frame since many of the objects on the field may be moving each frame. -The idea behind the Spatial Partition design pattern is to enable quick location of objects using a data structure that is organised by their positions, so when performing an operation like the one above, every object's position need not be checked against all other objects' positions. The data structure can be used to store moving and static objects, though in order to keep track of the moving objects, their positions will have to be reset each time they move. This would mean having to create a new instance of the data structure each time an object moves, which would use up additional memory. The common data structures used for this design pattern are: +This will include a lot of unnecessary checks between players which are too far apart to have any +influence on each other. The nested loops gives this operation an O(n^2) complexity, which has to be +performed every frame since many of the objects on the field may be moving each frame. The idea +behind the Spatial Partition design pattern is to enable quick location of objects using a data +structure that is organised by their positions, so when performing an operation like the one above, +every object's position need not be checked against all other objects' positions. The data structure +can be used to store moving and static objects, though in order to keep track of the moving objects, +their positions will have to be reset each time they move. This would mean having to create a new +instance of the data structure each time an object moves, which would use up additional memory. The +common data structures used for this design pattern are: * Grid * Quad tree -* k-d tree +* K-d tree * BSP * Boundary volume hierarchy -In our implementation, we use the Quadtree data structure which will reduce the time complexity of finding the objects within a certain range from O(n^2) to O(nlogn), decreasing the computations required significantly in case of large number of objects. +In our implementation, we use the Quadtree data structure which will reduce the time complexity of +finding the objects within a certain range from O(n^2) to O(nlogn), decreasing the computations +required significantly in case of large number of objects. ## Class diagram + ![alt text](./etc/spatial-partition.urm.png "Spatial Partition pattern class diagram") ## Applicability + This pattern can be used: * When you need to keep track of a large number of objects' positions, which are getting updated every frame. diff --git a/spatial-partition/src/main/java/com/iluwatar/spatialpartition/SpatialPartitionBubbles.java b/spatial-partition/src/main/java/com/iluwatar/spatialpartition/SpatialPartitionBubbles.java index c0eb5ecde..c543da12c 100644 --- a/spatial-partition/src/main/java/com/iluwatar/spatialpartition/SpatialPartitionBubbles.java +++ b/spatial-partition/src/main/java/com/iluwatar/spatialpartition/SpatialPartitionBubbles.java @@ -24,7 +24,6 @@ package com.iluwatar.spatialpartition; import java.util.ArrayList; -import java.util.Collection; import java.util.Hashtable; /** From 9c648cbdb86ba7e93edac9b36589cea4082e4745 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sun, 13 Sep 2020 18:04:30 +0300 Subject: [PATCH 16/36] Update README.md --- specification/README.md | 68 ++++++++++++++++++++++++++--------------- 1 file changed, 43 insertions(+), 25 deletions(-) diff --git a/specification/README.md b/specification/README.md index 6cc0c702f..5648a73b0 100644 --- a/specification/README.md +++ b/specification/README.md @@ -9,36 +9,46 @@ tags: --- ## Also known as + Filter, Criteria ## Intent -Specification pattern separates the statement of how to match a -candidate, from the candidate object that it is matched against. As well as its -usefulness in selection, it is also valuable for validation and for building to -order. + +Specification pattern separates the statement of how to match a candidate, from the candidate object +that it is matched against. As well as its usefulness in selection, it is also valuable for +validation and for building to order. ## Explanation Real world example -> There is a pool of different creatures and we often need to select some subset of them. -> We can write our search specification such as "creatures that can fly", "creatures heavier than 500 kilograms", or as a combination of other search specifications, and then give it to the party that will perform the filtering. +> There is a pool of different creatures and we often need to select some subset of them. We can +> write our search specification such as "creatures that can fly", "creatures heavier than 500 +> kilograms", or as a combination of other search specifications, and then give it to the party that +> will perform the filtering. In Plain Words -> Specification pattern allows us to separate the search criteria from the object that performs the search. +> Specification pattern allows us to separate the search criteria from the object that performs the +> search. Wikipedia says -> In computer programming, the specification pattern is a particular software design pattern, whereby business rules can be recombined by chaining the business rules together using boolean logic. +> In computer programming, the specification pattern is a particular software design pattern, +> whereby business rules can be recombined by chaining the business rules together using boolean +> logic. **Programmatic Example** -If we look at our creature pool example from above, we have a set of creatures with certain properties. -Those properties can be part of a pre-defined, limited set (represented here by the enums Size, Movement and Color); but they can also be continuous values (e.g. the mass of a Creature). -In this case, it is more appropriate to use what we call "parameterized specification", where the property value can be given as an argument when the Creature is instantiated, allowing for more flexibility. -A third option is to combine pre-defined and/or parameterized properties using boolean logic, allowing for near-endless selection possibilities (this is called "composite specification", see below). -The pros and cons of each approach are detailed in the table at the end of this document. +If we look at our creature pool example from above, we have a set of creatures with certain +properties. Those properties can be part of a pre-defined, limited set (represented here by the +enums Size, Movement and Color); but they can also be continuous values (e.g. the mass of a +Creature). In this case, it is more appropriate to use what we call "parameterized specification", +where the property value can be given as an argument when the Creature is instantiated, allowing for +more flexibility. A third option is to combine pre-defined and/or parameterized properties using +boolean logic, allowing for near-endless selection possibilities (this is called "composite +specification", see below). The pros and cons of each approach are detailed in the table at the end +of this document. ```java public interface Creature { @@ -50,7 +60,7 @@ public interface Creature { } ``` -And ``Dragon`` implementation looks like this. +And `Dragon` implementation looks like this. ```java public class Dragon extends AbstractCreature { @@ -61,7 +71,8 @@ public class Dragon extends AbstractCreature { } ``` -Now that we want to select some subset of them, we use selectors. To select creatures that fly, we should use ``MovementSelector``. +Now that we want to select some subset of them, we use selectors. To select creatures that fly, we +should use `MovementSelector`. ```java public class MovementSelector extends AbstractSelector { @@ -79,7 +90,8 @@ public class MovementSelector extends AbstractSelector { } ``` -On the other hand, when selecting creatures heavier than a chosen amount, we use ``MassGreaterThanSelector``. +On the other hand, when selecting creatures heavier than a chosen amount, we use +`MassGreaterThanSelector`. ```java public class MassGreaterThanSelector extends AbstractSelector { @@ -111,7 +123,8 @@ But we could also use our parameterized selector like this: .collect(Collectors.toList()); ``` -Our third option is to combine multiple selectors together. Performing a search for special creatures (defined as red, flying, and not small) could be done as follows: +Our third option is to combine multiple selectors together. Performing a search for special +creatures (defined as red, flying, and not small) could be done as follows: ```java var specialCreaturesSelector = @@ -123,8 +136,9 @@ Our third option is to combine multiple selectors together. Performing a search **More on Composite Specification** -In Composite Specification, we will create custom instances of ``AbstractSelector`` by combining other selectors (called "leaves") using the three basic logical operators. -These are implemented in ``ConjunctionSelector``, ``DisjunctionSelector`` and ``NegationSelector``. +In Composite Specification, we will create custom instances of `AbstractSelector` by combining +other selectors (called "leaves") using the three basic logical operators. These are implemented in +`ConjunctionSelector`, `DisjunctionSelector` and `NegationSelector`. ```java public abstract class AbstractSelector implements Predicate { @@ -163,12 +177,14 @@ public class ConjunctionSelector extends AbstractSelector { } ``` -All that is left to do is now to create leaf selectors (be it hard-coded or parameterized ones) that are as generic as possible, -and we will be able to instantiate the ``AbstractSelector`` class by combining any amount of selectors, as exemplified above. -We should be careful though, as it is easy to make a mistake when combining many logical operators; in particular, we should pay attention to the priority of the operations.\ -In general, Composite Specification is a great way to write more reusable code, as there is no need to create a Selector class for each filtering operation. -Instead, we just create an instance of ``AbstractSelector`` "on the spot", using tour generic "leaf" selectors and some basic boolean logic. - +All that is left to do is now to create leaf selectors (be it hard-coded or parameterized ones) that +are as generic as possible, and we will be able to instantiate the ``AbstractSelector`` class by +combining any amount of selectors, as exemplified above. We should be careful though, as it is easy +to make a mistake when combining many logical operators; in particular, we should pay attention to +the priority of the operations. In general, Composite Specification is a great way to write more +reusable code, as there is no need to create a Selector class for each filtering operation. Instead, +we just create an instance of ``AbstractSelector`` "on the spot", using tour generic "leaf" +selectors and some basic boolean logic. **Comparison of the different approaches** @@ -181,9 +197,11 @@ Instead, we just create an instance of ``AbstractSelector`` "on the spot", using | | | + Supports logical operations | - You still need to create the base classes used as leaves | ## Class diagram + ![alt text](./etc/specification.png "Specification") ## Applicability + Use the Specification pattern when * You need to select a subset of objects based on some criteria, and to refresh the selection at various times. From 9cbc509c3ad3a75f0935e01b2d3b636968cf5832 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sun, 13 Sep 2020 18:09:18 +0300 Subject: [PATCH 17/36] Update README.md --- state/README.md | 33 ++++++++++++----- state/etc/state.png | Bin 17753 -> 0 bytes state/etc/state.ucls | 80 ------------------------------------------ state/etc/state_1.png | Bin 33886 -> 0 bytes 4 files changed, 24 insertions(+), 89 deletions(-) delete mode 100644 state/etc/state.png delete mode 100644 state/etc/state.ucls delete mode 100644 state/etc/state_1.png diff --git a/state/README.md b/state/README.md index a8dd2b5fc..7ee201be2 100644 --- a/state/README.md +++ b/state/README.md @@ -9,15 +9,21 @@ tags: --- ## Also known as + Objects for States ## Intent -Allow an object to alter its behavior when its internal state changes. The object will appear to change its class. + +Allow an object to alter its behavior when its internal state changes. The object will appear to +change its class. ## Explanation + Real world example -> When observing a mammoth in its natural habitat it seems to change its behavior based on the situation. It may first appear calm but over time when it detects a threat it gets angry and dangerous to its surroundings. +> When observing a mammoth in its natural habitat it seems to change its behavior based on the +> situation. It may first appear calm but over time when it detects a threat it gets angry and +> dangerous to its surroundings. In plain words @@ -25,7 +31,10 @@ In plain words Wikipedia says -> The state pattern is a behavioral software design pattern that allows an object to alter its behavior when its internal state changes. This pattern is close to the concept of finite-state machines. The state pattern can be interpreted as a strategy pattern, which is able to switch a strategy through invocations of methods defined in the pattern's interface. +> The state pattern is a behavioral software design pattern that allows an object to alter its +> behavior when its internal state changes. This pattern is close to the concept of finite-state +> machines. The state pattern can be interpreted as a strategy pattern, which is able to switch a +> strategy through invocations of methods defined in the pattern's interface. **Programmatic Example** @@ -126,17 +135,23 @@ And here is the full example how the mammoth behaves over time. mammoth.observe(); mammoth.timePasses(); mammoth.observe(); - - // The mammoth gets angry! - // The mammoth is furious! - // The mammoth calms down. - // The mammoth is calm and peaceful. +``` + +Program output: + +```java + The mammoth gets angry! + The mammoth is furious! + The mammoth calms down. + The mammoth is calm and peaceful. ``` ## Class diagram -![alt text](./etc/state_1.png "State") + +![alt text](./etc/state_urm.png "State") ## Applicability + Use the State pattern in either of the following cases * An object's behavior depends on its state, and it must change its behavior at run-time depending on that state diff --git a/state/etc/state.png b/state/etc/state.png deleted file mode 100644 index fb1648238e78e123a3e2f60540ae7701dd45ee8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17753 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 diff --git a/state/etc/state.ucls b/state/etc/state.ucls deleted file mode 100644 index e0be8d712..000000000 --- a/state/etc/state.ucls +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/state/etc/state_1.png b/state/etc/state_1.png deleted file mode 100644 index 112bb9aff904f93f769583ab2a33d3f7b2181a9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33886 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
iUE7!eElOdtCT0kf!Fdl4hr*FaKHszv z_E7y^bDF@q{QY1e$3$R;kVg{O-YW_K9~njI!6 zyTjyeea6ZbUD&iZDs+;rfAqyh#7mDauU>uJ-SP`1nkz8Epf=#hhfxQ4g4gooTH)-(?f2d8iS>|4iORpRjlB#BvE0%3kZCm{j}W*&%v$F2*_}gL zQ+{Y~(l7j#c`a`{vvSyF$(^*Oj14ju>&pC@nVUXPdPY&bpQDv}Hjt9{?boEGOP6fK zC8|rye|m3`MB`A7GRgRU@|gIkpvTSG;(=06N$?Ii2A> zC`lS=Zz4OuCS+1jF=fwNUl$i9Dt>LJ)gfo^>}&#M$+XYpIl)h##^V!n_Hxcv@bh;m zzt$SvpLUFka{s7VU& z%>k>C=2do`d9$=47BlVd8Fp17vYj@(&x$V#`nnG-o_&c9k^Py6x~+lSx#!_c(61k z4sl59xi|N3jXrbEG$)+1>`e9@AOBh7K+O03fEj^ZW0L{x_ZcJ1{+Zo4ivXi$&L9S3 zhSe{hsbu)`Bj;=CvOfCwX zDC`-!vjrY2=0_7QqmD^PRCCZGAwmDB&4PUUK)8~Jle49NePdyvS&kT%4JqSD9JLY^ zRHCb^b*ZW~JYCmz!&li<0F`gu&LFvY@}<|o*S3|!GilYfz3ehFPY%bkzh6;{(#OLE zfiEUVlyzt{o(WGltvw2?TiZJ)#Ez7X7OpI~X44w30hMVBs}GSR7%|6%-W!x0*d3LL zp5^i@y(T(`sP+AMLqhL;&M=sf^PX|4zKrsq9I+}JO5#u;tdy%$JiVZ9o)esx=kz<9 zROAr9O|+Ar&8!6b$k0fVi^IWm2hyaI^r^9ONH|OR(&TBuUwNkewhU7G!Rp3f1)Z4V zMRKo$pIg88P|uyMa=!&-_boxI_To!#45_JY#hwH{Q}vB4YTD!;Ikogt$KkHDdheyF z(TOJ(E88na^nGW#m|4osU*DIZq{*_zjT-rrFJ6BYEdR2wgzq67O$b@KiYE=t4A>U8 zTKRvXHM=Wzc3)wIaxaD5CmGnNHl;j`^@acM1oSWe^w-4~=}^6E@ezVV1w2?gcTKE) zxMD(5ymG)Xjf(Sv#`EJC|Dpi!H_W)0S-*C91im&EHW)4KhEvO~k5)e{D^mdT@V$1+ z-D@|3po`lvJFqS#C9GpIO~I;%ohTt6KF}DTo%=TZkD}q9+)fr(#eZu*t*E&QB z)7@D;Fv%h!ao69Y;DAzhrE^P8a9_I>bsDY#Oeyf31(5C4Z>Mat>U zj#OPrJ4X#0$n8^N+xHDRiAoy~B|LK`?FH!8C~OizfK#ZNV9R`k9}b`_I*eT%NfcV2 z-R0Q*Z~(`WrM)Q^UK8QrxRmTdhQigs$HruMPG-Fa|Gpr(V7Th{e}AvojC`H>|D6NC zxqm0`kwgUyN#gaKL73v;;Edp+aB*<58KGtk|Csc{)g67jO({gV2>--Ul2^a{Sk5%y Fe*vgP8^izr From b5fddd469a1e7139fac627785a7d8b15b1cf4b5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sun, 13 Sep 2020 18:09:41 +0300 Subject: [PATCH 18/36] Update README.md --- state/etc/state_urm.png | Bin 0 -> 34673 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 state/etc/state_urm.png diff --git a/state/etc/state_urm.png b/state/etc/state_urm.png new file mode 100644 index 0000000000000000000000000000000000000000..c2cf9f562943f5395185497621565f69e56f0f53 GIT binary patch literal 34673 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 Date: Sun, 13 Sep 2020 18:15:17 +0300 Subject: [PATCH 19/36] Update README.md --- strategy/README.md | 39 +++++++++++------- strategy/etc/strategy.png | Bin 15393 -> 0 bytes strategy/etc/strategy.ucls | 75 ---------------------------------- strategy/etc/strategy_1.png | Bin 28839 -> 0 bytes strategy/etc/strategy_urm.png | Bin 0 -> 29282 bytes 5 files changed, 25 insertions(+), 89 deletions(-) delete mode 100644 strategy/etc/strategy.png delete mode 100644 strategy/etc/strategy.ucls delete mode 100644 strategy/etc/strategy_1.png create mode 100644 strategy/etc/strategy_urm.png diff --git a/strategy/README.md b/strategy/README.md index 21ac1c94b..b2330ceb8 100644 --- a/strategy/README.md +++ b/strategy/README.md @@ -9,17 +9,20 @@ tags: --- ## Also known as + Policy ## Intent -Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary -independently from clients that use it. + +Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets +the algorithm vary independently from clients that use it. ## Explanation Real world example -> Slaying dragons is a dangerous profession. With experience it becomes easier. Veteran dragonslayers have developed different fighting strategies against different types of dragons. +> Slaying dragons is a dangerous job. With experience it becomes easier. Veteran +> dragonslayers have developed different fighting strategies against different types of dragons. In plain words @@ -27,7 +30,8 @@ In plain words Wikipedia says -> In computer programming, the strategy pattern (also known as the policy pattern) is a behavioral software design pattern that enables selecting an algorithm at runtime. +> In computer programming, the strategy pattern (also known as the policy pattern) is a behavioral +> software design pattern that enables selecting an algorithm at runtime. **Programmatic Example** @@ -71,7 +75,8 @@ public class SpellStrategy implements DragonSlayingStrategy { } ``` -And here is the mighty dragonslayer who is able to pick his fighting strategy based on the opponent. +And here is the mighty dragonslayer, who is able to pick his fighting strategy based on the +opponent. ```java public class DragonSlayer { @@ -92,7 +97,7 @@ public class DragonSlayer { } ``` -Finally here's dragonslayer in action. +Finally here's the dragonslayer in action. ```java LOGGER.info("Green dragon spotted ahead!"); @@ -104,19 +109,25 @@ Finally here's dragonslayer in action. LOGGER.info("Black dragon lands before you."); dragonSlayer.changeStrategy(new SpellStrategy()); dragonSlayer.goToBattle(); - - // Green dragon spotted ahead! - // With your Excalibur you sever the dragon's head! - // Red dragon emerges. - // You shoot the dragon with the magical crossbow and it falls dead on the ground! - // Black dragon lands before you. - // You cast the spell of disintegration and the dragon vaporizes in a pile of dust! +``` + +Program output: + +``` + Green dragon spotted ahead! + With your Excalibur you sever the dragon's head! + Red dragon emerges. + You shoot the dragon with the magical crossbow and it falls dead on the ground! + Black dragon lands before you. + You cast the spell of disintegration and the dragon vaporizes in a pile of dust! ``` ## Class diagram -![alt text](./etc/strategy_1.png "Strategy") + +![alt text](./etc/strategy_urm.png "Strategy") ## Applicability + Use the Strategy pattern when * Many related classes differ only in their behavior. Strategies provide a way to configure a class either one of many behaviors diff --git a/strategy/etc/strategy.png b/strategy/etc/strategy.png deleted file mode 100644 index ae7442150e3763d24c343597c879895e89544985..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15393 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�`lPQe^_gw<>6Qv9|4G2|@P8 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/strategy/etc/strategy_1.png b/strategy/etc/strategy_1.png deleted file mode 100644 index c341e58c6d94456fcfd0215d4e454049b289a154..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28839 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 Date: Sun, 13 Sep 2020 18:19:35 +0300 Subject: [PATCH 20/36] Update README.md --- template-method/README.md | 23 +++++-- template-method/etc/template-method.png | Bin 17911 -> 0 bytes template-method/etc/template-method.ucls | 66 -------------------- template-method/etc/template-method_1.png | Bin 34592 -> 0 bytes template-method/etc/template_method_urm.png | Bin 0 -> 36470 bytes 5 files changed, 17 insertions(+), 72 deletions(-) delete mode 100644 template-method/etc/template-method.png delete mode 100644 template-method/etc/template-method.ucls delete mode 100644 template-method/etc/template-method_1.png create mode 100644 template-method/etc/template_method_urm.png diff --git a/template-method/README.md b/template-method/README.md index 695644488..23dd4d242 100644 --- a/template-method/README.md +++ b/template-method/README.md @@ -9,21 +9,30 @@ tags: --- ## Intent -Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template method lets -subclasses redefine certain steps of an algorithm without changing the algorithm's structure. + +Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template +Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's +structure. ## Explanation + Real world example -> The general steps in stealing an item are the same. First you pick the target, next you confuse him somehow and finally you steal the item. However there are many ways to implement these steps. +> The general steps in stealing an item are the same. First you pick the target, next you confuse +> him somehow and finally you steal the item. However there are many ways to implement these steps. In plain words -> Template Method pattern outlines the general steps in the parent class and lets the concrete child implementations define the details. +> Template Method pattern outlines the general steps in the parent class and lets the concrete child +> implementations define the details. Wikipedia says -> In object-oriented programming, the template method is one of the behavioral design patterns identified by Gamma et al. in the book Design Patterns. The template method is a method in a superclass, usually an abstract superclass, and defines the skeleton of an operation in terms of a number of high-level steps. These steps are themselves implemented by additional helper methods in the same class as the template method. +> In object-oriented programming, the template method is one of the behavioral design patterns +> identified by Gamma et al. in the book Design Patterns. The template method is a method in a +> superclass, usually an abstract superclass, and defines the skeleton of an operation in terms of +> a number of high-level steps. These steps are themselves implemented by additional helper methods +> in the same class as the template method. **Programmatic Example** @@ -120,9 +129,11 @@ And finally we show how the halfling thief utilizes the different stealing metho ``` ## Class diagram -![alt text](./etc/template-method_1.png "Template Method") + +![alt text](./etc/template_method_urm.png "Template Method") ## Applicability + The Template Method pattern should be used * To implement the invariant parts of an algorithm once and leave it up to subclasses to implement the behavior that can vary diff --git a/template-method/etc/template-method.png b/template-method/etc/template-method.png deleted file mode 100644 index e197813398efe850f7c292d052b9efef8d9563e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17911 zcmb8Xby$?$+BZxHNC?s;AQD5PbPR%Y2!nKrf~16mz(|RRNO!}~lG5GX-Hpi5J#>E; z>V4n)+0WkZ`+k3L9M@bcuC>lyzw=!9Dl5s{!=k`KLPEMHCo8FfgoNw|{N3C|0p7G9 z+~Y+;lB$=Je5U4{uy7~}CWa~%7 zI_cdE2AAxsqNWBO2h}At_Kv2j;9zR~?ZgscZsCh~Q&SUD_Yq1|BqV3wmowzR%9K$N zcaT12egq4)%+4kqBPGYb8lQ1QQ$a$&akj{VJ66RC{R8qQgim8KgHRB69HT=r8&L}+o$@GHyEpCw5(d^UfM z-xFTL3uYZyMEMSvBljI;eXxo0{)yHXAFS@C zR3em>GTMj40z{s{nx!idL?f5W9HgOgC+tzwDmOBykKPUaa2PHbNt6)qeT)~(NCF=w z(a#O|Y@y-!iR-?>&O=BOodcA`@LDP$DUB#aRF8I}y)_>&`f<0%rK{P+hAwT*3$I3qw99Qu9kquH;W?wF_w_i=B)?ScZ06!6Er-} z927CxX1<(mhx6tA*dzd!Lx%%3q&Qp+o-cIxnL@hYx(I4`PYF83>5>b$XH8t$=Y zhPqJFRUSUA}AXm4t_&B@{16qE!mIce49EM79u*V2D_M0Rnc zFt9B8HvZbSQDgv3leMHm2ec^y%svDt?m^NpD(z z1=5PW73hy(t68TDE7l6pi*wPEnX_e|T{iGVWQ@Vh#I}Lkj&=J0O?7x;IIKbZ10M?4 z2~y792BMYj#T{e3{+F-_TZ@{cE^R_5?2ydtmJaZHqPm?P!p)jKky_h@Sh>yh%-ves zBMFZSQ@rbYbi$R6>+O*3dh-^TZh?Naph$x(Oknt1l<}$(Eu{6HLNIAl`eHbry?m!C z0cc`}4%D$&bxy{$@LC*(B7=lz)sglnbKMLw>e+I1cUx@8ceyOT*Aq{c~ zCo-fSEjw#tNmuaQU=H`yGC8A-8xHrww#B)M?`*RNHVW%!QV6x#s(3vWX_%VIa1fY* z{0mr-_~}Y^8o<$c=YuU`Jj>H9PvHir<@zd3efZq;1;TJ} z&{%Y4bz;pUD3`nc=YPhNMZcW)IP#+8cVD%~mZ?Af(NjYsTo!$0+>s<)dZc>uj`bok z!IA-z^E6ZyO5l?BCJE+;~Yp7s^K_wfRmafWT3ptlZjNndaQZKjF>Rauk~ zP{Pf{J5_OM4n|+_utJ1xN*qKmxDVgAEV`C&u*cWOIO9JaWzs1NGg7f)q&2T*>vyK0 zkFBFhjLIKXzoGCxT*bJ8RTf7dXlidbPBI*{yrHs-6WNzO6wK55*sM<9&$Qn3@mrRQ z3jJdi!cJA3U*BPZNHVLuC%g9*B)755_i`S8qW3b!BUiU;q!sm9!X53|c(mea2G(Xt z&SBK`2_^+sk>36R8`Ch2V)2YU$5aaHg$qfU&y-JA3w8XubB6`e6w-ZCT~%CPQN9fT zXp<%gRXLFU3%`emXuQ?C!0zzEynx)#+ERAx5IJ_gYevrm zB>Vz8EM%@576!@JP~lm(A~<8@EFT^)KA$DR`AkkO_A|I`?+JuT>hybNC@@jSZ^c%H50^>fXqG}t5c22`&xzQ;4(y|r!H&_~hbHi|D-wofDld&6j#lDO?3?UEB1x&>2?d|$q(Xst0X zD~`*?amGcD8}WAj+TkvsI%PsmW6N@O4_?NKc&Udh>YU-LinMV7*D`jEW*N#C+KAUfO3W88Z{$dQFjAf!GQ4bo9A?*M+K}Z8G9KQw4gg5ov&4Sp*Z}L8wr|&a%;BM;O3h} z9r?n}9WWZsZNaj`(`*LEcXOU-BxbCT!}t2tM{n|Fy}yG>!0VY*Ur|k)W5cv!9!Lx|)FU;@TOA+lB3v^4ax#0^8;w_6ZaNW6{TgG-VE=&^ICO)m zk0l2LS#F2n9EFtDVzshTP=ErN-Ji?wK2klK$KH)dAcqXezezoI!t-Y$ zZPCKlxk*=br1RO6d8)oaPbt5V7|gR0`SJ8$KB}Kp|9EQvdJ%AjOf87US(TL42uP~2 z7WDR)p`k=bUNBGZzEz4DpuoFQ>cKB*-~Qz?tvgkP?$bF+d<$2uxtGR)#BlG z2g*)Wx>QlgsoZiK4(wH6 zC#S^2(^K!7^*F9Md7;D$nZkqHNfN=@&>pq(RE=&KG}AB@9KVp+o6u6k%S}`y1Q9Oa zTO>dbjd?D#356$RJ0V*Ma`M=HZ}=q$BYmg!&hAzx_>FrJz?mQX7Q?(+W2G2jxW<;S za#L(N&t&@ErzoDdVe91X&9wF#;4s7VcRv-D59&t=a^KX1%pcrSQ=*H+Pdy^K_46%{ zd8}92RT0;V-LY^jKTj@-ZAO>j*IVW!w**}AMMInC>KKl$k$WX#8kR~eXRw2K*ChAt zx+ih^if$5m`vK09cFat{T})sznT?AnU`6|J0WzZ7xfP&~xX}k4P>yc5F1n0)$Lf|n zf5QC#&K2QmKg^@_K$a!#WJmI>7+n>agrEMO|C=*;(S zue*BQP^=26qGLthnbvHE$FL1{ZN8ybPi4*h<~QUOX5QY%4A_I1Mxu4HL7RRgGA))yY!wK&-oxQG}^}8 zyAo8{q7pvEs{)cT*cDz@@w|)nndLiMs-8r`HSn8nV*$e9LS$cq)nD?56ZuLP%4${T zjI|A`rx!C9vz&=4SBu<_C#%|IRm#+>!YkvwvLT;w|HL6KlR@ zAiSFS_}9t;E1u8eXXF$mA0=ex;T78}RADDqgFT2@<0z+d9kkWY=GAIudGHF}@apN_ z6=6L|k$=y`k*}d3O$RY|PpA^~{!6$=%VG3A-)xMwH>Zn_=s`qMOu_?fmE9rgHGH20 zG0vHI7?y}*H1wZ>uApG;Uk*FJ4k zhIWn~er)A@wgLfnBXfQ)P|C#_WC=wlh>kbB_h8v*NhD<^EE=MHl7favXURWS0BrR0 zfxiUB>b%~*iAA&`%j#TBFR=302X^7Uj!#OH+AnDrNW^S2EPqRtGYGOy<~QlJ7x|q( z*_ADS?8|Jzty1_P?tF^+4{^0oUz~yq(xBqwO{*FdW+W(zYg2Qx_>4BvB?=sK4~3LN zPpia4ai;3eZ_@#oeuKN)-@kqEXrxzh?*rp%8~YQ5qobo|`q6%nK7@QEoh&sU*)%78_3XOZ{7L_`i(NSH)}4&!>(4lHAngM4O?PyKgD$Szf&R6qa7;6r zi{tH?dN-H9e?O0p5id)`ZWI=SeLQaZ;F#wz@n>lFE8gjs$%n?F*f;9i18*nt-GHfc zR_F6P5^DyEvRlT@jHs`@e<3mVCFwH`#x$1{! zAL6`m+s%(LP)lLrXtzVh)+CW1?SBmhHJ!cCn^1q9P2YO6%>H0_`~}*unlT$E=k9D3 zw+JU;+^5ByuJyFg7?Fo;VlWe|YImIvc|>>jC9^%#YW>1V!^hd!*d9D})#?rP1~czq z-UZIcjiD#il4nC*gx)H!bR#9XFy$O0lkeIM?pISKrfr?H5G1&HyK>Ia8>hhrk3{q9Riclaet;1Q(L(^b;qk+JditZdhr>UZn{=spm;~u7&?ioM>luUnlYZQl zm6dt-i|z6QG-r%X!a*Kt-;gRYnF`!NWMF8ZR*WI((%Lxk?Mg@r9k-`3sGVOuCQH`E zxLu@9W4YDL)2nsJg6l!wU%lQT;9U!6i3?|Nkm!`7G*SUF)b2}Fl_(JCW0~Mt#lKkv zUZ9(VF6|5643ncJBT(vjxI z%-&3u+b&;PQgHu&0EW7MrvKpy{w}GzCH=oZ!%$xF%x7Odw~B?y8NV8aMi2~pOTeme zfQd_)A#%%VSRpEfcg9|wN5Z)A(Hx)0>1>tC%}73#2?Oa9wnu~z#Ym>&^lGVmrG?Dh z0XC!)4$_~y^PN;~8|wpd;Hz6JNZWvSb~yCe!WhoVsa zdH#oO=$(YJz?l#apqv;?3;>wilJ6t}5~d;!+dySl!|CfDIXxj+nq!?Q@JSB)&C!;K z|BNF>jaT%8+u*)efhyJwES~^`@|R$kcaG!}LY}BkA9J4U2$XX(3R7n)f_Rc$8GkSA zhaN13@9Hd#pDodOt&QK{w2M=wpy5LG_@r~nv>hFqTJk8d-z0z$3Mye*x0PC9-Cg4% z5;8xibhET|m)C#99fx?yPw;2yP2a&qPpRJWyB$mhaf^zw(-WO+84h3T>owhx_5YFc zUEbfDZd~|-o&xsaNUK#TXHB%^s6|%>VV^g+3LTJy+3pci*p&NfXaV)pi#h?sh^X)x zJhl!r|G_qaKd#*jAbE1NYPZ<`M(nuIt2$W5(l?1D~DVph$!y55q1G zepB~c9knEQD@rKad%g~#!ag~!ESZ=;&TZB8GHl;8@4$OpSy;HEMCf zX0pONkxs7-PqZuW?%1oqDK8Z@qxHff*V!~`o#CX@eB&HuH79h|+*oi1ZL7CGZMdF7 zhY;R+>$RUYTJVDFEs%$Y!@h8VB8BRW(|#H! z?ry!6@gmGaSH*zCgVaBs%&tOdxHxo=GP@UHD!dp@ekS(-FV%Dfi(uI=F-g!b%uv}l ztR|WO`j9lP7z2vH_{}JrTIjJK2A}J3W8wn1{O|y8p-TmNlXf$Iu`!~HYh~O}Y(IRk zoI;p?^o$Z$3Kzt!8LJ&Q=2lMlCA_P_kU-DG4oz-a-rtMfrYmN&GemCjr99kI&#adk z-bDkb6(E~WIO=L|HZb_DFZ)+Xf?T(oqMbw?EjTZFf<&FnHZ!jmHI7*Y1+!nluLgMU zpBAjhwMd#FXVbGSmLlZ&uHvSU)Ft($Fnl_n0kV}SY|H1oDQn@#iz}=G{g%E^00q+kG#dS=1DfZ zd-p959}ANY$^iw78zY=1Re%^E7_ZF3Ao0O^H(s@d1k9X$;$Oj3rD_chaR;4hB*m+@M8iomZ|d)SKFFQz zZ&f^f97`ruXN<+_!uubQ)DbnnE1*Y$@iSz{Uh~LqKL18)tG=jTmK~3yf#8WHkP~4w zeyW}-rcv`osJG?UU}v_Wgl7gjD#}tqCm_%q#`+O933A)P4xL zeNSl`w%;W55{D7hp;v3lYv83td+Zc_EiXAe8+ZI0MfGK6fNt=qGgLWAye-(_FvDFR zXI`0!?Nrq%8X+A0Hy~Aj^97K>Kmj~~1(aaC$v*ONu5A7?bGFpb0(}VK!=L7ov|=j; z8K0ThYL(#YV3|36_%c);mFLPC3a7G9-H0-VW zYuwz7tV3MC@$d;iEF_vHRV_~9iZXK$lKsBYal_r=yUdM&Vsh$3vq6InHEKpe#@40` zNAs*Wle)_(I>;>f#UaiCB4yZsy~u*EKUmiwa;xGVj^d9Z{TsgeFD>2O zgjJ2c203WNo5yD41y8Y?$wKp<<6>X1-=#CKz;`^1MBWT zx|cOo6>pgsF(L8VpbMd1*Pp)-nuMtTA?s31)hIOM)=t$)Sh4%9DWd|&mHY}Gdl3#d zT~{;))%zQ}9EDy*hGw%Ss!_!RsxmOf_<#}i(eT9VxUfw1IH4(~42eI3a1ahXc=fg& z2VOMwM^|12yQTo(W~c9pYtG^O{^|C1V6o5xuhAPbRl0o5tf^V!7@JKyz2}C70_nOX z?_9nPQ;Dcg-A9lo#jdc}T);E&+55RfV>GQUo$}M_yMD(h=!xLDlWxNJU~7-X%ajO= zTUb*leCv(Ed->UXzU=MrxhR6Ohh`)8Ve!=-hW}AX0NOk@^O$&BI*m!wTohdZfPCoby%TSodG}EJ;8Y`nn3%nRplO6PBcezbGSO zG~XvzwjhC~jfmX71k8jGP?X0wfgUE#1BwH#XN_-N9Iw{!9UHGB`+dK( z1K0x1$l~#wlJx7W))1S$3>`>&Q6^in8ikq>1T9fUQHRV0#S(}n&<|Qaxfq-~f{Q*< zt@V@NllAf4#mKIowT+8(57vF*F!&rH31q)nDLALJF0`z#vr1lD>@zp~I?p{ivy(Zx zYp`QNbi0-wRnoOktXK1dkH3HgB|*!+$DKq=2J8eS?Z}LwIm_!IK}qh3tRkfjA(JsSN9cPW(2XTR-03XlQ~DZVg0A1i0-su0{D1*FI)|a(QTI791yEtKUs87M5FK_bA%4DcA9i$P(vg0^!8Ie2R26KCF{QMw9`DcON2nQ2q z;w1qap1_Xx7fxrhQoNbG3vuC6shri&)vy4T=v{9BLA_m56B~r^^?9E^VNi$t!aR|_ zZICeRFo0xa%>GT6?)W~fe)()}f}{D%M-NIVrN$3!_f4^VM+hHrqNTrYIq5_&xc@{5 zeYb2A5!RMF%Q7?ha!|!z(+sz7vw72BAy8CqrktFM@hu3?exlP$%&@>?7Ar&a^tJ#a^RQ97dI^S)9-V`=dtIh zZ&A+NVl{%XNrzEiNBC8Cz!N`(lLX2K`?*;7${Ghg9R{a=|DMM~++>}p5dxGhgDemeEk^RtoZ=b1_6uCeHGrQ`k$dG ztnLvOJe>&}STr{p?cbUh6_PNZ5&^+Ls-)ygI#E`y#f;${XdF5aG`(7zrP6(QG2^7k zMXh^HxBei-u04|P9ue!C#^ z0yvao)oFJvfubL4Egqd&m&_E0`b2z% zg!;u@G;^&&He~3JsCh9Cnx)yasl#w*#m=gf_rjSKh^f#CT%fKKD)_{GI8>z3sAbwm z0l(QJkpd=P8#}d*?F|Xir3{L#W#RYy({c~0641}{yzl;dOi#1t%q*s5K*hqZVP;@dTG}RBaM2$Madsizu~acxc6t@{~SqE(!otrsz3hp>Fy+~HU0wmTko25 zP4@mYO-Ef_GcL-Sc%%K#85zL3Cv{h}mhr;#HJ0kI z-{I1G$NGH=R-D>pXi!!f3zzq>7@acVR^pBP+1VG6p}H99%{e>$3Q(QDb*1d)V|vL3)N_%ILP|G&v)_w@ISau#l)oW?c7|7{mSK{Jjiae-b{0KA`C3 zR-vDPAdd4~>er9GQ-db{ zM!+RWt5OBge~T^|++1&sU3C*r)lMVZ;bFFQr(~UAaU}Nkvad+Qte5di+FK@ss4C8_ zcFLVr*KY(N65cRlh33W?{rRvqtX92$qO;ZQ#HJc`0${SOy=i@{?~x3A(H zuCaeF^Y+#6UhjckcE~`K*INqq1j?FzdE9?cl86Y9fD2Z_9|TBrY<$)H`2R{)yT`%pYt8y#zev+!Il&jd=Np z7smcxi4E<=4{v7_d4FH9=Uv`r9W9&|50GU9acGs4X&ZdKqJ%(B*)rA~YJ zJns;kZEtA4=OQ>RkTB}puU7MD$m9zl=MbrSWBn6a$OsYuiZ~$Ntg>^Lxum3;*w_TF z$|Vvi)Qht`K>d0TE74RTLlxB5Wx)@t68pSGNr>RN_qV83eUac$fr^Z}z~IdU#E*mh zM+O|vZCq6(@|d`D%m{4*RPm<%UK1c+O}gJEXO-O_ayl52hu(;pEa|EYbu;zj_{$#; zcTxHLJ$utb$db5Cth`NB>C;WHX`j}^GQ?!#J?+R|8WE7w`z2*3h;(gEjg_2r zMU+oq;`_hjf`2PMuvDxq2m8L&&{InJ@=u@65q8njcB%n9_tWtcy!!eiszMLq%;mTB z!$(<{;1-7`It3tS#-FuucR6gcKfynVyMk?dPE;18=_!p~GL*p44?;klBc;DX!ha8g zLqr1&z9khjN5j4BLz)dDH{;gKRlh#N4`YMS&5ILJ3m+JyF%;iU;P59p-5R>ipK#oM zS|Yq?#(xowCXb*Gy!XNlUnb&>`NL}%*8q#_g7R@%6m+6bW^h@}>~pb8cDZ_^?jNxi zf}Xd|_c@6)T-8TYe{~kU=(#rb9FEmq2rM-dfTkvka6VQ3&S(LZr&N@$2q~?JuC(w3 zKZC{HLb(oz(xXYE394G7f#B%l1f36;qXfd0JB=vVqdMglGpl9^ zN@~48HRx5DsGj5|CW7bo0N50*z4Un`;p7gS1 zEC6yn3-4O)0XZ{kVNNkAF<5n=+r_cfbm@AtH@2|j*5qw^Yij>)-Wx4Xy;^76*RPQo zMqY@)gaWK)%8iMG)x~)TnUrAQsoj&MC9T$2wX%4IWVVNp#5->}ig4#VQ89``s;a6E zRtG9#7#14+%=+SZryBCGYu&HTft*Ql8ym7QGIWD_-ep%rW90L*1qF_(JKs@}qxBuh z$LJUr?(bV8BSxPjh`2rTv z=JN9LN(o#rCa#1)^}01eK{Mu~C@>dN9*Nadaoa<&Ji(8+{sGQ~awn{WoZ}ba@u`2> zB`U0D_*yVE_1{N6ra%jz({2DVcsL+1qLVJqlClR+nIt3=_eb5y{HDw+3`Bu<C3lN5H^>Ae=QgLh^`zw8!&3?Ib=7g zVsCF>P=C&{y~!+^g!-hInN-_mC+=+L=u7o`OdmSM15Y<$8zf>-uO`;1T-T3#JBAow7om7YI2Xs!A}HeNBv4ATAt`X_)+DECIqz56sH8F zLA_~sSH+sn@jAnI8=1Ne-yN4|mbe%=KJ=orz+ec{3 zHBx`42rvcqE6H*GAC%sBoy+FdI}n$~Ua#0^y5)DV?|i65TS2tClLZfWa`$)QOe3@1 ze{eu@7m6Y%4r_G8grbyv277K3AnsTI&oc~g%u(REyyqd@{C&|vJWW+FciSstKTIeP z5wgGb9HE8FwGFv)2Jf8~CQWzXP|CD?L~BOraPJv`XX8kdECwY_bti*58mucfIA~2= zuiDfv_M!w15O=UGW8J$);QNO^S6>qo_3obtB4aPooC7+{8O}%fTFoEUbIuo&KfuYmBQ!+hxJ!Knb9zpONNw zQ9plcY&b|O*~(esP!869w4i@^5|mf-6gs)Z5Cv5B(~L#>M+B&hIn}JyJ6=b8Zh(K(8m}}9-f%e-1n>Zl^*rBqzzP8y_T9_p-UkNPfW(y z`r#D*1sVG@TF_Ng=A)Gbx>NE;_~$LehPu6BSOY^+`3XdszOC0aa-_egd)SFm!wC5S zM2i0~QK6GC3t*^abO=Zpc%B4`jFO{(k{_VBSd5((@(QT%_td$Sf~h!g-TulH=Tn!3 zJ_x((ISv0@>5Zdfuec5;Zb-2`;!YY?!1nK)9O^$gxq8P5b~ZieHIpt^gkl~0tJ>2> z6T|xD*fTbP4P?3jt@Wz%W5EPRdL2gvSYDuf*(-0|t`~YaLwVK;syw1)#D>$xfwPTb zy=7=n!xhB;`4Yf0jjYf^BzEeT&z=ig-3W`;?tGeN#&MkRsCvh;W(-7WljwJ4#dx0Aaq z#%?=NpKUCbEcg=&U6q7GU{fwXzmrbw7jWcpBz*|DI?q^jl&wg2jlJu{DtdGlTFK&9 zD;DNMPoi!3K%|K&d{yK@|LWokxYuIpUak5Qvf;k@Bo<2bSr=;cS{7o2+HlsEE(D?4 zLw&CXEX2Mml%cuou4G0~ovBgIoXKS;<>wjmw%|2%x^nk;M#I|U_{hT~`x4ROL;|~# z?=865JT7?Z#J{wPH`mpl5wLOktRjJq^G}_>IuIb z9hSMT*??~ze-|&}DaDBDh>7$_?l7ewsTIKKxAjMdnmrXjwzya2?8y73dS`!zkIlx= zbtlk>GeNY-`1FYK*a}|`J0>-7)X+bTsL?)i{rEOF0Et@F(_uCHyAC62# z&o0vZ7ob*%`HKdB8aG?#6DwBilgpVfK6Itv_)yUFir;Xc$Ut!F{?L%1|Em6|#oIk- zwBc`ZZ*;1@=I>kav|wNydm6{@LZ{iIn%P%2aT#61NIzcWzY4x~ z+0BL62$n`(b-Pvh?rafIVs`mZR+Z&Jk)|ESrta(X z(6bN4nd-yjDb%Zm%yzPU>uAq&w^7x}Enwv9u_P4GQ1JUHz4$0ldq(t$!PSrUz=gBf z=FkF>Q^Zb((l(GA++W4Dx*8Ro?RH-tDB%8?RVyEppz)Z8BanBvlbBB9ob35JOYR*E zoIqjj92NwTXjv$jlH2AXk)JmryDJu-QC;1lz}qmtZe^L7@7r7IY3G@4{rHB8_XjE8 zw>X7OXv6sS@d7xX8mhnWWU8O&CdB?K$KbhPog6{pHoq=-RzK{=pYy2Vn}gy3<>R8p z>=%)jQ4sLr@x`$BPg18j)bEdr#K?TcDXSi}0p?}G54ezle)ew{GVb@J)f!d6&2iGO zg1&bVu89hRAg^BiWfA|IU;M8owVWQfgpoT%O~f}0ePjTg@x+gKOy>WbhoZ$1!+C+OI2 zeqUM!ueO#&{497O>)}4Q>x<1RSn)Z-+DD&DlqliVSN_z2*KH_7`HyU+z#6b-B z`=QwRd*1iZ7GmZ44Izkseg)s0l3IP$=7UA)UctPmR74I>{~E!13R4mh4HJn!P*;bY z@E&`#Cp@(;YJr~FTlRy!>DD1TsGy63FKEq*kkT-HExb5+s5>^LD$JdC4z2GsiI%f4 z;nKsPZY~=BbFhHyi+cI@UM%+TrA3mF3l2zOV{C<38W>Y};GI;++?TgYvOBcr@ptTk zlTJSYx_VHcB2E-l(K4r5%p7Ay&63HauddYu2Qe5I1JzO330ByL1xG}yE|rr5^EzFW zTMtg=l_d?Y)y*FuurniUJC|R^069>3O>OnZ5@0itCKTaUo{mNk^PD)Chx*dPReIt1 zR#WLKm8u&~;?LS`yn!#(gR6nN7dBy*BSEfWqbzu1Sjx7MQfSx~TbLvQ;UsHoJ&B9+ z0R?%zi!VJY1w#DaKS#egJ?QH6xWs>L7j&CAJUh#wEdAglMOkzlv7iXhF(P#*he;{W zHVdZasQ%Sp=ana|&O?*H=!`=pTz^;>A(Q=3e;J0Hj>Fs9MJ zv_E5a0d8!3FZSuD%A)(%sA03`f8W8lau@U2`U-AB@iNwjR$oUBbeI(FYRXJL+dM%P zdIN%El8`-~>m)47J+{GgXv6IyWP2>DBnMOBPkcf!u`gsnl>$<;36SvEK58X2TunL8 z-CCLmJGc|IFK4C&)o@}xY%EPSBn)r8|-S=85>OJ<3uC_j2DFm=Q zm08eJi8eYP_X{ayDRE!SGVAf_%|Y0u$1~>StF$NWFeG6cyHmWFIV_!j^|GvDx+-K= z^nw}EMxr%YMTqlI2s9HWyzs*;VN=RFL5RC>>jlEou=lY^9U4i`h+6@;=xptnw4X*E z8Uo}6Gq}4nQq?jK5fOe4)wapcI;FFp*t%GT8d6DZ+vnzXhWGGc)46QXLo|uWtcKD` zds0(McLpV(#l>Q6kCh>_begUf>D0rF5=6vPL4ET$o%ek-VCgZhdp}^aMP&wyOfMWw z=g*lsf*x#}+!Twsp=2wO!w3!TbV-agypx9Z>Uo+3s@SrcE~%Se4pYDG&aEuxz>L@m zMzNycY8Lz%p5bC8U!KB)Do5ze7}Fh7rh#D;#a^iOpYCuxpnlLfUmM1`mL`w&Diq|K_sa8fVt4LOF zWb8V@Qi5T`!3xn07IBnd2Qmd6^iZf$bGa&E`BSL(E?c+55L?> zdqkaa3)}~4RJ+ox)h?!ibCCk{e z91%f=B#OtFvd(KRdi>_`#Um=uC&9UjY?UV&HXTXtr#yEOhCY^xp=HZ|SefEG2I~EJ z3Qf=LGCxpPYeqS0I!nX{@uhcl`13sO_Bbx`dMfT(W&cr!#EcG7g=_}X)C=^tq~k}G zs$ndymOUjhF_`T2e9~g%N%(ly1!T)M__!uDFU8jN>UD-dUADK(XzSVKQ%eIVCx)&wfm<$+!$!8yi zKMW5fCaK{250MNU4OSy<*W<5|MF2P?$r>GN_ekubdcY21sMuDkH)5;?De>N)b6;f~ zSh4pfKPQ*P7M!1Cxi3r6G3i!yG9vm&gSPyZYf^R;?<|4IK(2cyRk($&aH3l@m=f((UF;| z5Q8V~H$P72eCzF?(C4CeryXsl1?Th%s99@8x_d^tTgkiJ<*7kZ zKWAY(tX!+H<@t4f)YE{y1d^o-*M_?`0}J5?q%IJ!ZB>&%n2Id6_sLL)esi--w(y7V zw(k~HTRVDXl-z#2$O=gNsxIxLuk+o6 zZ12$72ggdEL(YpBEZcb*lVs;pmb_vGTiyN@wVnnkbsrwHV7h{)!w)_F%+cr!%`=i4!DD& zk%XXSrh2C3;>q+??+U&~mk^aJF(m(OX;|42vox++r6*d3%#Ndd_TKG6^U$jIqq2{s zJB{1cq;neu`iG)XLp`wSY~PtG^^B#wsRTBgwWk$TTRi-&zNq&sMwsq4Oe+(Undj=M zt6?F-kjr}43pr_z3CnFk*Qa2)stZEj{F3INXbu#&X#MEbNd_*)$lH8gd6`ul@Hszw z^tw0cb2nwmewSk3FB0(jBdQcbnjg3TtNC_Iwk}>7?1p%s3OQ?HMWkDTYsP+VXo#er|^WL5S%fib!nKI%aOQkR_u+pn%$;Hq7K>ArLoZ zRL@zTO>RLPLo!Sru!zIr7}-KVa9<;RO`pCu=4G@#z(uJQOl+V`{WlWwS7`L_c-Y?- z(7i_$?4_V*AK@-ZwysIQv}7Ay^iYJb`!leNa0PH-qj|S#S%;ApjWUbUa_!^>&Ior( z@2x4+@_MTEgQw0I{mp}v4~!A(CBT5OU@kpu2jI?^Rz$iMQidISmIJ+(*@Ja;$+?Wq z494oGltYM&*X5mN-fRLoa*(^gTvGxRw{Vh{6l}|tSRUIxg1_a=bx4qahf?O;QtfRA zaXy-V$um+{nQwG?$0P>wi_VN&ezznVL7{^7usMJ_BMXXSGwr<7_;BlTC5*vsQ^~>4 z-ap7U6)*Y6Fj=}1+c9LkJL@e2XE;8jFnw$oyng+_^8+LBx!=Gav5-?+ zJr;AHdqYH(XF5?Vdhy3tC27v%uqf_Yoe zo$UaLO`Smw%8URywt>$ke_4LOsGt~lV>x{qty&QDI%#<6N!KL4q%74hdeLkd6F{f; zPv6NC?WLDoY6G9S+@dnIS1ffN!n?v=1LVboA|gx7JVQXb= z@K<(J=C3peH=YT)l`J9KeOWQ~!ZJ+;B&6Hh8c0ZBG&m*_5@i1dIoUs+m-LC52k>uG PkmRJ4B=f~zefs|ZY{Hvt diff --git a/template-method/etc/template-method.ucls b/template-method/etc/template-method.ucls deleted file mode 100644 index ec0ce620a..000000000 --- a/template-method/etc/template-method.ucls +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/template-method/etc/template-method_1.png b/template-method/etc/template-method_1.png deleted file mode 100644 index f7cd1a07771cc6da554474967af2418b13ef0112..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34592 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 P1%FC%NZCATQ~&=1?cAFf diff --git a/template-method/etc/template_method_urm.png b/template-method/etc/template_method_urm.png new file mode 100644 index 0000000000000000000000000000000000000000..b7babccff96da7d88fb99ae5a705c7d4f025904c GIT binary patch literal 36470 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∈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 U>vZmeO~f^#f|76Z__aR&f82J0kN^Mx literal 0 HcmV?d00001 From 87093cf2214df0ff58eea3f07697443fd88a46e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sun, 13 Sep 2020 18:23:54 +0300 Subject: [PATCH 21/36] Update README.md --- thread-pool/README.md | 34 ++++++++++----- thread-pool/etc/thread-pool.png | Bin 14796 -> 0 bytes thread-pool/etc/thread-pool.ucls | 62 ---------------------------- thread-pool/etc/thread_pool_urm.png | Bin 0 -> 30120 bytes 4 files changed, 23 insertions(+), 73 deletions(-) delete mode 100644 thread-pool/etc/thread-pool.png delete mode 100644 thread-pool/etc/thread-pool.ucls create mode 100644 thread-pool/etc/thread_pool_urm.png diff --git a/thread-pool/README.md b/thread-pool/README.md index 62a2a3339..de6403fe8 100644 --- a/thread-pool/README.md +++ b/thread-pool/README.md @@ -9,16 +9,19 @@ tags: --- ## Intent -It is often the case that tasks to be executed are short-lived and -the number of tasks is large. Creating a new thread for each task would make -the system spend more time creating and destroying the threads than executing -the actual tasks. Thread Pool solves this problem by reusing existing threads -and eliminating the latency of creating new threads. + +It is often the case that tasks to be executed are short-lived and the number of tasks is large. +Creating a new thread for each task would make the system spend more time creating and destroying +the threads than executing the actual tasks. Thread Pool solves this problem by reusing existing +threads and eliminating the latency of creating new threads. ## Explanation + Real world example -> We have a large number of relatively short tasks at hand. We need to peel huge amounts of potatoes and serve mighty amount of coffee cups. Creating a new thread for each task would be a waste so we establish a thread pool. +> We have a large number of relatively short tasks at hand. We need to peel huge amounts of potatoes +> and serve mighty amount of coffee cups. Creating a new thread for each task would be a waste so we +> establish a thread pool. In plain words @@ -26,11 +29,18 @@ In plain words Wikipedia says -> In computer programming, a thread pool is a software design pattern for achieving concurrency of execution in a computer program. Often also called a replicated workers or worker-crew model, a thread pool maintains multiple threads waiting for tasks to be allocated for concurrent execution by the supervising program. By maintaining a pool of threads, the model increases performance and avoids latency in execution due to frequent creation and destruction of threads for short-lived tasks. The number of available threads is tuned to the computing resources available to the program, such as a parallel task queue after completion of execution. +> In computer programming, a thread pool is a software design pattern for achieving concurrency of +> execution in a computer program. Often also called a replicated workers or worker-crew model, +> a thread pool maintains multiple threads waiting for tasks to be allocated for concurrent +> execution by the supervising program. By maintaining a pool of threads, the model increases +> performance and avoids latency in execution due to frequent creation and destruction of threads +> for short-lived tasks. The number of available threads is tuned to the computing resources +> available to the program, such as a parallel task queue after completion of execution. **Programmatic Example** -Let's first look at our task hierarchy. We have a base class and then concrete CoffeeMakingTask and PotatoPeelingTask. +Let's first look at our task hierarchy. We have a base class and then concrete `CoffeeMakingTask` +and `PotatoPeelingTask`. ```java public abstract class Task { @@ -88,8 +98,8 @@ public class PotatoPeelingTask extends Task { } ``` -Next we present a runnable Worker class that the thread pool will utilize to handle all the potato peeling and coffee -making. +Next we present a runnable `Worker` class that the thread pool will utilize to handle all the potato +peeling and coffee making. ```java public class Worker implements Runnable { @@ -156,9 +166,11 @@ Now we are ready to show the full example in action. ``` ## Class diagram -![alt text](./etc/thread-pool.png "Thread Pool") + +![alt text](./etc/thread_pool_urm.png "Thread Pool") ## Applicability + Use the Thread Pool pattern when * You have a large number of short-lived tasks to be executed in parallel diff --git a/thread-pool/etc/thread-pool.png b/thread-pool/etc/thread-pool.png deleted file mode 100644 index 9e88a91962466ff5df7768abe04e8f5a9301625d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14796 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 ZnWDj8L-gf - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/thread-pool/etc/thread_pool_urm.png b/thread-pool/etc/thread_pool_urm.png new file mode 100644 index 0000000000000000000000000000000000000000..3d433824f95a5f9a9076e7094ac81a67a1d982e4 GIT binary patch literal 30120 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 Date: Sun, 13 Sep 2020 18:26:52 +0300 Subject: [PATCH 22/36] Update README.md --- throttling/README.md | 19 +++- throttling/etc/throttling-pattern.png | Bin 50223 -> 0 bytes throttling/etc/throttling-pattern.ucls | 88 ------------------ throttling/etc/throttling_urm.png | Bin 0 -> 53754 bytes .../com/iluwatar/throttling/CallsCount.java | 1 - 5 files changed, 14 insertions(+), 94 deletions(-) delete mode 100644 throttling/etc/throttling-pattern.png delete mode 100644 throttling/etc/throttling-pattern.ucls create mode 100644 throttling/etc/throttling_urm.png diff --git a/throttling/README.md b/throttling/README.md index 257bce54a..4a77638e1 100644 --- a/throttling/README.md +++ b/throttling/README.md @@ -10,12 +10,15 @@ tags: --- ## Intent + Ensure that a given client is not able to access service resources more than the assigned limit. ## Explanation + Real world example -> A large multinational corporation offers API to its customers. The API is rate-limited and each customer can only make certain amount of calls per second. +> A large multinational corporation offers API to its customers. The API is rate-limited and each +> customer can only make certain amount of calls per second. In plain words @@ -23,7 +26,9 @@ In plain words [Microsoft documentation](https://docs.microsoft.com/en-us/azure/architecture/patterns/throttling) says -> Control the consumption of resources used by an instance of an application, an individual tenant, or an entire service. This can allow the system to continue to function and meet service level agreements, even when an increase in demand places an extreme load on resources. +> Control the consumption of resources used by an instance of an application, an individual tenant, +> or an entire service. This can allow the system to continue to function and meet service level +> agreements, even when an increase in demand places an extreme load on resources. **Programmatic Example** @@ -77,7 +82,8 @@ public final class CallsCount { } ``` -Next we introduce the service that the tenants are calling. To track the call count we use the throttler timer. +Next we introduce the service that the tenants are calling. To track the call count we use the +throttler timer. ```java public interface Throttler { @@ -134,7 +140,8 @@ class B2BService { } ``` -Now we are ready to see the full example in action. Tenant Adidas is rate-limited to 5 calls per second and Nike to 6. +Now we are ready to see the full example in action. Tenant Adidas is rate-limited to 5 calls per +second and Nike to 6. ```java public static void main(String[] args) { @@ -171,9 +178,11 @@ Now we are ready to see the full example in action. Tenant Adidas is rate-limite ## Class diagram -![alt text](./etc/throttling-pattern.png "Throttling pattern class diagram") + +![alt text](./etc/throttling_urm.png "Throttling pattern class diagram") ## Applicability + The Throttling pattern should be used: * When a service access needs to be restricted to not have high impacts on the performance of the service. diff --git a/throttling/etc/throttling-pattern.png b/throttling/etc/throttling-pattern.png deleted file mode 100644 index 59e590aaf6ddf262b0f036cc55655cd4d4e5819b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50223 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