diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/decorator/classic/Coffee.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/decorator/classic/Coffee.java new file mode 100644 index 0000000..4ff2dea --- /dev/null +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/decorator/classic/Coffee.java @@ -0,0 +1,10 @@ +package pl.mperor.lab.java.design.pattern.structural.decorator.classic; + +public interface Coffee { + + int getCost(); + + default String getDescription() { + return this.getClass().getSimpleName(); + } +} diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/decorator/classic/CoffeeDecorator.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/decorator/classic/CoffeeDecorator.java new file mode 100644 index 0000000..d042935 --- /dev/null +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/decorator/classic/CoffeeDecorator.java @@ -0,0 +1,22 @@ +package pl.mperor.lab.java.design.pattern.structural.decorator.classic; + +public abstract class CoffeeDecorator implements Coffee { + + protected final Coffee coffee; + protected final int cost; + + protected CoffeeDecorator(Coffee coffee, int cost) { + this.coffee = coffee; + this.cost = cost; + } + + @Override + public int getCost() { + return coffee.getCost() + cost; + } + + @Override + public String getDescription() { + return "%s + %s".formatted(coffee.getDescription(), Coffee.super.getDescription()); + } +} diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/decorator/classic/NormalCoffee.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/decorator/classic/NormalCoffee.java new file mode 100644 index 0000000..993a10e --- /dev/null +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/decorator/classic/NormalCoffee.java @@ -0,0 +1,14 @@ +package pl.mperor.lab.java.design.pattern.structural.decorator.classic; + +public class NormalCoffee implements Coffee { + + @Override + public int getCost() { + return 100; + } + + @Override + public String getDescription() { + return "Coffee"; + } +} diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/decorator/classic/WithChocolate.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/decorator/classic/WithChocolate.java new file mode 100644 index 0000000..5315ad7 --- /dev/null +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/decorator/classic/WithChocolate.java @@ -0,0 +1,9 @@ +package pl.mperor.lab.java.design.pattern.structural.decorator.classic; + +public class WithChocolate extends CoffeeDecorator { + + public WithChocolate(Coffee coffee) { + super(coffee, 150); + } + +} diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/decorator/classic/WithMilk.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/decorator/classic/WithMilk.java new file mode 100644 index 0000000..add5819 --- /dev/null +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/decorator/classic/WithMilk.java @@ -0,0 +1,9 @@ +package pl.mperor.lab.java.design.pattern.structural.decorator.classic; + +public class WithMilk extends CoffeeDecorator { + + public WithMilk(Coffee coffee) { + super(coffee, 50); + } + +} diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/decorator/classic/WithSugar.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/decorator/classic/WithSugar.java new file mode 100644 index 0000000..70413a0 --- /dev/null +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/decorator/classic/WithSugar.java @@ -0,0 +1,9 @@ +package pl.mperor.lab.java.design.pattern.structural.decorator.classic; + +public class WithSugar extends CoffeeDecorator { + + public WithSugar(Coffee coffee) { + super(coffee, 30); + } + +} diff --git a/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/structural/decorator/classic/CoffeeDecoratorTest.java b/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/structural/decorator/classic/CoffeeDecoratorTest.java new file mode 100644 index 0000000..9680f6e --- /dev/null +++ b/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/structural/decorator/classic/CoffeeDecoratorTest.java @@ -0,0 +1,20 @@ +package pl.mperor.lab.java.design.pattern.structural.decorator.classic; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.stream.Stream; + +public class CoffeeDecoratorTest { + + @Test + public void shouldAllowToDynamicallyExtendCoffeeWithMilkChocolateOrSugar() { + NormalCoffee normal = new NormalCoffee(); + Coffee robustCoffee = new WithChocolate(new WithMilk(new WithSugar(normal))); + Assertions.assertTrue(normal.getCost() < robustCoffee.getCost()); + Assertions.assertTrue(Stream.of("WithChocolate", "WithSugar", "WithMilk") + .allMatch(robustCoffee.getDescription()::contains) + ); + } + +} \ No newline at end of file