Core

Несколько заданий из квеста Core

/* 1. Подумай, какой из двух интерфейсов нужно реализовать в классе BeerLover.
2. Добавь к классу BeerLover этот интерфейс и реализуй все его методы.
3. Подумай, как связаны переменная READY_TO_GO_HOME и метод isReadyToGoHome.
4. Верни значение переменной READY_TO_GO_HOME в методе isReadyToGoHome.
 Требования:
 •
 Класс BeerLover должен реализовывать(implements) интерфейс Alcoholic. 
•
 Класс BeerLover не должен реализовывать интерфейс Drinker напрямую(только опосредованно через Alcoholic) 
•
 В классе BeerLover должны быть реализованы все методы интерфейса Alcoholic. 
•
 В классе BeerLover должны быть реализованы все методы интерфейса Drinker. 
•
 Метод isReadyToGoHome должен возвращать значение переменной READY_TO_GO_HOME. 
 
 
 ///////////////////////////////////////////////////////////////////
*/
package com.javarush.task.task13.task1301;

/* 
Пиво
*/
public class Solution {
    public static void main(String[] args) throws Exception {
    }

    public interface Drinker {
        void askForMore(String message);

        void sayThankYou();

        boolean isReadyToGoHome();
    }

    public interface Alcoholic extends Drinker {
        boolean READY_TO_GO_HOME = false;

        void sleepOnTheFloor();
    }

    public static class BeerLover {

    }
} 

Еще задание:

/*
1. Переделай наследование в классах и интерфейсах так, чтобы программа компилировалась и продолжала делать то же самое.
2. Класс Hobby должен наследоваться от интерфейсов Desire, Dream.
 Требования:
 •
 Интерфейс Desire должен быть реализован в классе Hobby. 
•
 Интерфейс Dream должен быть реализован в классе Hobby. 
•
 Класс Hobby должен содержать статическую переменную INDEX. 
•
 Метод toString в классе Hobby должен инкрементировать и возвращать переменную INDEX в виде строки. 
 
 
*/
package com.javarush.task.task13.task1321;


/* 
Исправление ошибок
*/

public class Solution {

    public static void main(String[] args) {
        System.out.println(Dream.HOBBY.toString());
        System.out.println(new Hobby().INDEX);
    }

    interface Desire {
    }

    interface Dream implements Hobby {
        public static Hobby HOBBY = new Hobby();
    }

    static class Hobby extends Desire, Dream {
        static int INDEX = 1;

        @Override
        public String toString() {
            INDEX++;
            return "" + INDEX;
        }
    }

} 

И еще задание:

/*
1.Разберись, что делает программа. Официант почему-то не относит приготовленные блюда назад к столам :(
 2.Исправь ошибку.

 Требования:
 •
 Класс Restaurant должен содержать список поваров и официантов (public static поле threads типа List<Thread>). 
•
 Класс Manager должен содержать очередь с заказами (private final поле orderQueue типа Queue<Order>). 
•
 Класс Manager должен содержать очередь с готовыми блюдами (private final поле dishesQueue типа Queue<Dishes>). 
•
 Класс Manager должен реализовывать паттерн Singleton. 
•
 Класс Waiter должен реализовывать интерфейс Runnable. 
•
 Класс Cook должен реализовывать интерфейс Runnable. 
•
 Если нет готовых блюд в очереди, нить класса Waiter должна получать заказ от столика и добавлять его в очередь заказов. 
•
 Если есть готовые блюда в очереди, нить класса Waiter должна брать блюдо из очереди и относить заказ для столика. 
•
 Если нет заказов в очереди с заказами, нить класса Cook должна отдыхать (повар отдыхает). 
•
 Если есть заказы в очереди с заказами, нить класса Cook должна готовить блюдо и добавлять его в очередь с готовыми блюдами. 
 
 
 ///////////////////////////////////////////////////////////////////
*/
package com.javarush.task.task17.task1712;

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

/* 
Ресторан
*/

public class Restaurant {
    public static List<Thread> threads = new ArrayList<>();

    public static void main(String[] args) throws Exception {
        Waiter waiterTarget = new Waiter();
        Thread waiter = new Thread(waiterTarget);
        threads.add(waiter);

        Cook cookTarget = new Cook();
        Thread cook = new Thread(cookTarget);
        threads.add(cook);

        waiter.start();
        cook.start();

        Thread.sleep(2000);
        cookTarget.continueWorking = false;
        Thread.sleep(500);
        waiterTarget.continueWorking = false;
    }
}

 
 ///////////////////////////////////////////////////////////////////
package com.javarush.task.task17.task1712;

public class Dishes {
    private byte tableNumber;

    public Dishes(byte tableNumber) {
        this.tableNumber = tableNumber;
    }

    public byte getTableNumber() {
        return tableNumber;
    }
}

 
 ///////////////////////////////////////////////////////////////////
package com.javarush.task.task17.task1712;

public class Table {
    private static byte tableNumber;
    private byte number = ++tableNumber;

    public Order getOrder () {
        return new Order(number);
    }
}

 
 ///////////////////////////////////////////////////////////////////
package com.javarush.task.task17.task1712;

public class Order {
    private long time;
    private byte tableNumber;

    public Order(byte tableNumber) {
        time = (long) (Math.random() * 200);
        this.tableNumber = tableNumber;
    }

    public long getTime() {
        return time;
    }

    public byte getTableNumber() {
        return tableNumber;
    }
}

 
 ///////////////////////////////////////////////////////////////////
package com.javarush.task.task17.task1712;

public class Waiter implements Runnable {
    public boolean continueWorking = true;

    @Override
    public void run() {
        Manager manager = Manager.getInstance();

        while (continueWorking || !manager.getDishesQueue().isEmpty()) {
            if (!manager.getDishesQueue().isEmpty()) {       //относим готовый заказ
                Dishes dishes = manager.getDishesQueue().poll();
                System.out.println("Официант отнес заказ для стола №" + dishes.getTableNumber());
            } else {                                         //берем новый заказ
                Table table = manager.getNextTable();
                Order order = table.getOrder();
                System.out.println("Получен заказ от стола №" + order.getTableNumber());
                manager.getOrderQueue().add(order);
            }
            try {
                Thread.sleep(100);  //walking to the next table
            } catch (InterruptedException e) {
            }
        }
    }
}