Рубрики

Декоратор Pattern | Набор 1 (фон)

Чтобы понять шаблон декоратора, давайте рассмотрим сценарий, вдохновленный книгой «Head First Design Pattern». Предположим, мы создаем приложение для магазина пиццы и нам нужно смоделировать классы пиццы. Предположим, они предлагают четыре вида пиццы, а именно: Пеппи Панир, Ферма, Маргарита и Куриная фиеста. Сначала мы просто используем наследование и абстрагируем общие функциональные возможности в классе Pizza .

Каждая пицца имеет разную стоимость. Мы переопределили getCost () в подклассах, чтобы найти соответствующую стоимость. Теперь предположим, что в дополнение к пицце, новое требование, клиент может также попросить несколько добавок, таких как свежие помидоры, панир, халапеньо, паприка, барбекю и т. Д. Давайте подумаем на некоторое время о том, как мы приспосабливаемся к изменениям в вышеупомянутых классах так что клиент может выбрать пиццу с начинкой, и мы получаем полную стоимость пиццы и начинки, которую выберет клиент.

Давайте посмотрим на различные варианты.

Опция 1
Создайте новый подкласс для каждой начинки с пиццей. Диаграмма классов будет выглядеть так:

Это выглядит очень сложно. Есть слишком много классов и это кошмар обслуживания. Также, если мы хотим добавить новую начинку или пиццу, мы должны добавить так много классов. Это явно очень плохой дизайн.

Вариант 2:
Давайте добавим переменные экземпляра в базовый класс пиццы, чтобы показать, есть ли у каждой пиццы начинка. Диаграмма классов будет выглядеть так:

Метод getCost () суперкласса вычисляет затраты на все начинки, в то время как тот, что в подклассе, добавляет стоимость этой конкретной пиццы.

// Sample getCost() in super class
public int getCost()
{
    int totalToppingsCost = 0;
    if (hasJalapeno() )
        totalToppingsCost += jalapenoCost;
    if (hasCapsicum() )
        totalToppingsCost += capsicumCost;

    // similarly for other toppings
    return totalToppingsCost;
}
// Sample getCost() in subclass
public int getCost()
{
    // 100 for Margherita and super.getCost()
    // for toppings.
    return super.getCost() + 100;
}

Этот дизайн выглядит хорошо сначала, но давайте посмотрим на проблемы, связанные с ним.

  • Изменение цены в начинки приведет к изменению существующего кода.
  • Новые начинки заставят нас добавлять новые методы и изменять метод getCost () в суперклассе.
  • Для некоторых пицц некоторые начинки могут не подходить, но подкласс наследует их.
  • Что, если клиент хочет двойной перец или двойной чизбургер?

Короче говоря, наш дизайн нарушает один из самых популярных принципов дизайна — принцип Open-Closed, который гласит, что классы должны быть открыты для расширения и закрыты для модификации.

В следующем наборе мы представим Decorator Pattern и применим его к вышеупомянутой проблеме.

Список литературы: Head First Design Patterns (Книга).

Эта статья предоставлена Сулабх Кумар . Если вам нравится GeeksforGeeks и вы хотите внести свой вклад, вы также можете написать статью и отправить ее по почте на contrib@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме

Рекомендуемые посты:

Декоратор Pattern | Набор 1 (фон)

0.00 (0%) 0 votes