Uso dello schema di decorazione in una gerarchia di classi profonde

3

Come si usa il modello di progettazione Decorator per qualcosa di diverso dai banali problemi giocattolo, in una gerarchia di classi profonde? Ad esempio, supponiamo di avere la classe

class Decorated
: public Foo, Bar, Baz
{
public:
  void operation();
};

Lo decoreresti in questo modo

class Decorator
: public Decorated
{
  void operation() { d.operation(); }
private:
  Decorated d;
};

Il problema che sto avendo è che Decorated può avere molti metodi ereditati (da Foo, Bar e Baz) e il Decoratore ha bisogno di "reindirli" tutti al suo oggetto interno o lo stato dell'oggetto sarà diviso tra il decoratore e l'oggetto decorato. Come si può essere sicuri che un decoratore decori correttamente un altro oggetto e che non vengano chiamati metodi sul decoratore anziché decorati?

    
posta pwny 16.02.2012 - 20:48
fonte

1 risposta

4

Una soluzione è definire un'interfaccia comune che sia Decorator sia Decorato deve attuare. Questa interfaccia dovrebbe contenere tutti i metodi che deve essere decorato.

Inoltre, Decorator non deve essere una sottoclasse di Decorated, in modo che nulla sia ereditato da Decorated e Decorator debba fornire la sua implementazione per ogni metodo nell'interfaccia.

È OK avere un'istanza di Decorato come variabile membro di Decorator (strong aggregazione): Decorator reindirizza tutte le chiamate di metodo a Decorato, come . Appropriato

    
risposta data 16.02.2012 - 21:08
fonte

Leggi altre domande sui tag