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?