Alternativa alternativa ai decoratori?

6

Quindi i decoratori avvolgono una classe base in modo ricorsivo, giusto? E avere un singolo oggetto super-classe che si trova nella classe "core".

Non potresti semplicemente aggiungere una ArryList / LinkedList di decorazioni nella classe "core" e ottenere la stessa cosa? Ciò eviterebbe la ricorsione (che è costosa), ma consente il comportamento dinamico di poter "decorare" le tue classi.

È un modello diverso o una versione alternativa di decoratori o qualcos'altro?

Esempio:

Decorator

Beverage class
  getDescription(){blah}
  cost();

HouseBlend inherits from Beverage
  cost(){2.99}

CondimentDecorator inherits from Beverage
  Beverage bev;
  cost(){.19 + bev.cost}
  getDescription{blah}

VS

Altro?

Beverage class
  getDescription(){blah}
  cost();

HouseBlend inherits from Beverage
  List<Beverage> condiments      
  cost(){2.99 + iterative condiments}

CondimentDecorator inherits from Beverage
  cost(){blah}
  getDescription{blah}

Sembra che il decoratore potrebbe essere un po 'più flessibile, ma l'altra versione ti permetterebbe di tenere traccia delle istanze specifiche degli oggetti. Inoltre, se tu avessi espresso potresti avere un doppio scatto, dove con un decoratore puro sarebbe difficile.

    
posta Joshua Olson 10.06.2011 - 07:10
fonte

2 risposte

3

Il motivo per cui il pattern decorator funziona così come lo è perché mira a consentire funzionalità di sottoclasse in fase di runtime anziché compiletime. Questo è rilevante dal momento che la tua alternativa richiede la modifica di HouseBlend al momento dell'ordine. Questo è qualcosa che il modello di decoratore è stato esplicitamente progettato per evitare.

Nella mia esperienza, il pattern decoratore viene in genere utilizzato quando si ottiene un componente binario che espone la bevanda e un gruppo di sottoclassi (come HouseBlend) che non è possibile modificare. In questo caso, il decoratore ti consente di modificare il modo in cui le sottoclassi si comportano in modo trasparente.

Se hai accesso a Beverage e / o HouseBlend e puoi modificarli e ricompilarli, diventa disponibile una serie di opzioni di progettazione alternative, compresa quella che proponi.

    
risposta data 10.06.2011 - 07:44
fonte
2

Il decoratore non usa oggetti incorporati, ma la spedizione dinamica, e questo non è molto costoso. In effetti, con la compilazione JIT moderna, è essenzialmente gratuito. E come ha sottolineato Deckard, l'intero punto di Decorator è che puoi introdurre le varianti senza che ricompilano la classe base.

Il compromesso che dovresti osservare è essenzialmente questo: per essere un decoratore, la tua classe deve ereditare da una specifica altra classe, e nella maggior parte delle lingue non puoi ereditare due volte, che limita le tue opzioni. Ma cambiare la classe base significa ricompilarla e potenzialmente destabilizzare ogni altro client di quella classe. A seconda di quanti ce ne sono, potrebbe essere accettabile o meno.

    
risposta data 10.06.2011 - 08:54
fonte

Leggi altre domande sui tag