Шаблон декоратора в C++

Может кто-нибудь привести пример шаблона проектирования Decorator в C++? Я сталкивался с его Java-версией, но мне было трудно понять ее версию на C++ (из примеров, которые я нашел).

Благодарю.

4 ответа

Решение

Шаблоны дизайна Винса Хьюстона, даже несмотря на плохую разметку, имеют реализацию C++ для большинства шаблонов дизайна в книге "Бригада четырех".

Нажмите для декоратора.

В Java нет большой разницы, за исключением ручной обработки памяти, которую лучше обернуть умными указателями:)

Я нашел сайт http://sourcemaking.com/ довольно хорошим, когда дело доходит до объяснения различных шаблонов дизайна.

Шаблон проектирования Decorator имеет примеры на С ++, такие как обзорный пример, " до и после" и пример с кодированием / декодированием пакетов.

#include <iostream>
using namespace std;

class Computer
{
public:
    virtual void display()
    {
        cout << "I am a computer..." << endl;
    }
};

class CDDrive : public Computer
{
private:
    Computer* c;
public:
    CDDrive(Computer* _c)
    {
        c = _c;
    }
    void display()
    {
        c->display();
        cout << "with a CD Drive..." << endl;
    }
};

class Printer : public Computer
{
private:
    CDDrive* d;
public:
    Printer(CDDrive* _d)
    {
        d = _d;
    }
    void display()
    {
        d->display();
        cout << "with a printer..." << endl;
    }
};

int main()
{
    Computer* c = new Computer();
    CDDrive* d = new CDDrive(c);
    Printer* p = new Printer(d);

    p->display();
}

Недавно изучаю C ++ и шаблоны проектирования, приведу пример из <Head First Design Pattern>.

main.cpp находится здесь:

      #include <iostream>

#include "Decaf.h"
#include "Espresso.h"
#include "MochaDecorator.h"
#include "MilkDecorator.h"

using std::cout;
using std::endl;


int main(){
    cout << "---------------------------" << endl;
   
    // only Decaf, no addsOn
    Beverage* decafOnly = new Decaf();
    cout << decafOnly->getDescription() << endl;
    cout << decafOnly->cost() << endl;
    delete decafOnly;
    cout << "---------------------------" << endl;

    // Decaf + Mocha
    Beverage* decaf = new Decaf();
    MochaDecorator mocha_decaf = MochaDecorator(decaf);
    cout << mocha_decaf.getDescription() << endl;
    cout << mocha_decaf.cost() << endl;
    delete decaf;
    cout << "---------------------------" << endl;

    // Espresso + Milk
    Beverage* espresso = new Espresso();
    MilkDecorator milk_espresso = MilkDecorator(espresso);
    cout << milk_espresso.getDescription() << endl;
    cout << milk_espresso.cost() << endl;
    delete espresso;
    cout << "---------------------------" << endl;

    // Note: decorators can wrap not only components but the other decorators as well

    // Esresso + Mocha + Milk + Milk,  method 1-------------------------------
    // Beverage* espresso2 = new Espresso();                               // Espresso
    // MochaDecorator* mocha_espresso = new MochaDecorator(espresso2);     // Espresso + Mocha
    // MilkDecorator* milk_deco = new MilkDecorator(mocha_espresso);       // Espresso + Mocha + Milk
    // MilkDecorator* milk_deco2 = new MilkDecorator(milk_deco);           // Espresso + Mocha + Milk + Milk
    // cout << milk_deco2->getDescription() << endl;
    // cout << milk_deco2->cost() << endl;
    // delete espresso2;
    // delete mocha_espresso;
    // delete milk_deco;
    // delete milk_deco2;

    // Esresso + Mocha + Milk + Milk,  method 2------------------------------
    Beverage* espresso2 = new MilkDecorator(new MilkDecorator(new MochaDecorator(new Espresso())));
    cout << espresso2->getDescription() << endl;
    cout << espresso2->cost() << endl;
    delete espresso2;
 
    
    cout << "---------------------------" << endl;
    return 0;
}

другие файлы, пожалуйста, смотрите в моем гитхабе:

https://github.com/jwbecalm/Head-First-Design-Patterns-in-CPP/tree/main/ch03_Decorator

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