From 286fe685aa6f23ea8be01e3703f7414d1e0053e9 Mon Sep 17 00:00:00 2001 From: oleksii Date: Fri, 2 Nov 2018 23:21:41 +0200 Subject: [PATCH 1/4] Submitted coffee machine --- src/CoffeeEngine.java | 187 +++++++++++++++++++++++++++++++++++++++++ src/CoffeeMachine.java | 54 ++++++++++++ src/EngineState.java | 9 ++ src/Main.java | 22 +++++ 4 files changed, 272 insertions(+) create mode 100644 src/CoffeeEngine.java create mode 100644 src/CoffeeMachine.java create mode 100644 src/EngineState.java create mode 100644 src/Main.java diff --git a/src/CoffeeEngine.java b/src/CoffeeEngine.java new file mode 100644 index 0000000..114cb1d --- /dev/null +++ b/src/CoffeeEngine.java @@ -0,0 +1,187 @@ +class CoffeeEngine { + + private int water; + private int milk; + private int coffee; + private int cups; + private int money; + private EngineState engineState; + + public CoffeeEngine(int water, int milk, int coffee, int cups, int money, + EngineState engineState) { + this.water = water; + this.milk = milk; + this.coffee = coffee; + this.cups = cups; + this.money = money; + this.engineState = engineState; + } + + boolean isOfferedBuy() { + return engineState == EngineState.BUY; + } + + void fillWater(String input) { + water += Integer.valueOf(input); + engineState = EngineState.FILL_MILK; + System.out.printf("Write how many ml of milk do you want to add: "); + } + + void fillMilk(String input) { + milk += Integer.valueOf(input); + engineState = EngineState.FILL_BEANS; + System.out.printf("Write how many grams of coffee beans do you want to add: "); + } + + void fillBeans(String input) { + coffee += Integer.valueOf(input); + engineState = EngineState.FILL_CUPS; + System.out.printf("Write how many disposable cups of coffee do you want to add: "); + } + + void fillCups(String input) { + cups += Integer.valueOf(input); + engineState = EngineState.IDLE; + System.out.printf("\n"); + } + + boolean isOfferedFillWater() { + return engineState == EngineState.FILL_WATER; + } + + boolean isOfferedFillMilk() { + return engineState == EngineState.FILL_MILK; + } + + boolean isOfferedFillBeans() { + return engineState == EngineState.FILL_BEANS; + } + + boolean isOfferedFillCups() { + return engineState == EngineState.FILL_CUPS; + } + + boolean isTerminated() { + return engineState == EngineState.EXIT; + } + + public boolean isIdle() { + return engineState == EngineState.IDLE; + } + + void terminate() { + engineState = EngineState.EXIT; + } + + void printState() { + System.out.printf("\nThe coffee machine has:\n"); + System.out.printf("%d of water\n", water); + System.out.printf("%d of milk\n", milk); + System.out.printf("%d of coffee beans\n", coffee); + System.out.printf("%d of disposable cups\n", cups); + System.out.printf("%d of money\n\n", money); + engineState = EngineState.IDLE; + } + + void takeAction() { + System.out.printf("\nI gave you $%d\n\n", money); + money = 0; + engineState = EngineState.IDLE; + } + + void proposeBuy() { + System.out.printf("\nWhat do you want to buy? 1 - espresso, 2 - latte, 3 - cappuccino: "); + engineState = EngineState.BUY; + } + + void proposeFill() { + System.out.printf("Write how many ml of water do you want to add: "); + engineState = EngineState.FILL_WATER; + } + + void makeBeverage(String option) { + switch (option) { + case "1": + serveEspresso(); + break; + case "2": + serveLatte(); + break; + case "3": + serveCappuccino(); + break; + } + engineState = EngineState.IDLE; + } + + private void serveEspresso() { + if (water - 250 >= 0 && coffee - 16 >= 0 && cups - 1 >= 0) { + System.out.printf("I have enough resources, making you a coffee!\n"); + water -= 250; + coffee -= 16; + cups -= 1; + money += 4; + } else { + if (water - 250 < 0) { + System.out.printf("Sorry, not enough water!\n"); + } + if (coffee - 16 < 0) { + System.out.printf("Sorry, not enough coffee beans!\n"); + } + if (cups - 1 < 0) { + System.out.printf("Sorry, not enough cups!\n"); + } + } + System.out.printf("\n"); + } + + private void serveLatte() { + if (water - 350 >= 0 && coffee - 20 >= 0 && milk - 75 >= 0 && cups - 1 >= 0) { + System.out.printf("I have enough resources, making you a coffee!\n"); + water -= 350; + milk -= 75; + coffee -= 20; + cups -= 1; + money += 7; + } else { + if (water - 350 < 0) { + System.out.printf("Sorry, not enough water!\n"); + } + if (milk - 75 < 0) { + System.out.printf("Sorry, not enough milk!\n"); + } + if (coffee - 20 < 0) { + System.out.printf("Sorry, not enough coffee beans!\n"); + } + if (cups - 1 < 0) { + System.out.printf("Sorry, not enough cups!\n"); + } + } + System.out.printf("\n"); + } + + private void serveCappuccino() { + if (water - 200 >= 0 && coffee - 12 >= 0 && milk - 100 >= 0 && cups - 1 >= 0) { + System.out.printf("I have enough resources, making you a coffee!\n"); + water -= 200; + milk -= 100; + coffee -= 12; + cups -= 1; + money += 6; + } else { + if (water - 200 < 0) { + System.out.printf("Sorry, not enough water!\n"); + } + if (milk - 100 < 0) { + System.out.printf("Sorry, not enough milk!\n"); + } + if (coffee - 12 < 0) { + System.out.printf("Sorry, not enough coffee beans!\n"); + } + if (cups - 1 < 0) { + System.out.printf("Sorry, not enough cups!\n"); + } + } + System.out.printf("\n"); + } +} diff --git a/src/CoffeeMachine.java b/src/CoffeeMachine.java new file mode 100644 index 0000000..16be7b3 --- /dev/null +++ b/src/CoffeeMachine.java @@ -0,0 +1,54 @@ +class CoffeeMachine { + + public static final String BUY = "buy"; + public static final String FILL = "fill"; + public static final String TAKE = "take"; + public static final String EXIT = "exit"; + public static final String REMAINING = "remaining"; + + private CoffeeEngine coffeeEngine; + + public CoffeeMachine(CoffeeEngine coffeeEngine) { + this.coffeeEngine = coffeeEngine; + } + + void process(String input) { + if (coffeeEngine.isOfferedBuy()) { + coffeeEngine.makeBeverage(input); + } else if (coffeeEngine.isOfferedFillWater()) { + coffeeEngine.fillWater(input); + } else if (coffeeEngine.isOfferedFillMilk()) { + coffeeEngine.fillMilk(input); + } else if (coffeeEngine.isOfferedFillBeans()) { + coffeeEngine.fillBeans(input); + } else if (coffeeEngine.isOfferedFillCups()) { + coffeeEngine.fillCups(input); + } else { + switch (input) { + case BUY: + coffeeEngine.proposeBuy(); + break; + case FILL: + coffeeEngine.proposeFill(); + break; + case TAKE: + coffeeEngine.takeAction(); + break; + case EXIT: + coffeeEngine.terminate(); + break; + case REMAINING: + coffeeEngine.printState(); + break; + } + } + } + + boolean isTerminated() { + return coffeeEngine.isTerminated(); + } + + public boolean isIdle() { + return coffeeEngine.isIdle(); + } +} diff --git a/src/EngineState.java b/src/EngineState.java new file mode 100644 index 0000000..8478b17 --- /dev/null +++ b/src/EngineState.java @@ -0,0 +1,9 @@ +enum EngineState { + IDLE, + BUY, + FILL_WATER, + FILL_MILK, + FILL_BEANS, + FILL_CUPS, + EXIT +} diff --git a/src/Main.java b/src/Main.java new file mode 100644 index 0000000..d643df6 --- /dev/null +++ b/src/Main.java @@ -0,0 +1,22 @@ +import java.util.*; + +class Main { + + public static void main(String[] args) { + try (Scanner sc = new Scanner(System.in)) { + CoffeeEngine coffeeEngine = new CoffeeEngine(400, 540, 120, 9, 550, + EngineState.IDLE); + CoffeeMachine coffeeMachine = new CoffeeMachine(coffeeEngine); + + while (true) { + if (coffeeMachine.isIdle()) { + System.out.print("Write action (buy, fill, take, remaining, exit): "); + } + if (coffeeMachine.isTerminated()) { + break; + } + coffeeMachine.process(sc.nextLine()); + } + } + } +} \ No newline at end of file From fbc089225936f823bdba98317840ddc93154c704 Mon Sep 17 00:00:00 2001 From: oleksii Date: Sun, 11 Nov 2018 16:03:07 +0200 Subject: [PATCH 2/4] Submitted coffee machine refactor as state pattern --- src/CoffeeEngine.java | 187 ------------------ src/CoffeeMachine.java | 54 ----- src/EngineState.java | 9 - src/Main.java | 22 --- src/coffeeMachine/CoffeeMachine.java | 61 ++++++ src/coffeeMachine/Main.java | 19 +- src/coffeeMachine/beverages/Beverage.java | 6 + .../beverages/BeverageFactory.java | 8 + src/coffeeMachine/beverages/Capuccino.java | 39 ++++ src/coffeeMachine/beverages/Espresso.java | 34 ++++ src/coffeeMachine/beverages/Latte.java | 39 ++++ .../beverages/StandartBeverages.java | 20 ++ src/coffeeMachine/engine/CoffeeEngine.java | 68 +++++++ src/coffeeMachine/engine/Display.java | 9 + src/coffeeMachine/engine/StdIoDisplay.java | 11 ++ src/coffeeMachine/state/FillBeans.java | 13 ++ src/coffeeMachine/state/FillCups.java | 14 ++ src/coffeeMachine/state/FillMilk.java | 14 ++ src/coffeeMachine/state/FillWater.java | 13 ++ src/coffeeMachine/state/Idle.java | 38 ++++ src/coffeeMachine/state/MachineState.java | 13 ++ src/coffeeMachine/state/ServeBeverage.java | 22 +++ 22 files changed, 438 insertions(+), 275 deletions(-) delete mode 100644 src/CoffeeEngine.java delete mode 100644 src/CoffeeMachine.java delete mode 100644 src/EngineState.java delete mode 100644 src/Main.java create mode 100644 src/coffeeMachine/CoffeeMachine.java create mode 100644 src/coffeeMachine/beverages/Beverage.java create mode 100644 src/coffeeMachine/beverages/BeverageFactory.java create mode 100644 src/coffeeMachine/beverages/Capuccino.java create mode 100644 src/coffeeMachine/beverages/Espresso.java create mode 100644 src/coffeeMachine/beverages/Latte.java create mode 100644 src/coffeeMachine/beverages/StandartBeverages.java create mode 100644 src/coffeeMachine/engine/CoffeeEngine.java create mode 100644 src/coffeeMachine/engine/Display.java create mode 100644 src/coffeeMachine/engine/StdIoDisplay.java create mode 100644 src/coffeeMachine/state/FillBeans.java create mode 100644 src/coffeeMachine/state/FillCups.java create mode 100644 src/coffeeMachine/state/FillMilk.java create mode 100644 src/coffeeMachine/state/FillWater.java create mode 100644 src/coffeeMachine/state/Idle.java create mode 100644 src/coffeeMachine/state/MachineState.java create mode 100644 src/coffeeMachine/state/ServeBeverage.java diff --git a/src/CoffeeEngine.java b/src/CoffeeEngine.java deleted file mode 100644 index 114cb1d..0000000 --- a/src/CoffeeEngine.java +++ /dev/null @@ -1,187 +0,0 @@ -class CoffeeEngine { - - private int water; - private int milk; - private int coffee; - private int cups; - private int money; - private EngineState engineState; - - public CoffeeEngine(int water, int milk, int coffee, int cups, int money, - EngineState engineState) { - this.water = water; - this.milk = milk; - this.coffee = coffee; - this.cups = cups; - this.money = money; - this.engineState = engineState; - } - - boolean isOfferedBuy() { - return engineState == EngineState.BUY; - } - - void fillWater(String input) { - water += Integer.valueOf(input); - engineState = EngineState.FILL_MILK; - System.out.printf("Write how many ml of milk do you want to add: "); - } - - void fillMilk(String input) { - milk += Integer.valueOf(input); - engineState = EngineState.FILL_BEANS; - System.out.printf("Write how many grams of coffee beans do you want to add: "); - } - - void fillBeans(String input) { - coffee += Integer.valueOf(input); - engineState = EngineState.FILL_CUPS; - System.out.printf("Write how many disposable cups of coffee do you want to add: "); - } - - void fillCups(String input) { - cups += Integer.valueOf(input); - engineState = EngineState.IDLE; - System.out.printf("\n"); - } - - boolean isOfferedFillWater() { - return engineState == EngineState.FILL_WATER; - } - - boolean isOfferedFillMilk() { - return engineState == EngineState.FILL_MILK; - } - - boolean isOfferedFillBeans() { - return engineState == EngineState.FILL_BEANS; - } - - boolean isOfferedFillCups() { - return engineState == EngineState.FILL_CUPS; - } - - boolean isTerminated() { - return engineState == EngineState.EXIT; - } - - public boolean isIdle() { - return engineState == EngineState.IDLE; - } - - void terminate() { - engineState = EngineState.EXIT; - } - - void printState() { - System.out.printf("\nThe coffee machine has:\n"); - System.out.printf("%d of water\n", water); - System.out.printf("%d of milk\n", milk); - System.out.printf("%d of coffee beans\n", coffee); - System.out.printf("%d of disposable cups\n", cups); - System.out.printf("%d of money\n\n", money); - engineState = EngineState.IDLE; - } - - void takeAction() { - System.out.printf("\nI gave you $%d\n\n", money); - money = 0; - engineState = EngineState.IDLE; - } - - void proposeBuy() { - System.out.printf("\nWhat do you want to buy? 1 - espresso, 2 - latte, 3 - cappuccino: "); - engineState = EngineState.BUY; - } - - void proposeFill() { - System.out.printf("Write how many ml of water do you want to add: "); - engineState = EngineState.FILL_WATER; - } - - void makeBeverage(String option) { - switch (option) { - case "1": - serveEspresso(); - break; - case "2": - serveLatte(); - break; - case "3": - serveCappuccino(); - break; - } - engineState = EngineState.IDLE; - } - - private void serveEspresso() { - if (water - 250 >= 0 && coffee - 16 >= 0 && cups - 1 >= 0) { - System.out.printf("I have enough resources, making you a coffee!\n"); - water -= 250; - coffee -= 16; - cups -= 1; - money += 4; - } else { - if (water - 250 < 0) { - System.out.printf("Sorry, not enough water!\n"); - } - if (coffee - 16 < 0) { - System.out.printf("Sorry, not enough coffee beans!\n"); - } - if (cups - 1 < 0) { - System.out.printf("Sorry, not enough cups!\n"); - } - } - System.out.printf("\n"); - } - - private void serveLatte() { - if (water - 350 >= 0 && coffee - 20 >= 0 && milk - 75 >= 0 && cups - 1 >= 0) { - System.out.printf("I have enough resources, making you a coffee!\n"); - water -= 350; - milk -= 75; - coffee -= 20; - cups -= 1; - money += 7; - } else { - if (water - 350 < 0) { - System.out.printf("Sorry, not enough water!\n"); - } - if (milk - 75 < 0) { - System.out.printf("Sorry, not enough milk!\n"); - } - if (coffee - 20 < 0) { - System.out.printf("Sorry, not enough coffee beans!\n"); - } - if (cups - 1 < 0) { - System.out.printf("Sorry, not enough cups!\n"); - } - } - System.out.printf("\n"); - } - - private void serveCappuccino() { - if (water - 200 >= 0 && coffee - 12 >= 0 && milk - 100 >= 0 && cups - 1 >= 0) { - System.out.printf("I have enough resources, making you a coffee!\n"); - water -= 200; - milk -= 100; - coffee -= 12; - cups -= 1; - money += 6; - } else { - if (water - 200 < 0) { - System.out.printf("Sorry, not enough water!\n"); - } - if (milk - 100 < 0) { - System.out.printf("Sorry, not enough milk!\n"); - } - if (coffee - 12 < 0) { - System.out.printf("Sorry, not enough coffee beans!\n"); - } - if (cups - 1 < 0) { - System.out.printf("Sorry, not enough cups!\n"); - } - } - System.out.printf("\n"); - } -} diff --git a/src/CoffeeMachine.java b/src/CoffeeMachine.java deleted file mode 100644 index 16be7b3..0000000 --- a/src/CoffeeMachine.java +++ /dev/null @@ -1,54 +0,0 @@ -class CoffeeMachine { - - public static final String BUY = "buy"; - public static final String FILL = "fill"; - public static final String TAKE = "take"; - public static final String EXIT = "exit"; - public static final String REMAINING = "remaining"; - - private CoffeeEngine coffeeEngine; - - public CoffeeMachine(CoffeeEngine coffeeEngine) { - this.coffeeEngine = coffeeEngine; - } - - void process(String input) { - if (coffeeEngine.isOfferedBuy()) { - coffeeEngine.makeBeverage(input); - } else if (coffeeEngine.isOfferedFillWater()) { - coffeeEngine.fillWater(input); - } else if (coffeeEngine.isOfferedFillMilk()) { - coffeeEngine.fillMilk(input); - } else if (coffeeEngine.isOfferedFillBeans()) { - coffeeEngine.fillBeans(input); - } else if (coffeeEngine.isOfferedFillCups()) { - coffeeEngine.fillCups(input); - } else { - switch (input) { - case BUY: - coffeeEngine.proposeBuy(); - break; - case FILL: - coffeeEngine.proposeFill(); - break; - case TAKE: - coffeeEngine.takeAction(); - break; - case EXIT: - coffeeEngine.terminate(); - break; - case REMAINING: - coffeeEngine.printState(); - break; - } - } - } - - boolean isTerminated() { - return coffeeEngine.isTerminated(); - } - - public boolean isIdle() { - return coffeeEngine.isIdle(); - } -} diff --git a/src/EngineState.java b/src/EngineState.java deleted file mode 100644 index 8478b17..0000000 --- a/src/EngineState.java +++ /dev/null @@ -1,9 +0,0 @@ -enum EngineState { - IDLE, - BUY, - FILL_WATER, - FILL_MILK, - FILL_BEANS, - FILL_CUPS, - EXIT -} diff --git a/src/Main.java b/src/Main.java deleted file mode 100644 index d643df6..0000000 --- a/src/Main.java +++ /dev/null @@ -1,22 +0,0 @@ -import java.util.*; - -class Main { - - public static void main(String[] args) { - try (Scanner sc = new Scanner(System.in)) { - CoffeeEngine coffeeEngine = new CoffeeEngine(400, 540, 120, 9, 550, - EngineState.IDLE); - CoffeeMachine coffeeMachine = new CoffeeMachine(coffeeEngine); - - while (true) { - if (coffeeMachine.isIdle()) { - System.out.print("Write action (buy, fill, take, remaining, exit): "); - } - if (coffeeMachine.isTerminated()) { - break; - } - coffeeMachine.process(sc.nextLine()); - } - } - } -} \ No newline at end of file diff --git a/src/coffeeMachine/CoffeeMachine.java b/src/coffeeMachine/CoffeeMachine.java new file mode 100644 index 0000000..4bb0d21 --- /dev/null +++ b/src/coffeeMachine/CoffeeMachine.java @@ -0,0 +1,61 @@ +package coffeeMachine; + +import coffeeMachine.engine.CoffeeEngine; +import coffeeMachine.engine.Display; +import coffeeMachine.state.MachineState; + +public class CoffeeMachine { + + private CoffeeEngine coffeeEngine; + private MachineState machineState; + private Display display; + + CoffeeMachine(CoffeeEngine coffeeEngine, Display display) { + this.coffeeEngine = coffeeEngine; + this.display = display; + this.machineState = MachineState.defaultState(); + } + + public void process(String input) { + machineState.processRequest(input, this); + } + + public void setMachineState(MachineState machineState) { + this.machineState = machineState; + } + + public boolean isTerminated() { + return coffeeEngine.isTerminated(); + } + + public void display(String message) { + display.displayMessage(message); + } + + public void withdrawMoney() { + System.out.printf("\nI gave you $%d\n\n", coffeeEngine.getMoney()); + coffeeEngine.setMoney(0); + } + + public void terminate() { + display.shutdown(); + coffeeEngine.terminate(); + } + + public void displayInvitation() { + System.out.print("Write action (buy, fill, take, remaining, exit): "); + } + + public void printState() { + System.out.printf("\nThe coffee machine has:\n"); + System.out.printf("%d of water\n", coffeeEngine.getWater()); + System.out.printf("%d of milk\n", coffeeEngine.getMilk()); + System.out.printf("%d of coffee beans\n", coffeeEngine.getCoffee()); + System.out.printf("%d of disposable cups\n", coffeeEngine.getCups()); + System.out.printf("%d of money\n\n", coffeeEngine.getMoney()); + } + + public CoffeeEngine getEngine() { + return coffeeEngine; + } +} diff --git a/src/coffeeMachine/Main.java b/src/coffeeMachine/Main.java index 39e98c9..713e0fc 100644 --- a/src/coffeeMachine/Main.java +++ b/src/coffeeMachine/Main.java @@ -1,7 +1,20 @@ package coffeeMachine; -public class Main { - public static void main(String[] args) { - System.out.print("Hello world!"); +import coffeeMachine.engine.CoffeeEngine; +import coffeeMachine.engine.StdIoDisplay; +import java.util.*; + +class Main { + + public static void main(String[] args) { + try (Scanner sc = new Scanner(System.in)) { + CoffeeEngine coffeeEngine = new CoffeeEngine(400, 540, 120, 9, 550); + StdIoDisplay display = new StdIoDisplay(); + CoffeeMachine coffeeMachine = new CoffeeMachine(coffeeEngine, display); + coffeeMachine.displayInvitation(); + while (!coffeeMachine.isTerminated()) { + coffeeMachine.process(sc.nextLine()); + } } + } } \ No newline at end of file diff --git a/src/coffeeMachine/beverages/Beverage.java b/src/coffeeMachine/beverages/Beverage.java new file mode 100644 index 0000000..5064dba --- /dev/null +++ b/src/coffeeMachine/beverages/Beverage.java @@ -0,0 +1,6 @@ +package coffeeMachine.beverages; + +public interface Beverage { + + void serve(); +} diff --git a/src/coffeeMachine/beverages/BeverageFactory.java b/src/coffeeMachine/beverages/BeverageFactory.java new file mode 100644 index 0000000..434fc17 --- /dev/null +++ b/src/coffeeMachine/beverages/BeverageFactory.java @@ -0,0 +1,8 @@ +package coffeeMachine.beverages; + +import coffeeMachine.engine.CoffeeEngine; + +public interface BeverageFactory { + + Beverage selectBeverage(String option, CoffeeEngine engine); +} diff --git a/src/coffeeMachine/beverages/Capuccino.java b/src/coffeeMachine/beverages/Capuccino.java new file mode 100644 index 0000000..1408767 --- /dev/null +++ b/src/coffeeMachine/beverages/Capuccino.java @@ -0,0 +1,39 @@ +package coffeeMachine.beverages; + +import coffeeMachine.engine.CoffeeEngine; + +public class Capuccino implements Beverage { + + private CoffeeEngine engine; + + public Capuccino(CoffeeEngine engine) { + this.engine = engine; + } + + @Override + public void serve() { + if (engine.getWater() - 200 >= 0 && engine.getCoffee() - 12 >= 0 && engine.getMilk() - 100 >= 0 + && engine.getCups() - 1 >= 0) { + System.out.printf("I have enough resources, making you a coffee!\n"); + engine.setWater(engine.getWater() - 200); + engine.setMilk(engine.getMilk() - 100); + engine.setCoffee(engine.getCoffee() - 12); + engine.setCups(engine.getCups() - 1); + engine.setMoney(engine.getMoney() + 6); + } else { + if (engine.getWater() - 200 < 0) { + System.out.printf("Sorry, not enough water!\n"); + } + if (engine.getMilk() - 100 < 0) { + System.out.printf("Sorry, not enough milk!\n"); + } + if (engine.getCoffee() - 12 < 0) { + System.out.printf("Sorry, not enough coffee beans!\n"); + } + if (engine.getCups() - 1 < 0) { + System.out.printf("Sorry, not enough cups!\n"); + } + } + System.out.printf("\n"); + } +} diff --git a/src/coffeeMachine/beverages/Espresso.java b/src/coffeeMachine/beverages/Espresso.java new file mode 100644 index 0000000..1e4cc12 --- /dev/null +++ b/src/coffeeMachine/beverages/Espresso.java @@ -0,0 +1,34 @@ +package coffeeMachine.beverages; + +import coffeeMachine.engine.CoffeeEngine; + +public class Espresso implements Beverage { + + private CoffeeEngine engine; + + public Espresso(CoffeeEngine engine) { + this.engine = engine; + } + + @Override + public void serve() { + if (engine.getWater() - 250 >= 0 && engine.getCoffee() - 16 >= 0 && engine.getCups() - 1 >= 0) { + System.out.printf("I have enough resources, making you a coffee!\n"); + engine.setWater(engine.getWater() - 250); + engine.setCoffee(engine.getCoffee() - 16); + engine.setCups(engine.getCups() - 1); + engine.setMoney(engine.getMoney() + 4); + } else { + if (engine.getWater() - 250 < 0) { + System.out.printf("Sorry, not enough water!\n"); + } + if (engine.getCoffee() - 16 < 0) { + System.out.printf("Sorry, not enough coffee beans!\n"); + } + if (engine.getCups() - 1 < 0) { + System.out.printf("Sorry, not enough cups!\n"); + } + } + System.out.printf("\n"); + } +} diff --git a/src/coffeeMachine/beverages/Latte.java b/src/coffeeMachine/beverages/Latte.java new file mode 100644 index 0000000..7d588c8 --- /dev/null +++ b/src/coffeeMachine/beverages/Latte.java @@ -0,0 +1,39 @@ +package coffeeMachine.beverages; + +import coffeeMachine.engine.CoffeeEngine; + +public class Latte implements Beverage { + + private CoffeeEngine engine; + + public Latte(CoffeeEngine engine) { + this.engine = engine; + } + + @Override + public void serve() { + if (engine.getWater() - 350 >= 0 && engine.getCoffee() - 20 >= 0 && engine.getMilk() - 75 >= 0 + && engine.getCups() - 1 >= 0) { + System.out.printf("I have enough resources, making you a coffee!\n"); + engine.setWater(engine.getWater() - 350); + engine.setMilk(engine.getMilk() - 75); + engine.setCoffee(engine.getCoffee() - 20); + engine.setCups(engine.getCups() - 1); + engine.setMoney(engine.getMoney() + 7); + } else { + if (engine.getWater() - 350 < 0) { + System.out.printf("Sorry, not enough water!\n"); + } + if (engine.getMilk() - 75 < 0) { + System.out.printf("Sorry, not enough milk!\n"); + } + if (engine.getCoffee() - 20 < 0) { + System.out.printf("Sorry, not enough coffee beans!\n"); + } + if (engine.getCups() - 1 < 0) { + System.out.printf("Sorry, not enough cups!\n"); + } + } + System.out.printf("\n"); + } +} diff --git a/src/coffeeMachine/beverages/StandartBeverages.java b/src/coffeeMachine/beverages/StandartBeverages.java new file mode 100644 index 0000000..f9477d7 --- /dev/null +++ b/src/coffeeMachine/beverages/StandartBeverages.java @@ -0,0 +1,20 @@ +package coffeeMachine.beverages; + +import coffeeMachine.engine.CoffeeEngine; + +public enum StandartBeverages implements BeverageFactory { + Factory { + @Override + public Beverage selectBeverage(String option, CoffeeEngine engine) { + switch (option) { + case "1": + return new Espresso(engine); + case "2": + return new Latte(engine); + case "3": + return new Capuccino(engine); + } + return null; + } + } +} diff --git a/src/coffeeMachine/engine/CoffeeEngine.java b/src/coffeeMachine/engine/CoffeeEngine.java new file mode 100644 index 0000000..f66b36f --- /dev/null +++ b/src/coffeeMachine/engine/CoffeeEngine.java @@ -0,0 +1,68 @@ +package coffeeMachine.engine; + + +public class CoffeeEngine { + + private int water; + private int milk; + private int coffee; + private int cups; + private int money; + private boolean terminated; + + public CoffeeEngine(int water, int milk, int coffee, int cups, int money) { + this.water = water; + this.milk = milk; + this.coffee = coffee; + this.cups = cups; + this.money = money; + } + + public int getWater() { + return water; + } + + public void setWater(int water) { + this.water = water; + } + + public int getMilk() { + return milk; + } + + public void setMilk(int milk) { + this.milk = milk; + } + + public int getCoffee() { + return coffee; + } + + public void setCoffee(int coffee) { + this.coffee = coffee; + } + + public int getCups() { + return cups; + } + + public void setCups(int cups) { + this.cups = cups; + } + + public int getMoney() { + return money; + } + + public void setMoney(int money) { + this.money = money; + } + + public boolean isTerminated() { + return terminated; + } + + public void terminate() { + terminated = true; + } +} diff --git a/src/coffeeMachine/engine/Display.java b/src/coffeeMachine/engine/Display.java new file mode 100644 index 0000000..377a94c --- /dev/null +++ b/src/coffeeMachine/engine/Display.java @@ -0,0 +1,9 @@ +package coffeeMachine.engine; + +public interface Display { + + void displayMessage(String message); + + default void shutdown() { + } +} diff --git a/src/coffeeMachine/engine/StdIoDisplay.java b/src/coffeeMachine/engine/StdIoDisplay.java new file mode 100644 index 0000000..063d230 --- /dev/null +++ b/src/coffeeMachine/engine/StdIoDisplay.java @@ -0,0 +1,11 @@ +package coffeeMachine.engine; + +import coffeeMachine.engine.Display; + +public class StdIoDisplay implements Display { + + @Override + public void displayMessage(String message) { + System.out.printf(message); + } +} diff --git a/src/coffeeMachine/state/FillBeans.java b/src/coffeeMachine/state/FillBeans.java new file mode 100644 index 0000000..dcdea82 --- /dev/null +++ b/src/coffeeMachine/state/FillBeans.java @@ -0,0 +1,13 @@ +package coffeeMachine.state; + +import coffeeMachine.CoffeeMachine; + +class FillBeans implements MachineState { + + @Override + public void processRequest(String action, CoffeeMachine context) { + context.getEngine().setCoffee(context.getEngine().getCoffee() + Integer.valueOf(action)); + context.setMachineState(new FillCups()); + System.out.printf("Write how many disposable cups of coffee do you want to add: "); + } +} diff --git a/src/coffeeMachine/state/FillCups.java b/src/coffeeMachine/state/FillCups.java new file mode 100644 index 0000000..8022724 --- /dev/null +++ b/src/coffeeMachine/state/FillCups.java @@ -0,0 +1,14 @@ +package coffeeMachine.state; + +import coffeeMachine.CoffeeMachine; + +class FillCups implements MachineState { + + @Override + public void processRequest(String action, CoffeeMachine context) { + context.getEngine().setCups(context.getEngine().getCups() + Integer.valueOf(action)); + context.setMachineState(new Idle()); + context.display("\n"); + context.displayInvitation(); + } +} diff --git a/src/coffeeMachine/state/FillMilk.java b/src/coffeeMachine/state/FillMilk.java new file mode 100644 index 0000000..509d4db --- /dev/null +++ b/src/coffeeMachine/state/FillMilk.java @@ -0,0 +1,14 @@ +package coffeeMachine.state; + + +import coffeeMachine.CoffeeMachine; + +class FillMilk implements MachineState { + + @Override + public void processRequest(String action, CoffeeMachine context) { + context.getEngine().setMilk(context.getEngine().getMilk() + Integer.valueOf(action)); + context.setMachineState(new FillBeans()); + context.display("Write how many grams of coffee beans do you want to add: "); + } +} diff --git a/src/coffeeMachine/state/FillWater.java b/src/coffeeMachine/state/FillWater.java new file mode 100644 index 0000000..38773d0 --- /dev/null +++ b/src/coffeeMachine/state/FillWater.java @@ -0,0 +1,13 @@ +package coffeeMachine.state; + +import coffeeMachine.CoffeeMachine; + +public class FillWater implements MachineState { + + @Override + public void processRequest(String action, CoffeeMachine context) { + context.getEngine().setWater(context.getEngine().getWater() + Integer.valueOf(action)); + context.setMachineState(new FillMilk()); + context.display("Write how many ml of milk do you want to add: "); + } +} diff --git a/src/coffeeMachine/state/Idle.java b/src/coffeeMachine/state/Idle.java new file mode 100644 index 0000000..050286a --- /dev/null +++ b/src/coffeeMachine/state/Idle.java @@ -0,0 +1,38 @@ +package coffeeMachine.state; + +import coffeeMachine.CoffeeMachine; +import coffeeMachine.beverages.StandartBeverages; + +public class Idle implements MachineState { + + private static final String BUY = "buy"; + private static final String FILL = "fill"; + private static final String TAKE = "take"; + private static final String EXIT = "exit"; + private static final String REMAINING = "remaining"; + + @Override + public void processRequest(String action, CoffeeMachine context) { + switch (action) { + case BUY: + context.display("\nWhat do you want to buy? 1 - espresso, 2 - latte, 3 - cappuccino: "); + context.setMachineState(new ServeBeverage(StandartBeverages.Factory)); + break; + case FILL: + context.display("Write how many ml of water do you want to add: "); + context.setMachineState(new FillWater()); + break; + case TAKE: + context.withdrawMoney(); + context.displayInvitation(); + break; + case EXIT: + context.terminate(); + break; + case REMAINING: + context.printState(); + context.displayInvitation(); + break; + } + } +} diff --git a/src/coffeeMachine/state/MachineState.java b/src/coffeeMachine/state/MachineState.java new file mode 100644 index 0000000..7b9ee14 --- /dev/null +++ b/src/coffeeMachine/state/MachineState.java @@ -0,0 +1,13 @@ +package coffeeMachine.state; + +import coffeeMachine.CoffeeMachine; + +public interface MachineState { + + void processRequest(String action, CoffeeMachine context); + + static MachineState defaultState() { + return new Idle(); + } +} + diff --git a/src/coffeeMachine/state/ServeBeverage.java b/src/coffeeMachine/state/ServeBeverage.java new file mode 100644 index 0000000..29c63aa --- /dev/null +++ b/src/coffeeMachine/state/ServeBeverage.java @@ -0,0 +1,22 @@ +package coffeeMachine.state; + +import coffeeMachine.CoffeeMachine; +import coffeeMachine.beverages.Beverage; +import coffeeMachine.beverages.BeverageFactory; + +public class ServeBeverage implements MachineState { + + private BeverageFactory beveragesFactory; + + public ServeBeverage(BeverageFactory beveragesFactory) { + this.beveragesFactory = beveragesFactory; + } + + @Override + public void processRequest(String action, CoffeeMachine context) { + Beverage beverage = beveragesFactory.selectBeverage(action, context.getEngine()); + beverage.serve(); + context.setMachineState(new Idle()); + context.displayInvitation(); + } +} From 1f938d80d8a9d6d1dbfe9de264a8ea7cce8cc653 Mon Sep 17 00:00:00 2001 From: oleksii Date: Sat, 17 Nov 2018 14:04:58 +0200 Subject: [PATCH 3/4] Submitted coffee machine refactor as state pattern refactor --- src/coffeeMachine/CoffeeMachine.java | 9 ++++++--- src/coffeeMachine/Main.java | 6 +++++- src/coffeeMachine/engine/StdIoDisplay.java | 2 -- src/coffeeMachine/state/FillBeans.java | 2 +- src/coffeeMachine/state/FillCups.java | 2 +- src/coffeeMachine/state/FillMilk.java | 2 +- src/coffeeMachine/state/FillWater.java | 2 +- src/coffeeMachine/state/Idle.java | 7 ++++--- 8 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/coffeeMachine/CoffeeMachine.java b/src/coffeeMachine/CoffeeMachine.java index 4bb0d21..bdcedf6 100644 --- a/src/coffeeMachine/CoffeeMachine.java +++ b/src/coffeeMachine/CoffeeMachine.java @@ -4,6 +4,9 @@ import coffeeMachine.engine.Display; import coffeeMachine.state.MachineState; +/** + * Coffee machine able to handle input and contains engine state. + */ public class CoffeeMachine { private CoffeeEngine coffeeEngine; @@ -28,7 +31,7 @@ public boolean isTerminated() { return coffeeEngine.isTerminated(); } - public void display(String message) { + public void showOnDisplay(String message) { display.displayMessage(message); } @@ -43,10 +46,10 @@ public void terminate() { } public void displayInvitation() { - System.out.print("Write action (buy, fill, take, remaining, exit): "); + showOnDisplay("Write action (buy, fill, take, remaining, exit): "); } - public void printState() { + public void displayState() { System.out.printf("\nThe coffee machine has:\n"); System.out.printf("%d of water\n", coffeeEngine.getWater()); System.out.printf("%d of milk\n", coffeeEngine.getMilk()); diff --git a/src/coffeeMachine/Main.java b/src/coffeeMachine/Main.java index 713e0fc..b09dee8 100644 --- a/src/coffeeMachine/Main.java +++ b/src/coffeeMachine/Main.java @@ -1,15 +1,19 @@ package coffeeMachine; import coffeeMachine.engine.CoffeeEngine; +import coffeeMachine.engine.Display; import coffeeMachine.engine.StdIoDisplay; import java.util.*; +/** + * Coffee machine runner attached to stdin/stdout. + */ class Main { public static void main(String[] args) { try (Scanner sc = new Scanner(System.in)) { CoffeeEngine coffeeEngine = new CoffeeEngine(400, 540, 120, 9, 550); - StdIoDisplay display = new StdIoDisplay(); + Display display = new StdIoDisplay(); CoffeeMachine coffeeMachine = new CoffeeMachine(coffeeEngine, display); coffeeMachine.displayInvitation(); while (!coffeeMachine.isTerminated()) { diff --git a/src/coffeeMachine/engine/StdIoDisplay.java b/src/coffeeMachine/engine/StdIoDisplay.java index 063d230..65f74e3 100644 --- a/src/coffeeMachine/engine/StdIoDisplay.java +++ b/src/coffeeMachine/engine/StdIoDisplay.java @@ -1,7 +1,5 @@ package coffeeMachine.engine; -import coffeeMachine.engine.Display; - public class StdIoDisplay implements Display { @Override diff --git a/src/coffeeMachine/state/FillBeans.java b/src/coffeeMachine/state/FillBeans.java index dcdea82..52c0c8a 100644 --- a/src/coffeeMachine/state/FillBeans.java +++ b/src/coffeeMachine/state/FillBeans.java @@ -8,6 +8,6 @@ class FillBeans implements MachineState { public void processRequest(String action, CoffeeMachine context) { context.getEngine().setCoffee(context.getEngine().getCoffee() + Integer.valueOf(action)); context.setMachineState(new FillCups()); - System.out.printf("Write how many disposable cups of coffee do you want to add: "); + context.showOnDisplay("Write how many disposable cups of coffee do you want to add: "); } } diff --git a/src/coffeeMachine/state/FillCups.java b/src/coffeeMachine/state/FillCups.java index 8022724..425b8bb 100644 --- a/src/coffeeMachine/state/FillCups.java +++ b/src/coffeeMachine/state/FillCups.java @@ -8,7 +8,7 @@ class FillCups implements MachineState { public void processRequest(String action, CoffeeMachine context) { context.getEngine().setCups(context.getEngine().getCups() + Integer.valueOf(action)); context.setMachineState(new Idle()); - context.display("\n"); + context.showOnDisplay("\n"); context.displayInvitation(); } } diff --git a/src/coffeeMachine/state/FillMilk.java b/src/coffeeMachine/state/FillMilk.java index 509d4db..28874a1 100644 --- a/src/coffeeMachine/state/FillMilk.java +++ b/src/coffeeMachine/state/FillMilk.java @@ -9,6 +9,6 @@ class FillMilk implements MachineState { public void processRequest(String action, CoffeeMachine context) { context.getEngine().setMilk(context.getEngine().getMilk() + Integer.valueOf(action)); context.setMachineState(new FillBeans()); - context.display("Write how many grams of coffee beans do you want to add: "); + context.showOnDisplay("Write how many grams of coffee beans do you want to add: "); } } diff --git a/src/coffeeMachine/state/FillWater.java b/src/coffeeMachine/state/FillWater.java index 38773d0..e2a01cb 100644 --- a/src/coffeeMachine/state/FillWater.java +++ b/src/coffeeMachine/state/FillWater.java @@ -8,6 +8,6 @@ public class FillWater implements MachineState { public void processRequest(String action, CoffeeMachine context) { context.getEngine().setWater(context.getEngine().getWater() + Integer.valueOf(action)); context.setMachineState(new FillMilk()); - context.display("Write how many ml of milk do you want to add: "); + context.showOnDisplay("Write how many ml of milk do you want to add: "); } } diff --git a/src/coffeeMachine/state/Idle.java b/src/coffeeMachine/state/Idle.java index 050286a..e08e70b 100644 --- a/src/coffeeMachine/state/Idle.java +++ b/src/coffeeMachine/state/Idle.java @@ -15,11 +15,12 @@ public class Idle implements MachineState { public void processRequest(String action, CoffeeMachine context) { switch (action) { case BUY: - context.display("\nWhat do you want to buy? 1 - espresso, 2 - latte, 3 - cappuccino: "); + context + .showOnDisplay("\nWhat do you want to buy? 1 - espresso, 2 - latte, 3 - cappuccino: "); context.setMachineState(new ServeBeverage(StandartBeverages.Factory)); break; case FILL: - context.display("Write how many ml of water do you want to add: "); + context.showOnDisplay("Write how many ml of water do you want to add: "); context.setMachineState(new FillWater()); break; case TAKE: @@ -30,7 +31,7 @@ public void processRequest(String action, CoffeeMachine context) { context.terminate(); break; case REMAINING: - context.printState(); + context.displayState(); context.displayInvitation(); break; } From 6bea1424db762c28c34dc38fe2c83403b813943b Mon Sep 17 00:00:00 2001 From: oleksii Date: Sat, 17 Nov 2018 15:29:56 +0200 Subject: [PATCH 4/4] Submitted coffee machine refactor reduce duplicates --- src/coffeeMachine/CoffeeMachine.java | 38 +++++++++----- src/coffeeMachine/beverages/Beverage.java | 4 +- src/coffeeMachine/beverages/Capuccino.java | 49 +++++++++--------- src/coffeeMachine/beverages/Espresso.java | 40 ++++++++------- src/coffeeMachine/beverages/Latte.java | 49 +++++++++--------- src/coffeeMachine/engine/CoffeeEngine.java | 9 ---- .../engine/CoffeeEngineStateFormatter.java | 51 +++++++++++++++++++ src/coffeeMachine/engine/Display.java | 3 -- src/coffeeMachine/state/Idle.java | 5 +- src/coffeeMachine/state/ServeBeverage.java | 3 +- 10 files changed, 157 insertions(+), 94 deletions(-) create mode 100644 src/coffeeMachine/engine/CoffeeEngineStateFormatter.java diff --git a/src/coffeeMachine/CoffeeMachine.java b/src/coffeeMachine/CoffeeMachine.java index bdcedf6..234309c 100644 --- a/src/coffeeMachine/CoffeeMachine.java +++ b/src/coffeeMachine/CoffeeMachine.java @@ -1,6 +1,7 @@ package coffeeMachine; import coffeeMachine.engine.CoffeeEngine; +import coffeeMachine.engine.CoffeeEngineStateFormatter; import coffeeMachine.engine.Display; import coffeeMachine.state.MachineState; @@ -9,14 +10,21 @@ */ public class CoffeeMachine { - private CoffeeEngine coffeeEngine; + private static final String INVITATION_STRING = "Write action (buy, fill, take, remaining, exit): "; + private static final String BUY_INVITATION = "\nWhat do you want to buy? 1 - espresso, 2 - latte, 3 - cappuccino: "; + + private final CoffeeEngine coffeeEngine; + private final CoffeeEngineStateFormatter stateFormatter; + private final Display display; + private MachineState machineState; - private Display display; + private boolean terminated; - CoffeeMachine(CoffeeEngine coffeeEngine, Display display) { + public CoffeeMachine(CoffeeEngine coffeeEngine, Display display) { this.coffeeEngine = coffeeEngine; this.display = display; this.machineState = MachineState.defaultState(); + this.stateFormatter = new CoffeeEngineStateFormatter(coffeeEngine); } public void process(String input) { @@ -28,7 +36,7 @@ public void setMachineState(MachineState machineState) { } public boolean isTerminated() { - return coffeeEngine.isTerminated(); + return terminated; } public void showOnDisplay(String message) { @@ -36,29 +44,31 @@ public void showOnDisplay(String message) { } public void withdrawMoney() { - System.out.printf("\nI gave you $%d\n\n", coffeeEngine.getMoney()); + showOnDisplay(stateFormatter.printWithdraw()); coffeeEngine.setMoney(0); } public void terminate() { - display.shutdown(); - coffeeEngine.terminate(); + terminated = true; } public void displayInvitation() { - showOnDisplay("Write action (buy, fill, take, remaining, exit): "); + showOnDisplay(INVITATION_STRING); } public void displayState() { - System.out.printf("\nThe coffee machine has:\n"); - System.out.printf("%d of water\n", coffeeEngine.getWater()); - System.out.printf("%d of milk\n", coffeeEngine.getMilk()); - System.out.printf("%d of coffee beans\n", coffeeEngine.getCoffee()); - System.out.printf("%d of disposable cups\n", coffeeEngine.getCups()); - System.out.printf("%d of money\n\n", coffeeEngine.getMoney()); + showOnDisplay(stateFormatter.printState()); } public CoffeeEngine getEngine() { return coffeeEngine; } + + public void triggerBuyProcess() { + showOnDisplay(BUY_INVITATION); + } + + public void triggerFillProcess() { + showOnDisplay("Write how many ml of water do you want to add: "); + } } diff --git a/src/coffeeMachine/beverages/Beverage.java b/src/coffeeMachine/beverages/Beverage.java index 5064dba..3a3fec8 100644 --- a/src/coffeeMachine/beverages/Beverage.java +++ b/src/coffeeMachine/beverages/Beverage.java @@ -2,5 +2,7 @@ public interface Beverage { - void serve(); + String SUCCESS_MESSAGE = "I have enough resources, making you a coffee!\n\n"; + + String serve(); } diff --git a/src/coffeeMachine/beverages/Capuccino.java b/src/coffeeMachine/beverages/Capuccino.java index 1408767..fd98ed9 100644 --- a/src/coffeeMachine/beverages/Capuccino.java +++ b/src/coffeeMachine/beverages/Capuccino.java @@ -1,39 +1,42 @@ package coffeeMachine.beverages; import coffeeMachine.engine.CoffeeEngine; +import coffeeMachine.engine.CoffeeEngineStateFormatter; public class Capuccino implements Beverage { - private CoffeeEngine engine; + private static final int WATER_NEEDED = 200; + private static final int COFFEE_NEEDED = 12; + private static final int MILK_NEEDED = 100; + private static final int CUPS_NEEDED = 1; + private static final int COST_OF_BEVERAGE = 6; + + private final CoffeeEngineStateFormatter formatter; + private final CoffeeEngine engine; public Capuccino(CoffeeEngine engine) { this.engine = engine; + this.formatter = new CoffeeEngineStateFormatter(engine); } @Override - public void serve() { - if (engine.getWater() - 200 >= 0 && engine.getCoffee() - 12 >= 0 && engine.getMilk() - 100 >= 0 - && engine.getCups() - 1 >= 0) { - System.out.printf("I have enough resources, making you a coffee!\n"); - engine.setWater(engine.getWater() - 200); - engine.setMilk(engine.getMilk() - 100); - engine.setCoffee(engine.getCoffee() - 12); - engine.setCups(engine.getCups() - 1); - engine.setMoney(engine.getMoney() + 6); + public String serve() { + if (isEnoughResources()) { + engine.setWater(engine.getWater() - WATER_NEEDED); + engine.setMilk(engine.getMilk() - MILK_NEEDED); + engine.setCoffee(engine.getCoffee() - COFFEE_NEEDED); + engine.setCups(engine.getCups() - CUPS_NEEDED); + engine.setMoney(engine.getMoney() + COST_OF_BEVERAGE); + return SUCCESS_MESSAGE; } else { - if (engine.getWater() - 200 < 0) { - System.out.printf("Sorry, not enough water!\n"); - } - if (engine.getMilk() - 100 < 0) { - System.out.printf("Sorry, not enough milk!\n"); - } - if (engine.getCoffee() - 12 < 0) { - System.out.printf("Sorry, not enough coffee beans!\n"); - } - if (engine.getCups() - 1 < 0) { - System.out.printf("Sorry, not enough cups!\n"); - } + return formatter + .printResoucesNotInRange(WATER_NEEDED, MILK_NEEDED, COFFEE_NEEDED, CUPS_NEEDED); } - System.out.printf("\n"); + } + + private boolean isEnoughResources() { + return engine.getWater() - WATER_NEEDED >= 0 && engine.getCoffee() - COFFEE_NEEDED >= 0 + && engine.getMilk() - MILK_NEEDED >= 0 + && engine.getCups() - CUPS_NEEDED >= 0; } } diff --git a/src/coffeeMachine/beverages/Espresso.java b/src/coffeeMachine/beverages/Espresso.java index 1e4cc12..fe77e9d 100644 --- a/src/coffeeMachine/beverages/Espresso.java +++ b/src/coffeeMachine/beverages/Espresso.java @@ -1,34 +1,40 @@ package coffeeMachine.beverages; import coffeeMachine.engine.CoffeeEngine; +import coffeeMachine.engine.CoffeeEngineStateFormatter; public class Espresso implements Beverage { + private static final int WATER_NEEDED = 250; + private static final int COFFEE_NEEDED = 16; + private static final int CUPS_NEEDED = 1; + private static final int COST_OF_BEVERAGE = 4; + + private final CoffeeEngineStateFormatter formatter; + private CoffeeEngine engine; public Espresso(CoffeeEngine engine) { this.engine = engine; + this.formatter = new CoffeeEngineStateFormatter(engine); } @Override - public void serve() { - if (engine.getWater() - 250 >= 0 && engine.getCoffee() - 16 >= 0 && engine.getCups() - 1 >= 0) { - System.out.printf("I have enough resources, making you a coffee!\n"); - engine.setWater(engine.getWater() - 250); - engine.setCoffee(engine.getCoffee() - 16); - engine.setCups(engine.getCups() - 1); - engine.setMoney(engine.getMoney() + 4); + public String serve() { + if (isEnoughResources()) { + engine.setWater(engine.getWater() - WATER_NEEDED); + engine.setCoffee(engine.getCoffee() - COFFEE_NEEDED); + engine.setCups(engine.getCups() - CUPS_NEEDED); + engine.setMoney(engine.getMoney() + COST_OF_BEVERAGE); + return SUCCESS_MESSAGE; } else { - if (engine.getWater() - 250 < 0) { - System.out.printf("Sorry, not enough water!\n"); - } - if (engine.getCoffee() - 16 < 0) { - System.out.printf("Sorry, not enough coffee beans!\n"); - } - if (engine.getCups() - 1 < 0) { - System.out.printf("Sorry, not enough cups!\n"); - } + return formatter + .printResoucesNotInRange(WATER_NEEDED, 0, COFFEE_NEEDED, CUPS_NEEDED); } - System.out.printf("\n"); + } + + private boolean isEnoughResources() { + return engine.getWater() - WATER_NEEDED >= 0 && engine.getCoffee() - COFFEE_NEEDED >= 0 + && engine.getCups() - CUPS_NEEDED >= 0; } } diff --git a/src/coffeeMachine/beverages/Latte.java b/src/coffeeMachine/beverages/Latte.java index 7d588c8..cf203a2 100644 --- a/src/coffeeMachine/beverages/Latte.java +++ b/src/coffeeMachine/beverages/Latte.java @@ -1,39 +1,42 @@ package coffeeMachine.beverages; import coffeeMachine.engine.CoffeeEngine; +import coffeeMachine.engine.CoffeeEngineStateFormatter; public class Latte implements Beverage { - private CoffeeEngine engine; + private static final int WATER_NEEDED = 350; + private static final int COFFEE_NEEDED = 20; + private static final int MILK_NEEDED = 75; + private static final int CUPS_NEEDED = 1; + private static final int COST_OF_BEVERAGE = 7; + + private final CoffeeEngineStateFormatter formatter; + private final CoffeeEngine engine; public Latte(CoffeeEngine engine) { this.engine = engine; + this.formatter = new CoffeeEngineStateFormatter(engine); } @Override - public void serve() { - if (engine.getWater() - 350 >= 0 && engine.getCoffee() - 20 >= 0 && engine.getMilk() - 75 >= 0 - && engine.getCups() - 1 >= 0) { - System.out.printf("I have enough resources, making you a coffee!\n"); - engine.setWater(engine.getWater() - 350); - engine.setMilk(engine.getMilk() - 75); - engine.setCoffee(engine.getCoffee() - 20); - engine.setCups(engine.getCups() - 1); - engine.setMoney(engine.getMoney() + 7); + public String serve() { + if (isEnoughResources()) { + engine.setWater(engine.getWater() - WATER_NEEDED); + engine.setMilk(engine.getMilk() - MILK_NEEDED); + engine.setCoffee(engine.getCoffee() - COFFEE_NEEDED); + engine.setCups(engine.getCups() - CUPS_NEEDED); + engine.setMoney(engine.getMoney() + COST_OF_BEVERAGE); + return SUCCESS_MESSAGE; } else { - if (engine.getWater() - 350 < 0) { - System.out.printf("Sorry, not enough water!\n"); - } - if (engine.getMilk() - 75 < 0) { - System.out.printf("Sorry, not enough milk!\n"); - } - if (engine.getCoffee() - 20 < 0) { - System.out.printf("Sorry, not enough coffee beans!\n"); - } - if (engine.getCups() - 1 < 0) { - System.out.printf("Sorry, not enough cups!\n"); - } + return formatter + .printResoucesNotInRange(WATER_NEEDED, MILK_NEEDED, COFFEE_NEEDED, CUPS_NEEDED); } - System.out.printf("\n"); + } + + private boolean isEnoughResources() { + return engine.getWater() - WATER_NEEDED >= 0 && engine.getCoffee() - COFFEE_NEEDED >= 0 + && engine.getMilk() - MILK_NEEDED >= 0 + && engine.getCups() - CUPS_NEEDED >= 0; } } diff --git a/src/coffeeMachine/engine/CoffeeEngine.java b/src/coffeeMachine/engine/CoffeeEngine.java index f66b36f..f329b5d 100644 --- a/src/coffeeMachine/engine/CoffeeEngine.java +++ b/src/coffeeMachine/engine/CoffeeEngine.java @@ -8,7 +8,6 @@ public class CoffeeEngine { private int coffee; private int cups; private int money; - private boolean terminated; public CoffeeEngine(int water, int milk, int coffee, int cups, int money) { this.water = water; @@ -57,12 +56,4 @@ public int getMoney() { public void setMoney(int money) { this.money = money; } - - public boolean isTerminated() { - return terminated; - } - - public void terminate() { - terminated = true; - } } diff --git a/src/coffeeMachine/engine/CoffeeEngineStateFormatter.java b/src/coffeeMachine/engine/CoffeeEngineStateFormatter.java new file mode 100644 index 0000000..f6e60d2 --- /dev/null +++ b/src/coffeeMachine/engine/CoffeeEngineStateFormatter.java @@ -0,0 +1,51 @@ +package coffeeMachine.engine; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + +public class CoffeeEngineStateFormatter { + + private CoffeeEngine coffeeEngine; + + public CoffeeEngineStateFormatter(CoffeeEngine coffeeEngine) { + this.coffeeEngine = coffeeEngine; + } + + public String printState() { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + PrintStream stringWriter = new PrintStream(out); + stringWriter.printf("\nThe coffee machine has:\n"); + stringWriter.printf("%d of water\n", coffeeEngine.getWater()); + stringWriter.printf("%d of milk\n", coffeeEngine.getMilk()); + stringWriter.printf("%d of coffee beans\n", coffeeEngine.getCoffee()); + stringWriter.printf("%d of disposable cups\n", coffeeEngine.getCups()); + stringWriter.printf("%d of money\n\n", coffeeEngine.getMoney()); + return new String(out.toByteArray()); + } + + public String printWithdraw() { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + PrintStream stringWriter = new PrintStream(out); + stringWriter.printf("\nI gave you $%d\n\n", coffeeEngine.getMoney()); + return new String(out.toByteArray()); + } + + public String printResoucesNotInRange(int water, int milk, int coffee, int cups) { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + PrintStream stringWriter = new PrintStream(out); + if (coffeeEngine.getWater() - water < 0) { + stringWriter.printf("Sorry, not enough water!\n"); + } + if (coffeeEngine.getMilk() - milk < 0) { + stringWriter.printf("Sorry, not enough milk!\n"); + } + if (coffeeEngine.getCoffee() - coffee < 0) { + stringWriter.printf("Sorry, not enough coffee beans!\n"); + } + if (coffeeEngine.getCups() - cups < 0) { + stringWriter.printf("Sorry, not enough cups!\n"); + } + stringWriter.printf("\n"); + return new String(out.toByteArray()); + } +} diff --git a/src/coffeeMachine/engine/Display.java b/src/coffeeMachine/engine/Display.java index 377a94c..7a0d631 100644 --- a/src/coffeeMachine/engine/Display.java +++ b/src/coffeeMachine/engine/Display.java @@ -3,7 +3,4 @@ public interface Display { void displayMessage(String message); - - default void shutdown() { - } } diff --git a/src/coffeeMachine/state/Idle.java b/src/coffeeMachine/state/Idle.java index e08e70b..b15b00e 100644 --- a/src/coffeeMachine/state/Idle.java +++ b/src/coffeeMachine/state/Idle.java @@ -15,12 +15,11 @@ public class Idle implements MachineState { public void processRequest(String action, CoffeeMachine context) { switch (action) { case BUY: - context - .showOnDisplay("\nWhat do you want to buy? 1 - espresso, 2 - latte, 3 - cappuccino: "); + context.triggerBuyProcess(); context.setMachineState(new ServeBeverage(StandartBeverages.Factory)); break; case FILL: - context.showOnDisplay("Write how many ml of water do you want to add: "); + context.triggerFillProcess(); context.setMachineState(new FillWater()); break; case TAKE: diff --git a/src/coffeeMachine/state/ServeBeverage.java b/src/coffeeMachine/state/ServeBeverage.java index 29c63aa..5cab7a1 100644 --- a/src/coffeeMachine/state/ServeBeverage.java +++ b/src/coffeeMachine/state/ServeBeverage.java @@ -15,7 +15,8 @@ public ServeBeverage(BeverageFactory beveragesFactory) { @Override public void processRequest(String action, CoffeeMachine context) { Beverage beverage = beveragesFactory.selectBeverage(action, context.getEngine()); - beverage.serve(); + String result = beverage.serve(); + context.showOnDisplay(result); context.setMachineState(new Idle()); context.displayInvitation(); }