diff --git a/strategy/README.md b/strategy/README.md index b2330ceb84ce5901de170eced0c779dd374f571a..2d2cbf9c4823cc8569cb6c4e94303119036fee32 100644 --- a/strategy/README.md +++ b/strategy/README.md @@ -122,6 +122,51 @@ Program output: You cast the spell of disintegration and the dragon vaporizes in a pile of dust! ``` +What's more, the new feature Lambda Expressions in Java 8 provides another approach for the implementation: + +```java +public class LambdaStrategy { + + private static final Logger LOGGER = LoggerFactory.getLogger(LambdaStrategy.class); + + public enum Strategy implements DragonSlayingStrategy { + MeleeStrategy(() -> LOGGER.info( + "With your Excalibur you severe the dragon's head!")), + ProjectileStrategy(() -> LOGGER.info( + "You shoot the dragon with the magical crossbow and it falls dead on the ground!")), + SpellStrategy(() -> LOGGER.info( + "You cast the spell of disintegration and the dragon vaporizes in a pile of dust!")); + + private final DragonSlayingStrategy dragonSlayingStrategy; + + Strategy(DragonSlayingStrategy dragonSlayingStrategy) { + this.dragonSlayingStrategy = dragonSlayingStrategy; + } + + @Override + public void execute() { + dragonSlayingStrategy.execute(); + } + } +} +``` + +And here's the dragonslayer in action. + +```java + LOGGER.info("Green dragon spotted ahead!"); + dragonSlayer.changeStrategy(LambdaStrategy.Strategy.MeleeStrategy); + dragonSlayer.goToBattle(); + LOGGER.info("Red dragon emerges."); + dragonSlayer.changeStrategy(LambdaStrategy.Strategy.ProjectileStrategy); + dragonSlayer.goToBattle(); + LOGGER.info("Black dragon lands before you."); + dragonSlayer.changeStrategy(LambdaStrategy.Strategy.SpellStrategy); + dragonSlayer.goToBattle(); +``` + +Program output is the same as above one. + ## Class diagram ![alt text](./etc/strategy_urm.png "Strategy") diff --git a/strategy/etc/strategy.urm.puml b/strategy/etc/strategy.urm.puml index 8b9daabb9db43f67483d34817ab3759c3769faf0..d9b9aa526d9ab5f61d6546e368491e41c73d69f3 100644 --- a/strategy/etc/strategy.urm.puml +++ b/strategy/etc/strategy.urm.puml @@ -14,6 +14,19 @@ package com.iluwatar.strategy { interface DragonSlayingStrategy { + execute() {abstract} } + class LambdaStrategy { + - LOGGER : Logger {static} + + LambdaStrategy() + } + enum Strategy { + + MeleeStrategy {static} + + ProjectileStrategy {static} + + SpellStrategy {static} + - dragonSlayingStrategy : DragonSlayingStrategy + + execute() + + valueOf(name : String) : Strategy {static} + + values() : Strategy[] {static} + } class MeleeStrategy { - LOGGER : Logger {static} + MeleeStrategy() @@ -30,7 +43,10 @@ package com.iluwatar.strategy { + execute() } } +Strategy ..+ LambdaStrategy +Strategy --> "-dragonSlayingStrategy" DragonSlayingStrategy DragonSlayer --> "-strategy" DragonSlayingStrategy +Strategy ..|> DragonSlayingStrategy MeleeStrategy ..|> DragonSlayingStrategy ProjectileStrategy ..|> DragonSlayingStrategy SpellStrategy ..|> DragonSlayingStrategy diff --git a/strategy/etc/strategy_urm.png b/strategy/etc/strategy_urm.png index 8e15c3c36e402057e7a20f07956fce737fd4bd94..67d19acae62d2f4b36ca6dbe9e28aaf91f659ae8 100644 Binary files a/strategy/etc/strategy_urm.png and b/strategy/etc/strategy_urm.png differ diff --git a/strategy/src/main/java/com/iluwatar/strategy/App.java b/strategy/src/main/java/com/iluwatar/strategy/App.java index c526c791787da568702c5fb9c29a4639fac8055d..6313087b0bff555ebc0328d565744297212e3bfb 100644 --- a/strategy/src/main/java/com/iluwatar/strategy/App.java +++ b/strategy/src/main/java/com/iluwatar/strategy/App.java @@ -45,7 +45,7 @@ public class App { /** * Program entry point. - * + * * @param args command line args */ public static void main(String[] args) { @@ -60,7 +60,7 @@ public class App { dragonSlayer.changeStrategy(new SpellStrategy()); dragonSlayer.goToBattle(); - // Java 8 Strategy pattern + // Java 8 functional implementation Strategy pattern LOGGER.info("Green dragon spotted ahead!"); dragonSlayer = new DragonSlayer( () -> LOGGER.info("With your Excalibur you severe the dragon's head!")); @@ -73,5 +73,16 @@ public class App { dragonSlayer.changeStrategy(() -> LOGGER.info( "You cast the spell of disintegration and the dragon vaporizes in a pile of dust!")); dragonSlayer.goToBattle(); + + // Java 8 lambda implementation with enum Strategy pattern + LOGGER.info("Green dragon spotted ahead!"); + dragonSlayer.changeStrategy(LambdaStrategy.Strategy.MeleeStrategy); + dragonSlayer.goToBattle(); + LOGGER.info("Red dragon emerges."); + dragonSlayer.changeStrategy(LambdaStrategy.Strategy.ProjectileStrategy); + dragonSlayer.goToBattle(); + LOGGER.info("Black dragon lands before you."); + dragonSlayer.changeStrategy(LambdaStrategy.Strategy.SpellStrategy); + dragonSlayer.goToBattle(); } } diff --git a/strategy/src/main/java/com/iluwatar/strategy/LambdaStrategy.java b/strategy/src/main/java/com/iluwatar/strategy/LambdaStrategy.java new file mode 100644 index 0000000000000000000000000000000000000000..d7480601738b674e4de8750dc70ca830a393cd9f --- /dev/null +++ b/strategy/src/main/java/com/iluwatar/strategy/LambdaStrategy.java @@ -0,0 +1,29 @@ +package com.iluwatar.strategy; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class LambdaStrategy { + + private static final Logger LOGGER = LoggerFactory.getLogger(LambdaStrategy.class); + + public enum Strategy implements DragonSlayingStrategy { + MeleeStrategy(() -> LOGGER.info( + "With your Excalibur you severe the dragon's head!")), + ProjectileStrategy(() -> LOGGER.info( + "You shoot the dragon with the magical crossbow and it falls dead on the ground!")), + SpellStrategy(() -> LOGGER.info( + "You cast the spell of disintegration and the dragon vaporizes in a pile of dust!")); + + private final DragonSlayingStrategy dragonSlayingStrategy; + + Strategy(DragonSlayingStrategy dragonSlayingStrategy) { + this.dragonSlayingStrategy = dragonSlayingStrategy; + } + + @Override + public void execute() { + dragonSlayingStrategy.execute(); + } + } +}