Il pattern Decorator viene solitamente utilizzato per estendere la funzionalità di un oggetto estendendo uno dei suoi metodi attuali.
Per illustrare, considera un oggetto object
e un decoratore decorator
. object
ha un metodo chiamato methodA()
. decorator
, perché siamo nel pattern Decorator, ha anche questo metodo per ereditarietà (entrambi object
e decorator
alla fine ereditano dalla stessa super-classe che ha methodA()
. Chiamiamola AbstractObject
).
methodA()
in object
assomiglia a questo:
public void methodA(){
// do stuff
}
methodA()
in decorator
assomiglia a questo:
public void methodA(){
// do some extra stuff.
wrappedObject.methodA(); // and then delegate to the wrapped object.
}
Sarebbe usato in questo modo:
AbstractObject object = new ConcreteObject();
object.methodA(); // does stuff
object = new ConcreteDecorator(object);
object.methodA(); // does stuff and some more stuff. the extended methodA().
Il punto di decorator
è di estendere la funzionalità di object
, e lo fa estendendo uno dei metodi attuali di object
. Finora, classico Decorator.
Ora, la mia domanda:
Come dicevo, Decorator di solito estende la funzionalità di un oggetto aggiungendo il contenuto a uno dei metodi correnti dell'oggetto.
Ma se volessi usare Decorator per aggiungere metodi pubblici a un oggetto ?
Considerare il seguente scenario in cui decorator
ha un altro metodo methodB()
:
AbstractObject object = new ConcreteObject();
object.methodA(); // does stuff
object = new ConcreteDecorator(object);
((ConcreteDecorator)object).methodB();
// methodB() belongs to ConcreteDecorator() but not to AbstractObject().
Come vedi, se volessi farlo, dovrei lanciare object
in ConcreteDecorator
.
Questo espone il tipo concreto di object
e il fatto che sia decorato, e come tale sconfigge un po 'l'intento del pattern Decorator. Inoltre, il codice che richiama methodB()
dovrebbe sapere che object
è decorato. Di nuovo, non molto nello spirito di Decorator.
Alla luce di questo ho due domande:
-
Il motivo Decorator è mai stato utilizzato in questo modo? È mai stato usato per aggiungere metodi pubblici per un oggetto, invece di "estenderlo" solo metodi attuali?
-
Ci sono situazioni in cui questa sarebbe una buona idea o un uso saggio di Decorator?