Теряюсь в догадках. Предлагаю головоломку.

Ресторан(14)

1.Внутри StatisticStorage создай метод void put(EventDataRow data).

2.Чтобы методом put(EventDataRow data) добавить объект data в данные карты, нужен тип события — EventType.

Будет правильно, если событие будет хранить в себе свой тип. Поэтому:

2.1.В интерфейс EventDataRow добавь метод EventType getType()

2.2.Реализуй этот метод в каждом классе-событии: CookedOrderEventDataRow, NoAvailableVideoEventDataRow, VideoSelectedEventDataRow

3.Сделай так, чтобы к методу void put(EventDataRow data) нельзя было получить доступ за пределами класса StatisticManager.

Воспользуйся особенностями вложенных классов.

Теперь остается расставить вызовы StatisticManager в те места, которые генерируют события.

4.Зарегистрируй событие для повара во время приготовления еды.

Добавь геттер для поля dishes в класс Order, используйте его при создании события.

5.Зарегистрируй событие «видео выбрано» перед отображением рекламы пользователю.

6.Метод register с одним параметром типа EventDataRow должен регистрировать полученное событие в statisticStorage.


package com.javarush.task.task27.task2712.statistic;   
import com.javarush.task.task27.task2712.statistic.event.EventDataRow;
import com.javarush.task.task27.task2712.statistic.event.EventType;   
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class StatisticManager {
    private static StatisticManager ourInstance = new StatisticManager();

    private StatisticStorage statisticStorage = new StatisticStorage();

    public static StatisticManager getInstance() {
        return ourInstance;
    }

    private StatisticManager() {
    }

    public void register(EventDataRow data) {
        statisticStorage.put(data);
        //new StatisticStorage().put(data);
    }

    private class StatisticStorage {
        private Map<EventType, List<EventDataRow>> storage = new HashMap<>();
        private StatisticStorage() {
            for (EventType type : EventType.values()) {
                storage.put(type, new ArrayList<EventDataRow>());
            }
        }
        private void put(EventDataRow data) {
            storage.get(data.getType()).add(data);
        }
    }
}

    package com.javarush.task.task27.task2712.kitchen;
    import com.javarush.task.task27.task2712.ConsoleHelper;
    import com.javarush.task.task27.task2712.Tablet;
    import com.javarush.task.task27.task2712.statistic.StatisticManager;
    import com.javarush.task.task27.task2712.statistic.event.CookedOrderEventDataRow;

    import java.util.Observable;
    import java.util.Observer;

    public class Cook extends Observable implements Observer{
        private final String name;

        public Cook(String name) {
            this.name = name;
        }

        @Override
        public void update(Observable observable, Object arg) {
            Tablet tablet = (Tablet) observable;
            Order order = (Order) arg;

            StatisticManager.getInstance().register(
                    new CookedOrderEventDataRow(
                            tablet.toString(),
                            this.name,
                            order.getTotalCookingTime() * 60,
                            order.getDishes()));
            ConsoleHelper.writeMessage(String.format("Start cooking - %s, cooking time %dmin", order, order.getTotalCookingTime()));
            setChanged();
            notifyObservers(order);
        }

        @Override
        public String toString() {
            return name;
        }
    }

package com.javarush.task.task27.task2712.kitchen;
import com.javarush.task.task27.task2712.ConsoleHelper;
import com.javarush.task.task27.task2712.Tablet;

import java.io.IOException;
import java.util.List;

public class Order {
    private final int number;
    protected List<Dish> dishes;
    private final Tablet tablet;

    public Order(Tablet tablet) throws IOException {
        this.tablet = tablet;
        number = tablet.getNumber();
        dishes = ConsoleHelper.getAllDishesForOrder();
    }

    public int getTotalCookingTime() {
        int sum = 0;
        if (!isEmpty())
            for (Dish dish : dishes)
                sum += dish.getDuration();

        return sum;
    }

    public boolean isEmpty() {
        return dishes.isEmpty();
    }

    public List<Dish> getDishes() {
        return dishes;
    }

    @Override
    public String toString() {
        return "Your order: " + dishes + " of " + tablet;
    }
}

package com.javarush.task.task27.task2712;

import com.javarush.task.task27.task2712.ad.AdvertisementManager;
import com.javarush.task.task27.task2712.ad.NoVideoAvailableException;
import com.javarush.task.task27.task2712.kitchen.Order;

import java.io.IOException;
import java.util.Observable;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Tablet extends Observable {
    private final int number;
    private static Logger logger = Logger.getLogger(Tablet.class.getName());

    public Tablet(int number) {
        this.number = number;
    }

    public int getNumber() {
        return number;
    }

    public Order createOrder() {
        Order order = null;
        try {
            order = new Order(this);
            if (!order.isEmpty()) {
                ConsoleHelper.writeMessage(order.toString());
                setChanged();
                notifyObservers(order);
                new AdvertisementManager(order.getTotalCookingTime() * 60).processVideos();
            }
            return order;
        } catch (
                NoVideoAvailableException e)

        {
            logger.log(Level.INFO, "No video is available for the order " + order);
        } catch (IOException e) {
            logger.log(Level.SEVERE, "Console is unavailable.");
        }
        return null;
    }

    @Override
    public String toString() {
        return "Tablet{" +
                "number=" + number +
                '}';
    }
}

package com.javarush.task.task27.task2712.statistic.event;  
import com.javarush.task.task27.task2712.ad.Advertisement;  
import java.util.Date;
import java.util.List;

public class VideoSelectedEventDataRow implements EventDataRow{
    private List<Advertisement> optimalVideoSet;
    private long amount;
    private int totalDuration;
    private Date currentDate;
    public VideoSelectedEventDataRow(List<Advertisement> optimalVideoSet, long amount, int totalDuration) {
        this.optimalVideoSet = optimalVideoSet;
        this.amount = amount;
        this.totalDuration = totalDuration;
        currentDate = new Date();
    }

    @Override
    public EventType getType() {
        return EventType.SELECTED_VIDEOS;
    }
}

package com.javarush.task.task27.task2712.statistic.event;
import com.javarush.task.task27.task2712.kitchen.Dish;   
import java.util.Date;
import java.util.List;

public class CookedOrderEventDataRow implements EventDataRow{
    private String tabletName;
    private String cookName;
    private int cookingTimeSeconds;
    private List<Dish> cookingDishs;
    private Date currentDate;
    public CookedOrderEventDataRow(String tabletName, String cookName, int cookingTimeSeconds, List<Dish> cookingDishs) {
        this.tabletName = tabletName;
        this.cookName = cookName;
        this.cookingTimeSeconds = cookingTimeSeconds;
        this.cookingDishs = cookingDishs;
        currentDate = new Date();
    }

    @Override
    public EventType getType() {
        return EventType.COOKED_ORDER;
    }
}

package com.javarush.task.task27.task2712.statistic.event;  
import java.util.Date;

public class NoAvailableVideoEventDataRow implements EventDataRow{
    private int totalDuration;
    private Date currentDate;
    public NoAvailableVideoEventDataRow(int totalDuration) {
        this.totalDuration = totalDuration;
        currentDate = new Date();
    }

    @Override
    public EventType getType() {
        return EventType.NO_AVAILABLE_VIDEO;
    }
}

package com.javarush.task.task27.task2712.statistic.event;
public enum EventType {
    COOKED_ORDER, SELECTED_VIDEOS, NO_AVAILABLE_VIDEO
}

package com.javarush.task.task27.task2712.statistic.event;
public interface EventDataRow {
    EventType getType();
}

Часть AdvertisementManager:

int totalDuration = 0;
maxSum = 0;
for (Advertisement advertisement: arrayList.get(0)) {
    totalDuration += advertisement.getDuration();
    maxSum += advertisement.getAmountPerOneDisplaying();
}

StatisticManager.getInstance().register(new VideoSelectedEventDataRow(arrayList.get(0), maxSum, totalDuration));
//System.out.println("maxSum: " + maxSum + " totalDuration: " + totalDuration);

for (Advertisement advertisement : arrayList.get(0)) {
    if (timeSeconds >= advertisement.getDuration()) {
        ConsoleHelper.writeMessage(advertisement.getName()
                + " is displaying... "
                + advertisement.getAmountPerOneDisplaying()
                + ", "
                + advertisement.getAmountPerOneDisplaying() * 1000 / advertisement.getDuration());
        advertisement.revalidate();
    }
}

задан 22 Фев, 18:47

Kirilo's gravatar image

Kirilo
29918
одобрено: 22%

изменено 23 Фев, 11:20


Странно, но причина была в Advertisment, не обрабатывалась ошибка, исправил:

 public void revalidate() throws
   UnsupportedOperationException {
           if (getHits() <= 0)
               //throw new UnsupportedOperationException();
               throw new NoVideoAvailableException();

           hits--;
   }
ссылка

опубликован 23 Фев, 11:13

Kirilo's gravatar image

Kirilo
29918
одобрено: 22%

Оно как-бы и не странно но я тоже об этом и не подумал а ломал голову почему не правильно регистрируются события.

(20 Мар, 18:00) Cool
Ваш ответ
включить просмотр

Следить за вопросом

По Email:

После авторизации вы сможете подписаться на любые обновления здесь

Основы Markdown

  • *italic* or _italic_
  • **bold** or __bold__
  • ссылка:[текст](http://url.com/ "заголовок")
  • изображение?![alt текст](/path/img.jpg "заголовок")
  • нумерованный список: 1. Foo 2. Bar
  • Для того чтобы добавить разрыв строки просто добавьте два пробела.
  • основные HTML тэги, также поддерживаются

Тэги:

×21
×16

Задан: 22 Фев, 18:47

Просмотров: 621 раз

Отредактирован: 20 Мар, 18:00