diff --git a/src/edu/androidclub/Application.java b/src/edu/androidclub/Application.java index 4978d01..71b7c4f 100644 --- a/src/edu/androidclub/Application.java +++ b/src/edu/androidclub/Application.java @@ -5,103 +5,28 @@ import java.util.Stack; -/* - Главный класс нашей программы - представляет собой само приложение. - Реализуем интерфейс Runnable - обозачаем, что этот класс (наше приложение) ЗАПУСКАЕМО, - или имеет метод run() -*/ public class Application implements Runnable { - - /* - Храним статический экземпляр нашего приложения - */ private static Application app; - /* - Точка входа в ПРОГРАММУ - */ public static void main(String[] args) { - // Создаем экземпляр приложения в статической переменной и запускаем его app = new Application(); app.run(); } - /* - С помощью этого метода мы в любом участке кода (тк public static) можем получить наше приложение, - причём полученный экземпляр будет ОДИНАКОВЫМ ДЛЯ КАЖДОГО ВЫЗОВА МЕТОДА - - (паттерн Singleton) - */ public static Application getInstance() { - if (app == null) { // Если не создан - создаём + if (app == null) { app = new Application(); } return app; } - /* - Метод запуска приложения как объекта. Определён интерфейсом - */ @Override public void run() { - test(); + Runnable va = new VendingAutomat(); + va.run(); } - /* - Метод тестирования нашего приложения. - Здесь мы создадим случайные данные о продуктах и заполним ими наш "автомат", чтобы протестировать то, что - уже написано - */ private void test() { - // Создадим схему продуктов (пустую) - ItemInfoScheme itemScheme = new ItemInfoScheme(); - // Создадим наборы продуктов для ячеек схемы (пустые) - Stack colas = new Stack<>(); // 1 - Stack sprites = new Stack<>(); // 2 - - // Заполним наши наборы продуктами - colas.push(new Cola()); - colas.push(new Cola()); - colas.push(new Cola()); - sprites.push(new Sprite()); - sprites.push(new Sprite()); - - // Создадим объекты-координаты наших наборов продуктов в схеме - Coordinates colaCors = new Coordinates(1, 1); - Coordinates spriteCors = new Coordinates(1, 2); - - // Поместии наборы продуктов в схему - itemScheme.put(colaCors, colas); - itemScheme.put(spriteCors, sprites); - - // Создадим нашу витрину (коробку продуктов) на основании схемы - ItemBox itemBox = new ProductsBox(itemScheme); - - // Протестируем схему - заставим витрину выдавать объекты на заданных координатах - System.out.println( // Напечатать в консоль - itemBox.emit( // Выдать предмет - new Coordinates(1, 1) // Указываем координату - ) - .getName() // Получить имя предмета - ); // OK - System.out.println(itemBox.emit(new Coordinates(1, 1)).getName()); // OK - System.out.println(itemBox.emit(new Coordinates(1, 1)).getName()); // OK - - System.out.println(itemBox.emit(new Coordinates(1, 1)).getName()); // FAIL - предметы кончились в ячейке - } - - // Опишем Колу как подкласс Предмета - public static class Cola extends Item { - public Cola() { - super("Cola"); // Вызов конструктора класса-родителя (класса Item) - } - } - - // Опишем Спрайт как подкласс Предмета - public static class Sprite extends Item { - public Sprite() { - super("Sprite"); - } } } diff --git a/src/edu/androidclub/Command.java b/src/edu/androidclub/Command.java new file mode 100644 index 0000000..e22e187 --- /dev/null +++ b/src/edu/androidclub/Command.java @@ -0,0 +1,28 @@ +package edu.androidclub; + +public class Command { + public static final String TYPE_GET = "get"; + + private final String type; + private final Object data; + + public Command(String type, Object data) { + this.type = type; + this.data = data; + } + + public String getType() { + return type; + } + + public Object getData() { + return data; + } + + @Override + public String toString() { + return "Command: { type = " + type + + ", data = " + data + + " }"; + } +} diff --git a/src/edu/androidclub/ConsoleInput.java b/src/edu/androidclub/ConsoleInput.java new file mode 100644 index 0000000..ec1b82c --- /dev/null +++ b/src/edu/androidclub/ConsoleInput.java @@ -0,0 +1,47 @@ +package edu.androidclub; + +import edu.androidclub.domain.Keypad; +import org.omg.CORBA.CODESET_INCOMPATIBLE; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + +public class ConsoleInput implements Keypad { + + @Override + public Command readCommand() { + InputStream in = System.in; + InputStreamReader reader = new InputStreamReader(in); + BufferedReader bufferedReader = new BufferedReader(reader); + String line = ""; + try { + line = bufferedReader.readLine(); + } catch (IOException ioex) { + System.err.println(ioex.toString()); + System.exit(0); + } + return getCommandByString(line); + } + + private Command getCommandByString(String input) { + Command result = null; + String typeStr = input.trim().substring(0, input.lastIndexOf(' ')); + String dataStr = input.trim().substring(input.lastIndexOf(' ') + 1, input.length()); + + int data = Integer.valueOf(dataStr); + int x = data / 10; + int y = data % 10; + + if (typeStr.equals(Command.TYPE_GET)) { + result = new Command( + Command.TYPE_GET, + new Coordinates(x, y) + ); + } + + return result; + } + +} \ No newline at end of file diff --git a/src/edu/androidclub/ConsoleScreen.java b/src/edu/androidclub/ConsoleScreen.java new file mode 100644 index 0000000..7cb9276 --- /dev/null +++ b/src/edu/androidclub/ConsoleScreen.java @@ -0,0 +1,25 @@ +package edu.androidclub; + +import edu.androidclub.domain.AppScreen; + +import java.io.PrintStream; + +public class ConsoleScreen implements AppScreen { + + private static final String LINE_BORDER = "###"; + + private final PrintStream ps = System.out; + + @Override + public void printText(String text) { + ps.println(LINE_BORDER + " " + text + " " + LINE_BORDER); + } + + @Override + public void clear() { + for (int i = 0; i < 15; i++) { + ps.println(); + } + } + +} diff --git a/src/edu/androidclub/ProductsBox.java b/src/edu/androidclub/ProductsBox.java index 6e71494..c285178 100644 --- a/src/edu/androidclub/ProductsBox.java +++ b/src/edu/androidclub/ProductsBox.java @@ -31,6 +31,17 @@ public Item emit(Coordinates coordinates) { // Возвращаем верхний элемент и удаляем его с вершины стопки return items.pop(); } + + + public String thereAre(Coordinates coordinates) { + Stack items = scheme.get(coordinates); + if (items.empty()) { + return "Запрашиваемого предмета нет"; + } + else{ + return "Запрашиваемый предмет есть"; + } + } } @@ -48,3 +59,6 @@ public Item emit(Coordinates coordinates) { + + + diff --git a/src/edu/androidclub/VendingAutomat.java b/src/edu/androidclub/VendingAutomat.java new file mode 100644 index 0000000..0571dd6 --- /dev/null +++ b/src/edu/androidclub/VendingAutomat.java @@ -0,0 +1,79 @@ +package edu.androidclub; + +import edu.androidclub.domain.AppScreen; +import edu.androidclub.domain.Item; +import edu.androidclub.domain.ItemBox; +import edu.androidclub.domain.Keypad; +import edu.androidclub.items.Cola; +import edu.androidclub.items.Fanta; +import edu.androidclub.items.Pulpy; +import edu.androidclub.items.Sprite; + +import java.util.Stack; + +public class VendingAutomat implements Runnable { + + private Keypad keypad = new ConsoleInput(); + private ItemBox itemBox = null; + private AppScreen screen = new ConsoleScreen(); + + @Override + public void run() { + populateItemBox(); + while (true) { + requestCommand(); + } + } + + private void requestCommand() { + screen.printText( + "Hi dear User! Enter 'get #' where # is a product number to get it: " + ); + Command userCommand = keypad.readCommand(); + if (userCommand.getType().equals(Command.TYPE_GET)) { + Item item = itemBox.emit((Coordinates) userCommand.getData()); + if (item == null) { + screen.printText("No items left"); + } else { + screen.printText(item.getName() + " " + item.getCost()); + } + } + } + + private void populateItemBox() { + ItemInfoScheme scheme = new ItemInfoScheme(); + Stack items11 = new Stack<>(); + Stack items12 = new Stack<>(); + Stack items21 = new Stack<>(); + Stack items22 = new Stack<>(); + + populateStack(items11, "Cola", 15); + populateStack(items12, "Fanta", 2); + populateStack(items21, "Sprite", 1); + populateStack(items22, "Pulpy", 5); + + scheme.put(new Coordinates(1, 1), items11); + scheme.put(new Coordinates(1, 2), items12); + scheme.put(new Coordinates(2, 1), items21); + scheme.put(new Coordinates(2, 2), items22); + + itemBox = new ProductsBox(scheme); + } + + private void populateStack(Stack stack, String name, int count) { + for (int i = 0; i < count; i++) { + if (name.equals("Cola")) { + stack.push(new Cola()); + } + if (name.equals("Sprite")) { + stack.push(new Sprite()); + } + if (name.equals("Fanta")) { + stack.push(new Fanta()); + } + if (name.equals("Pulpy")) { + stack.push(new Pulpy()); + } + } + } +} \ No newline at end of file diff --git a/src/edu/androidclub/domain/Item.java b/src/edu/androidclub/domain/Item.java index 87e3204..8beae19 100644 --- a/src/edu/androidclub/domain/Item.java +++ b/src/edu/androidclub/domain/Item.java @@ -4,13 +4,19 @@ // Он тоже неизменяемый - т.к. все поля final public abstract class Item { private final String name; + private final int cost; - public Item(String name) { + public Item(String name, int cost) { this.name = name; + this.cost = cost; } // Получить имя public String getName() { return name; } + + public int getCost() { + return cost; + } } diff --git a/src/edu/androidclub/domain/ItemBox.java b/src/edu/androidclub/domain/ItemBox.java index dd93439..cefbe4d 100644 --- a/src/edu/androidclub/domain/ItemBox.java +++ b/src/edu/androidclub/domain/ItemBox.java @@ -9,5 +9,5 @@ public interface ItemBox { /* Выдать предмет по его координатам */ Item emit(Coordinates coordinates); - + String thereAre(Coordinates coordinates); } diff --git a/src/edu/androidclub/domain/Keypad.java b/src/edu/androidclub/domain/Keypad.java new file mode 100644 index 0000000..d7057c3 --- /dev/null +++ b/src/edu/androidclub/domain/Keypad.java @@ -0,0 +1,9 @@ +package edu.androidclub.domain; + +import edu.androidclub.Command; + +public interface Keypad { + + Command readCommand(); + +} diff --git a/src/edu/androidclub/items/Cola.java b/src/edu/androidclub/items/Cola.java new file mode 100644 index 0000000..655d78b --- /dev/null +++ b/src/edu/androidclub/items/Cola.java @@ -0,0 +1,11 @@ +package edu.androidclub.items; + +import edu.androidclub.domain.Item; + +public class Cola extends Item { + + public Cola() { + super("Cola", 45); + } + +} diff --git a/src/edu/androidclub/items/Fanta.java b/src/edu/androidclub/items/Fanta.java new file mode 100644 index 0000000..bf00b8b --- /dev/null +++ b/src/edu/androidclub/items/Fanta.java @@ -0,0 +1,9 @@ +package edu.androidclub.items; + +import edu.androidclub.domain.Item; + +public class Fanta extends Item{ + public Fanta() { + super("Fanta", 45); + } +} diff --git a/src/edu/androidclub/items/Pulpy.java b/src/edu/androidclub/items/Pulpy.java new file mode 100644 index 0000000..382cf94 --- /dev/null +++ b/src/edu/androidclub/items/Pulpy.java @@ -0,0 +1,11 @@ +package edu.androidclub.items; + +import edu.androidclub.domain.Item; + +public class Pulpy extends Item { + + public Pulpy() { + super("Pulpy", 100); + } + +} diff --git a/src/edu/androidclub/items/Sprite.java b/src/edu/androidclub/items/Sprite.java new file mode 100644 index 0000000..91f7452 --- /dev/null +++ b/src/edu/androidclub/items/Sprite.java @@ -0,0 +1,11 @@ +package edu.androidclub.items; + +import edu.androidclub.domain.Item; + +public class Sprite extends Item { + + public Sprite() { + super("Sprite", 45); + } + +}