2010-06-07 17 views
7

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.

Odpowiedz

9

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 :)

+0

+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. –

+0

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. –

6

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.

+0

+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)? –

+1

@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

2
#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(); 
} 
+5

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 –