Vending machine made with Java (domain driven)

Background

Based on the advice from shiracamus, I rewrote it in a DDD (domain driven) manner. At that time, we also reviewed some of the logic to make it simpler.

Processing flow

-Instance generation ・ Product list initialization (inventory replenishment) ・ Product list display (display of displayed products) ・ Product selection (input by user) ・ Deposit (input by user) ・ Sales (billing process) ・ Change (refund processing)

Operation image

venderMachine_DDD.gif

Source code

Main.java


package vm;

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        //Instance generation
        Store venderMachine = new Store();
        @SuppressWarnings("resource")
        Scanner scanner = new Scanner(System.in);

        //Product list initialization
        Product water = new Product("water", 80);
        Product coke = new Product("Cola", 100);
        Product orangejuice = new Product("Orange juice", 120);
        venderMachine.addStock(water);
        venderMachine.addStock(coke);
        venderMachine.addStock(orangejuice);

        //Product list display
        System.out.println("≪It is a product for sale≫");
        venderMachine.showProductList();

        //Product selection
        Product purchase = null;
        String purchaseSelectMessage = "Please enter the name of the product you want to purchase.";
        int purchaseSelectCount = 0;
        do {
            if(purchaseSelectCount > 0) {
                purchaseSelectMessage = "The product is not available. Please choose from the products on sale.";
            }

            System.out.println();
            System.out.println(purchaseSelectMessage);
            purchase = venderMachine.inStocker(scanner.next());
            purchaseSelectCount++;
        } while(!venderMachine.isExistsStock(purchase));


        //payment
        String depositMessage = "Please make a deposit.";
        int depositCount = 0;
        do {
            if(depositCount > 0) {
                depositMessage = "The deposit amount is insufficient. Please add the shortfall.";
            }

            System.out.println();
            System.out.println(depositMessage);
            venderMachine.addDeposit(scanner.nextInt());
            depositCount++;
        } while(!venderMachine.isEnoughDeposit(purchase));

        //Sale
        System.out.println();
        venderMachine.sale(purchase);

        //change
        System.out.println();
        venderMachine.change();
    }
}

Store.java


package vm;

public class Store {
    private Stocker stocker;
    private Casher casher;

    Store() {
        stocker = new Stocker();
        casher = new Casher();
    }

    void addDeposit(int deposit) {
        casher.addDeposit(deposit);
    }

    void addStock(Product product) {
        stocker.add(product);
    }

    void change() {
        System.out.println("Change is" + casher.change() + "It is a circle.");
    }

    void showProductList() {
        stocker.showProductList();
    }

    boolean isExistsStock(Product product) {
        return stocker.isExistsProduct(product);
    }

    boolean isEnoughDeposit(Product purchase) {
        return casher.isEnoughDeposit(purchase);
    }

    Product inStocker(String productName) {
        return stocker.getProduct(productName);
    }

    void sale(Product purchase) {
        casher.charge(purchase);
        System.out.println(purchase.name() + "is!");
        System.out.println("Thank you for your purchase.");
    }

}

Casher.java


package vm;

public class Casher {
    private int deposit;
    private int change;

    Casher(){
        deposit = 0;
        change = 0;
    }

    void addDeposit(int deposit) {
        this.deposit += deposit;
    }

    void charge(Product purchase) {
        change = deposit - purchase.price();
    }

    int change() {
        return change;
    }

    public boolean isEnoughDeposit(Product product) {
        if(deposit >= product.price()) {
            return true;
        }
        return false;
    }

}

Stocker.java


package vm;

import java.util.ArrayList;
import java.util.List;

public class Stocker {
    private List<Product> productList;

    Stocker() {
        productList = new ArrayList<>();
    }

    void add(Product product) {
        productList.add(product);
    }

    void showProductList() {
        for(Product product: productList) {
            System.out.println(product.info());
        }
    }

    boolean isExistsProduct(Product product) {
        for(Product stock: productList) {
            if(stock.name().equals(product.name())){
                return true;
            }
        }
        return false;
    }

    Product getProduct(String productName) {
        for(Product stock: productList) {
            if(stock.name().equals(productName)){
                return stock;
            }
        }
        return new Product();
    }

}

Product.java


package vm;

public class Product {
    private String productName;
    private int price;

    Product(String productName, int price) {
        this.productName = productName;
        this.price = price;
    }

    Product() {
        this.productName = "";
        this.price = 0;
    }

    String name() {
        return productName;
    }

    int price() {
        return price;
    }

    String info() {
        String formatStr = "%s : %d yen";
        return String.format(formatStr, productName, price);
    }

}

Recommended Posts

Vending machine made with Java (domain driven)
Sample vending machine made in Java
Sample vending machine made in Java (classification)
Domain Driven Development with Java and Spring Boot ~ Layers and Modules ~
Run an application made with Java8 with Java6
Refactored GUI tools made with Java8 + JavaFX in 2016
Simple obstacle racing made with processing for Java
Make Calendar gadgets made with JavaFX compatible with Java SE 9
Face recognition app made with Amazon Rekognition and Java
java state machine car
Install java with Homebrew
Change seats with java
Install Java with Ansible
Comfortable download with JAVA
Switch java with direnv
Download Java with Ansible
Let's scrape with Java! !!
Build Java with Wercker
Endian conversion with JAVA