Рубрики

Декоратор Pattern | Набор 3 (кодирование дизайна)

Мы обсудили проблему дизайна пиццы и различные наивные подходы к ее решению в наборе 1. Мы также ввели шаблон Декоратор в наборе 2 .

В этой статье обсуждается разработка и реализация шаблона декоратора для задачи «Пицца». Настоятельно рекомендуется сначала попробовать сами.

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

  • Пицца выступает в качестве нашего абстрактного компонента класса.
  • Есть четыре конкретных компонента, а именно PeppyPaneer , FarmHouse , Margherita , ChickenFiesta .
  • ToppingsDecorator — это наш абстрактный декоратор, а FreshTomato , Paneer , Jalapeno , Barbeque — декораторы бетона.

Ниже приведена реализация Java вышеуказанного дизайна.

// Java-программа для демонстрации Decorator
// шаблон

  
// Абстрактный класс пиццы (все классы расширяются
// из этого)

abstract class Pizza

{

    // это абстрактная пицца

    String description = "Unkknown Pizza";

  

    public String getDescription()

    {

        return description;

    }

  

    public abstract int getCost();

}

  
// Класс декоратора: расширяет Pizza до
// взаимозаменяемо с этим topings
// также будет реализован как интерфейс

abstract class ToppingsDecorator extends Pizza

{

    public abstract String getDescription();

}

  
// Бетонные классы пиццы

class PeppyPaneer extends Pizza

{

    public PeppyPaneer() { description = "PeppyPaneer"; }

    public int getCost() {  return 100; }

}

class FarmHouse extends Pizza

{

    public FarmHouse() {  description = "FarmHouse"; }

    public int getCost() { return 200; }

}

class Margherita extends Pizza

{

    public Margherita()  { description = "Margherita"; }

    public int getCost() { return 100;  }

}

class ChickenFiesta extends Pizza

{

    public ChickenFiesta() { description = "ChickenFiesta";}

    public int getCost() { return 200; }

}

class SimplePizza extends Pizza

{

public SimplePizza() { description = "SimplePizza"; }

public int getCost() {  return 50;  }

}

  
// Классы бетонных покрытий

class FreshTomato extends ToppingsDecorator

{

    // нам нужна ссылка на объект, который мы украшаем

    Pizza pizza;

  

    public FreshTomato(Pizza pizza) { this.pizza = pizza; }

    public String getDescription() {

        return pizza.getDescription() + ", Fresh Tomato ";

    }

    public int getCost() { return 40 + pizza.getCost(); }

}

class Barbeque extends ToppingsDecorator

{

    Pizza pizza;

    public Barbeque(Pizza pizza) {  this.pizza = pizza;  }

    public String getDescription() {

        return pizza.getDescription() + ", Barbeque ";

    }

    public int getCost() { return 90 + pizza.getCost(); }

}

class Paneer extends ToppingsDecorator

{

    Pizza pizza;

    public Paneer(Pizza pizza)  {  this.pizza = pizza; }

    public String getDescription() {

        return pizza.getDescription() + ", Paneer ";

    }

    public int getCost()  {  return 70 + pizza.getCost(); }

}

  
// Другие начинки можно кодировать аналогичным образом

  
// Класс драйвера и метод

class PizzaStore

{

    public static void main(String args[])

    {

        // создаем новую пиццу Маргариту

        Pizza pizza = new Margherita();

        System.out.println( pizza.getDescription() +

                         " Cost :" + pizza.getCost());

  

        // создаем новую пиццу FarmHouse

        Pizza pizza2 = new FarmHouse();

  

        // украсить его свежим томатным топингом

        pizza2 = new FreshTomato(pizza2);

  

        // украсить его панировкой

        pizza2 = new Paneer(pizza2);

  

        System.out.println( pizza2.getDescription() +

                         " Cost :" + pizza2.getCost());

        Pizza pizza3 = new Barbeque(null);    // нет конкретной пиццы

        System.out.println( pizza3.getDescription() + "  Cost :" + pizza3.getCost());

   }

}

Выход:

Margherita Cost :100
FarmHouse, Fresh Tomato , Paneer Cost :310

Обратите внимание, как мы можем добавлять / удалять новые пиццы и начинки без изменений в ранее протестированном коде, а начинки и пиццы развязаны.

// Программа CPP для демонстрации
// Шаблон декоратора
#include <iostream>
#include <string>

using namespace std;

  
// Компонент

class MilkShake

{

public:

    virtual string Serve() = 0;

    virtual float price() = 0;

};

  

  
// Бетонный компонент

class BaseMilkShake : public MilkShake

{

public:

    string Serve()

    {

        return "MilkShake";

    }

  

    float price()

    {

        return 30;

    }

};

  
// Декоратор

class MilkShakeDecorator: public MilkShake

{

protected:

    MilkShake *m_MilkShake;

public:

  

    MilkShakeDecorator(MilkShake *baseMilkShake): m_MilkShake(baseMilkShake){}

  

    string Serve()

    {

        return m_MilkShake->Serve();

    }

  

    float price()

    {

        return m_MilkShake->price();

    }

};

  

  
// Конкретный Декоратор

class MangoMilkShake: public MilkShakeDecorator

{

public:

    MangoMilkShake(MilkShake *baseMilkShake): MilkShakeDecorator(baseMilkShake){}

  

    string Serve()

    {

        return m_MilkShake->Serve() + " decorated with Mango ";

    }

    float price()

    {

        return m_MilkShake->price() + 40;

    }

};

  

  

class VanillaMilkShake: public MilkShakeDecorator

{

public:

    VanillaMilkShake(MilkShake *baseMilkShake): MilkShakeDecorator(baseMilkShake){}

  

    string Serve()

    {

        return m_MilkShake->Serve() + " decorated with Vanilla ";

    }

    float price()

    {

        return m_MilkShake->price() + 80;

    }

};

  

int main()

{

  MilkShake *baseMilkShake = new BaseMilkShake();

  cout << "Basic Milk shake \n";

  cout << baseMilkShake -> Serve() << endl;

  cout << baseMilkShake -> price() << endl;    

  

  MilkShake *decoratedMilkShake = new MangoMilkShake(baseMilkShake);

  cout << "Mango decorated Milk shake \n";

  cout << decoratedMilkShake -> Serve() << endl;

  cout << decoratedMilkShake -> price() << endl;    

      

  delete decoratedMilkShake;

  

  decoratedMilkShake = new VanillaMilkShake(baseMilkShake);

  cout << "Vanilla decorated Milk shake \n";

  cout << decoratedMilkShake -> Serve() << endl;

  cout << decoratedMilkShake -> price() << endl;    

  

 delete decoratedMilkShake;

 delete baseMilkShake;

  return 0;

Выход:

Basic Milk shake
MilkShake
Price of MilkShake : 30
Mango decorated Milk shake
MilkShake decorated with Mango
Price of Mango MilkShake : 70
Vanilla decorated Milk shake
MilkShake decorated with Vanilla
Price of Vanilla MilkShake : 110

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

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

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

Декоратор Pattern | Набор 3 (кодирование дизайна)

0.00 (0%) 0 votes