Реализация шаблона стратегии для моей конкретной проблемы

Для школьного задания у меня есть возможность реализовать Шаблон стратегии, и я полностью понимаю шаблон с интерфейсом и контекстом, который в зависимости от того, что спрашивают, получает правильную Стратегию, но я просто не могу понять, как реализовать ее с моим конкретная проблема.

Эта проблема:

Дайте план решения (с диаграммой классов UML), которое решает следующую проблему: Система управляет несколькими поварами (для этого используется класс повара). Некоторые из этих поваров нуждаются в вещах, отличных от других, чтобы подготовить себя к кулинарному занятию, таким образом, повара выделяются среди других и могут подавать различные блюда. Система используется сетью ресторанов, которая работает с большим количеством поваров. Важно составить правильный набор поваров на основе ограниченной комбинации приготовлений, должно быть довольно легко удалить поваров определенного типа или добавить новых. Ваше решение должно показывать разные шаги после вызова метода prepare () для cook. Некоторые примеры: повар Джероен просто должен надеть фартук, это то же самое, что и большинство других поваров. Но повар Кристиан должен "надеть фартук, взять коллекцию ножей и включить классическую музыку". А поварам Нини и Лео нужно "открыть пиво и зажечь". Осторожно: некоторые действия требуют взаимодействия с другими классами (их не нужно явно включать в ваше решение), поэтому недостаточно просто добавить атрибут String 'prepare'!

Я предполагаю, что предварительная операция - это интерфейс Стратегии, а различные виды предварительных операций - это ConcreteStrategies (пример можно найти здесь: http://upload.wikimedia.org/wikipedia/commons/3/39/Strategy_Pattern_in_UML.png), а повар - контекст в этом примере

Надеюсь, вы сможете пролить немного света на это для меня (я бы предпочел намек на правильное направление вместо полного решения)

Изменить: заменил мое объяснение проблемы и вставил оригинальный текст

1 ответ

Решение

Вы на правильном пути. каждый Cook должен иметь список Preparation интерфейсы. Я бы порекомендовал иметь конструктора для повара, который берет список из них вместо установщика. Интерфейс подготовки должен иметь способ получения описания препарата, например getDescription(), Затем можно создать такую ​​реализацию, как PutApronOnPreparation который может иметь член String с именем description это также может быть установлено из конструктора. Вот как это будет выглядеть:

class PutApronOnPreparation implements Preparation {
    private final String description;

    public PutApronOnPreparation(String description) {
        this.description = description;
    }

    @Override
    public getDescription() {
        return description;
    }
}

Теперь, если у вас есть Cook экземпляр, который был инициализирован со списком этих Preparation реализации, его prepare() метод может перебирать список и вызывать getDescription() для каждого из них.

Наконец, для поиска по ряду Cook случаи вы можете иметь другой метод, такой как hasPreparation(...) который может принимать строковый аргумент и который перебирает список подготовки и проверяет, getDescription() значение содержит эту строку. В качестве альтернативы, он может принимать Prep в качестве аргумента и, если вы переопределили метод equals(), вы бы сопоставили объекты напрямую.

Другие вопросы по тегам