Design Pattern in Java: Decorator

Il Decorator è uno dei famosi pattern definiti dalla GoF e fa parte dei pattern strutturali. Lo scopo principale di questo pattern è quello di aggiungere dinamicamente delle funzionalità alle classi evitando una profilerazione di sottoclassi.

Il fatto di creare una gerarchia non è infatti sbagliato, quello che vediamo adesso è semplicemente un modo differente per ottenere un risultato simile.

Il diagramma

Partiamo con un diagramma che ci permette di capire meglio questo pattern, successivamente vedremo un esempio pratico.

Decorator Pattern

Nell’immagine appena riportata potete vedere l’interfaccia Component, che è appunto il nostro componente base, il quale definisce soltato il metodo operation. La classe che implementa questa interfaccia è ConcreteComponent, dove troveremo la prima definizione di operation.

A questo punto, per aggiungere delle funzionalità a questo Component possiamo utilizzare il pattern Decorator, definendo una classe astratta Decorator(anche un’interfaccia) che implementa Component ma che in più ha un riferimento a Component.

A primo avviso può sembrare una cosa strana, d’altronde sto implementando un’interfaccia e ho un attributo che è della stessa tipologia. Vedendo la classe che estende questo Decorator, ovvero ConcreteDecorator, riusciamo a capire meglio a cosa serve l’attributo di tipo Component. Praticamente ConcreteDecorator, estendendo Decorator, implementa il metodo operation e al suo interno esegue un codice di questo tipo:

In questo modo noi “decoriamo” il comportamento del metodo operation di Component con un nostro metodo (addedBehaviour).

 

Codice d’esempio

Se non siete riusciti a capire bene questo meccanismo, sicuramente avrete avuto a che fare con le API per l’I/O in Java. Questo è uno degli esempi classi di Decorator. C’è la classe astratta di base che è InputStream, che definisce una serie di metodi per l’I/O (read, close, skip).

La classe FilterInputStream, che estende InputStream, viene costruita con un un’istanza di InputStream e permette di aggiungere decorazioni i suoi metodi. Vediamo un semplice esempio di codice relativo a questo pattern. Di seguito abbiamo un’interfaccia Writer e un’implementazione di quest’ultima

ConcreteWriter è una classe con uno stupido metodo che stampa una stringa. Ora andiamo a definire la classe astratta che ci permette di decorare l’interfaccia Writer e tutti gli oggetti che la implementano.

In questa classe abbiamo soltanto definito un attributo di tipo Writer, ora vedremo come questo verrà utilizzato nella classe che effettivamente decora Writer.

Come potete vedere, abbiamo decorato il metodo presentation di Writer aggiungendo una nostra stringa a quello che viene scritto da Writer, un esempio stupido ma che ci fa capire meglio come utilizzare questo pattern

 

Riferimenti

http://en.wikipedia.org/wiki/Decorator_pattern
http://www.onjava.com/pub/a/onjava/2003/02/05/decorator.html
http://exciton.cs.rice.edu/JavaResources/DesignPatterns/DecoratorPattern.htm

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *