commit 379500c1c8bbc537b1f5e08bca550cc1369b7c51 Author: Namu Date: Thu Oct 2 11:46:49 2025 +0200 First commit of the cupcake kata. The toppings are implemented diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1a3879a --- /dev/null +++ b/.gitignore @@ -0,0 +1,30 @@ +### IntelliJ IDEA ### +.idea/ +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/src/Application.java b/src/Application.java new file mode 100644 index 0000000..2a79dd0 --- /dev/null +++ b/src/Application.java @@ -0,0 +1,19 @@ +import cupcake.*; +import views.CupcakeView; + +public class Application { + + public void run() { + Cupcake cupcake1 = new Cupcake(); + Cupcake cupcake2 = new Cupcake(); + + CupcakeDecorator decorator1 = new NutsCupcakeDecorator(new BlackChocolateCupcakeDecorator(cupcake1)); + CupcakeDecorator decorator2 = new SugarCupcakeDecorator(new NutsCupcakeDecorator(new BlackChocolateCupcakeDecorator(new SugarCupcakeDecorator(cupcake2)))); + + CupcakeView.displayCupcakeToppings(decorator1); + CupcakeView.displayCupcakePrice(decorator1); + + CupcakeView.displayCupcakeToppings(decorator2); + CupcakeView.displayCupcakePrice(decorator2); + } +} diff --git a/src/Main.java b/src/Main.java new file mode 100644 index 0000000..0c4288e --- /dev/null +++ b/src/Main.java @@ -0,0 +1,5 @@ + +void main(String[] args) { + var app = new Application(); + app.run(); +} diff --git a/src/cupcake/BlackChocolateCupcakeDecorator.java b/src/cupcake/BlackChocolateCupcakeDecorator.java new file mode 100644 index 0000000..1d7a555 --- /dev/null +++ b/src/cupcake/BlackChocolateCupcakeDecorator.java @@ -0,0 +1,15 @@ +package cupcake; + +import toppings.BlackChocolateTopping; + +public class BlackChocolateCupcakeDecorator extends CupcakeDecorator { + public BlackChocolateCupcakeDecorator(Cupcake cupcake) { + super(cupcake); + cupcake.addTopping(new BlackChocolateTopping()); + } + + public BlackChocolateCupcakeDecorator(CupcakeDecorator cupcakeDecorator) { + super(cupcakeDecorator); + cupcake.addTopping(new BlackChocolateTopping()); + } +} diff --git a/src/cupcake/Cupcake.java b/src/cupcake/Cupcake.java new file mode 100644 index 0000000..5e15130 --- /dev/null +++ b/src/cupcake/Cupcake.java @@ -0,0 +1,54 @@ +package cupcake; + +import toppings.Topping; + +import java.util.ArrayList; +import java.util.List; + +public class Cupcake { + private final List toppings; + + public Cupcake() { + this.toppings = new ArrayList<>(); + } + + public void addTopping(Topping topping) { + toppings.add(topping); + } + + public String getToppingsNames() { + // TODO: refactor this method to reduce the complexity + StringBuilder builder = new StringBuilder(); + + if (!toppings.isEmpty()) + builder.append(toppings.getFirst().getName()); + else + return ""; + + if (toppings.size() >= 2) + builder.append(" with ") + .append(toppings.get(1).getName()); + + for (int i = 2; i < toppings.size(); i++) { + Topping topping = toppings.get(i); + + if (i == toppings.size() - 1) { + builder.append(" and ") + .append(topping.getName()); + } else { + builder.append(", ") + .append(topping.getName()); + } + } + + return builder.toString(); + } + + public double computePrice() { + double cupcakePrice = 0.0d; + for (final Topping topping : toppings) { + cupcakePrice += topping.getPrice(); + } + return cupcakePrice; + } +} diff --git a/src/cupcake/CupcakeDecorator.java b/src/cupcake/CupcakeDecorator.java new file mode 100644 index 0000000..4f52738 --- /dev/null +++ b/src/cupcake/CupcakeDecorator.java @@ -0,0 +1,21 @@ +package cupcake; + +public abstract class CupcakeDecorator { + protected Cupcake cupcake; + + public CupcakeDecorator(Cupcake cupcake) { + this.cupcake = cupcake; + } + + public CupcakeDecorator(CupcakeDecorator cupcakeDecorator) { + this.cupcake = cupcakeDecorator.cupcake; + } + + public double computePrice() { + return cupcake.computePrice(); + } + + public String getToppingsNames() { + return cupcake.getToppingsNames(); + } +} diff --git a/src/cupcake/NutsCupcakeDecorator.java b/src/cupcake/NutsCupcakeDecorator.java new file mode 100644 index 0000000..c945fcd --- /dev/null +++ b/src/cupcake/NutsCupcakeDecorator.java @@ -0,0 +1,15 @@ +package cupcake; + +import toppings.NutsTopping; + +public class NutsCupcakeDecorator extends CupcakeDecorator { + public NutsCupcakeDecorator(Cupcake cupcake) { + super(cupcake); + cupcake.addTopping(new NutsTopping()); + } + + public NutsCupcakeDecorator(CupcakeDecorator cupcakeDecorator) { + super(cupcakeDecorator); + cupcakeDecorator.cupcake.addTopping(new NutsTopping()); + } +} diff --git a/src/cupcake/SugarCupcakeDecorator.java b/src/cupcake/SugarCupcakeDecorator.java new file mode 100644 index 0000000..9da2e3e --- /dev/null +++ b/src/cupcake/SugarCupcakeDecorator.java @@ -0,0 +1,15 @@ +package cupcake; + +import toppings.SugarTopping; + +public class SugarCupcakeDecorator extends CupcakeDecorator { + public SugarCupcakeDecorator(Cupcake cupcake) { + super(cupcake); + cupcake.addTopping(new SugarTopping()); + } + + public SugarCupcakeDecorator(CupcakeDecorator cupcakeDecorator) { + super(cupcakeDecorator); + cupcakeDecorator.cupcake.addTopping(new SugarTopping()); + } +} diff --git a/src/toppings/BlackChocolateTopping.java b/src/toppings/BlackChocolateTopping.java new file mode 100644 index 0000000..84faed6 --- /dev/null +++ b/src/toppings/BlackChocolateTopping.java @@ -0,0 +1,7 @@ +package toppings; + +public class BlackChocolateTopping extends Topping { + public BlackChocolateTopping() { + super("black chocolate", 0.50d); + } +} diff --git a/src/toppings/NutsTopping.java b/src/toppings/NutsTopping.java new file mode 100644 index 0000000..ee81251 --- /dev/null +++ b/src/toppings/NutsTopping.java @@ -0,0 +1,7 @@ +package toppings; + +public class NutsTopping extends Topping { + public NutsTopping() { + super("nuts", 0.75d); + } +} diff --git a/src/toppings/SugarTopping.java b/src/toppings/SugarTopping.java new file mode 100644 index 0000000..b997a18 --- /dev/null +++ b/src/toppings/SugarTopping.java @@ -0,0 +1,7 @@ +package toppings; + +public class SugarTopping extends Topping { + public SugarTopping() { + super("sugar", 0.12d); + } +} diff --git a/src/toppings/Topping.java b/src/toppings/Topping.java new file mode 100644 index 0000000..8956f31 --- /dev/null +++ b/src/toppings/Topping.java @@ -0,0 +1,19 @@ +package toppings; + +public abstract class Topping { + protected final String name; + protected final double price; + + public Topping(String name, double type) { + this.name = name; + this.price = type; + } + + public String getName() { + return name; + } + + public double getPrice() { + return price; + } +} diff --git a/src/views/CupcakeView.java b/src/views/CupcakeView.java new file mode 100644 index 0000000..f9c5523 --- /dev/null +++ b/src/views/CupcakeView.java @@ -0,0 +1,19 @@ +package views; + +import cupcake.CupcakeDecorator; + +import java.text.DecimalFormat; + +public class CupcakeView { + public static void displayCupcakeToppings(CupcakeDecorator cupcakeDecorator) { + System.out.println("Cupcake with : " + cupcakeDecorator.getToppingsNames()); + } + + public static void displayCupcakePrice(CupcakeDecorator cupcakeDecorator) { + double price = cupcakeDecorator.computePrice(); + DecimalFormat fd = new DecimalFormat("0.00€"); + String formattedPrice = fd.format(price); + + System.out.println(formattedPrice); + } +}