2010-06-07 52 views
7

¿Alguien me puede dar un ejemplo del patrón de diseño del decorador en C++? Me he encontrado con la versión de Java, pero me ha resultado difícil entender la versión de C++ (de los ejemplos que encontré).Patrón decorador en C++

Gracias.

Respuesta

9

Vince Huston Design Patterns, a pesar de que su diseño es pobre, tiene una implementación C++ para la mayoría de los patrones de diseño en el libro Gang of Four.

Haga clic para Decorator.

No hay mucha diferencia con Java, excepto la manipulación que es mejor que envolver con punteros inteligentes :)

+0

+1 para este website.I siempre se refieren a esto por CPP implementation.I también piensan que la gestión de memoria desordenado es la razón por la que no ve este patrón mucho en CPP. –

+0

No siempre me refiero a la implementación, pero agradezco no haber recibido spam por los anuncios y los consejos sobre cuándo presentar la solicitud, cuándo no y qué aporta en comparación con otros patrones relacionados. –

6

que he encontrado el sitio web Sourcemaking ser una muy buena cuando se trata de memoria manual explaining different Design Patterns.

El patrón de diseño tiene Decorator ejemplos C++, tales como un overview example, un "before and after", y un example with packet encoding/decoding.

+0

+1 por la gran respuesta. Verifiqué el segundo ejemplo proporcionado allí (https://sourcemaking.com/design_patterns/decorator/cpp/2) - ¿no le falta un destructor virtual en la clase de interfaz (la clase de Widget)? –

+1

@GuyAvraham - gracias. Está en lo cierto, las clases base deberían tener destructores virtuales como una "práctica correcta" general. Sin embargo, en este ejemplo, su código funcionará bien ya que a) no están eliminando ningún objeto a través de un puntero de clase base (no los están eliminando en absoluto?!?!? Están simplemente volviendo/saliendo, ** tipo de sloppy ** ...) yb) los constructores de los objetos derivados 'no asignan ningún recurso/abren ningún archivo/etc., por lo que técnicamente, no llamar a sus destructores no causará problemas ... HOY. Pero tienes razón: a medida que el código crezca, esto podría cambiar. ¡Buena atrapada! – 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

esta es una buena solución a un problema diferente, pero este no es un patrón de decorador "verdaderamente", a este diseño le falta la clase de decorador heredada por cualquier decorador, en este caso, impresora y unidad de CD. –

Cuestiones relacionadas