From daf7af813cfae915907e8a71d946445679f1018e Mon Sep 17 00:00:00 2001 From: Andrew Morgan Date: Mon, 6 Feb 2017 06:51:56 +0000 Subject: [PATCH] Implemented strategy pattern tutorial (#1110) --- .../strategy/ChristmasDiscounter.java | 10 ++++ .../com/baeldung/strategy/Discounter.java | 7 +++ .../baeldung/strategy/EasterDiscounter.java | 10 ++++ .../StrategyDesignPatternUnitTest.java | 58 +++++++++++++++++++ 4 files changed, 85 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/strategy/ChristmasDiscounter.java create mode 100644 core-java/src/main/java/com/baeldung/strategy/Discounter.java create mode 100644 core-java/src/main/java/com/baeldung/strategy/EasterDiscounter.java create mode 100644 core-java/src/test/java/com/baeldung/strategy/StrategyDesignPatternUnitTest.java diff --git a/core-java/src/main/java/com/baeldung/strategy/ChristmasDiscounter.java b/core-java/src/main/java/com/baeldung/strategy/ChristmasDiscounter.java new file mode 100644 index 0000000000..644c57aa26 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/strategy/ChristmasDiscounter.java @@ -0,0 +1,10 @@ +package com.baeldung.strategy; + +import java.math.BigDecimal; + +public class ChristmasDiscounter implements Discounter { + @Override + public BigDecimal applyDiscount(final BigDecimal amount) { + return amount.multiply(BigDecimal.valueOf(0.9)); + } +} diff --git a/core-java/src/main/java/com/baeldung/strategy/Discounter.java b/core-java/src/main/java/com/baeldung/strategy/Discounter.java new file mode 100644 index 0000000000..ed6a00cba4 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/strategy/Discounter.java @@ -0,0 +1,7 @@ +package com.baeldung.strategy; + +import java.math.BigDecimal; + +public interface Discounter { + BigDecimal applyDiscount(BigDecimal amount); +} diff --git a/core-java/src/main/java/com/baeldung/strategy/EasterDiscounter.java b/core-java/src/main/java/com/baeldung/strategy/EasterDiscounter.java new file mode 100644 index 0000000000..fd70255482 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/strategy/EasterDiscounter.java @@ -0,0 +1,10 @@ +package com.baeldung.strategy; + +import java.math.BigDecimal; + +public class EasterDiscounter implements Discounter { + @Override + public BigDecimal applyDiscount(final BigDecimal amount) { + return amount.multiply(BigDecimal.valueOf(0.5)); + } +} diff --git a/core-java/src/test/java/com/baeldung/strategy/StrategyDesignPatternUnitTest.java b/core-java/src/test/java/com/baeldung/strategy/StrategyDesignPatternUnitTest.java new file mode 100644 index 0000000000..b1881091d9 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/strategy/StrategyDesignPatternUnitTest.java @@ -0,0 +1,58 @@ +package com.baeldung.strategy; + +import org.junit.Test; + +import java.math.BigDecimal; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.util.Lists.newArrayList; + +public class StrategyDesignPatternUnitTest { + @Test + public void shouldDivideByTwo_WhenApplyingStaffDiscounter() { + Discounter staffDiscounter = new EasterDiscounter(); + + final BigDecimal discountedValue = staffDiscounter + .applyDiscount(BigDecimal.valueOf(100)); + + assertThat(discountedValue) + .isEqualByComparingTo(BigDecimal.valueOf(50)); + } + + @Test + public void shouldDivideByTwo_WhenApplyingStaffDiscounterWithAnonyousTypes() { + Discounter staffDiscounter = new Discounter() { + @Override + public BigDecimal applyDiscount(final BigDecimal amount) { + return amount.multiply(BigDecimal.valueOf(0.5)); + } + }; + + final BigDecimal discountedValue = staffDiscounter + .applyDiscount(BigDecimal.valueOf(100)); + + assertThat(discountedValue) + .isEqualByComparingTo(BigDecimal.valueOf(50)); + } + + @Test + public void shouldDivideByTwo_WhenApplyingStaffDiscounterWithLamda() { + Discounter staffDiscounter = amount -> amount.multiply(BigDecimal.valueOf(0.5)); + + final BigDecimal discountedValue = staffDiscounter + .applyDiscount(BigDecimal.valueOf(100)); + + assertThat(discountedValue) + .isEqualByComparingTo(BigDecimal.valueOf(50)); + } + + @Test + public void shouldApplyListOfDiscounts() { + List discounters = newArrayList(); + + BigDecimal amount = BigDecimal.valueOf(100); + + discounters.forEach((d) -> d.applyDiscount(amount)); + } +}