First commit of the cupcake kata. The toppings are implemented

This commit is contained in:
Namu
2025-10-02 11:46:49 +02:00
commit 379500c1c8
13 changed files with 233 additions and 0 deletions

30
.gitignore vendored Normal file
View File

@@ -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

19
src/Application.java Normal file
View File

@@ -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);
}
}

5
src/Main.java Normal file
View File

@@ -0,0 +1,5 @@
void main(String[] args) {
var app = new Application();
app.run();
}

View File

@@ -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());
}
}

54
src/cupcake/Cupcake.java Normal file
View File

@@ -0,0 +1,54 @@
package cupcake;
import toppings.Topping;
import java.util.ArrayList;
import java.util.List;
public class Cupcake {
private final List<Topping> 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;
}
}

View File

@@ -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();
}
}

View File

@@ -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());
}
}

View File

@@ -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());
}
}

View File

@@ -0,0 +1,7 @@
package toppings;
public class BlackChocolateTopping extends Topping {
public BlackChocolateTopping() {
super("black chocolate", 0.50d);
}
}

View File

@@ -0,0 +1,7 @@
package toppings;
public class NutsTopping extends Topping {
public NutsTopping() {
super("nuts", 0.75d);
}
}

View File

@@ -0,0 +1,7 @@
package toppings;
public class SugarTopping extends Topping {
public SugarTopping() {
super("sugar", 0.12d);
}
}

19
src/toppings/Topping.java Normal file
View File

@@ -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;
}
}

View File

@@ -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);
}
}