Czy ktoś może podać przykład wzoru projektu dekoratora w C++? Natknąłem się na wersję Java tego, ale było trudno zrozumieć jego wersję C++ (z przykładów, które znalazłem).Dekorator w C++
Dzięki.
Czy ktoś może podać przykład wzoru projektu dekoratora w C++? Natknąłem się na wersję Java tego, ale było trudno zrozumieć jego wersję C++ (z przykładów, które znalazłem).Dekorator w C++
Dzięki.
Wzory projektowe Vince'a Hustona, mimo że jego układ jest słaby, ma implementację C++ dla większości wzorców projektowych w książce Gang of Four.
Kliknij, aby uzyskać Decorator.
Nie ma dużej różnicy w Javie, z wyjątkiem ręcznego przemieszczania że lepiej owinąć inteligentnych wskaźników :)
Znalazłem stronę Sourcemaking się być całkiem dobry, jeśli chodzi o pamięci explaining different Design Patterns.
Wzór Decorator konstrukcja ma przykładów C++, takie jak overview example określenie "before and after", i example with packet encoding/decoding.
+1 za wspaniałą odpowiedź. Sprawdziłem drugi podany tam przykład (https://sourcemaking.com/design_patterns/decorator/cpp/2) - czy nie brakuje wirtualnego destruktora w klasie interfejsu (klasa Widget)? –
@GuyAvraham - dzięki. Masz rację, klasa podstawowa powinna mieć wirtualne destruktory jako ogólną "poprawną praktykę". Jednak w tym przykładzie ich kod będzie działał dobrze od czasu a) nie usuwają żadnych obiektów za pomocą wskaźnika klasy bazowej (nie usuwają ich w ogóle?!?!? Po prostu zwracają/wychodzą, ** rodzaj niechlujstwa ** ...) i b) konstruktory obiektów pochodnych "nie przydzielają żadnych zasobów/otwierają żadnych plików/etc, więc technicznie, nie wywoływanie ich destruktorów nie spowoduje problemów ... DZISIAJ. Ale masz rację - jako że kod rośnie, może się to zmienić. Dobry połów! – Dan
#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();
}
jest to dobre rozwiązanie dla innego problemu, ale nie jest to "prawdziwie" wzór dekoratora, w tym projekcie brakuje klasy dekoratora, która jest dziedziczona przez dowolnego dekoratora w tym przypadku drukarkę i napęd CD –
+1 dla tej strony internetowej. Zawsze mówię o tym przy implementacji cPP. Uważam też, że nieuporządkowane zarządzanie pamięcią powoduje, że ten wzór nie jest widoczny w cpp. –
Nie zawsze odwołuję się do implementacji, ale doceniam to, że nie są spamowane przez reklamy i porady, kiedy należy składać wnioski, kiedy nie i jakie są one związane z innymi powiązanymi wzorcami. –