Шаблон декоратора в 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