STRUCTURAL

Decorator

Aggiungere responsabilità aggiuntive a un oggetto dinamicamente. I decorator forniscono un'alternativa flessibile all'ereditarietà per estendere funzionalità.

Il Problema

Estendere funzionalità tramite ereditarietà è statico e si applica a tutta la classe. Inoltre, avere molte combinazioni di funzionalità porta a una esplosione di sottoclassi.

La Soluzione

Creare decorator che wrappano l'oggetto originale e aggiungono nuove funzionalità. I decorator implementano la stessa interfaccia dell'oggetto wrappato.

Struttura

Component interface, ConcreteComponent implementa Component, Decorator wrappa Component e aggiunge comportamenti.

Partecipanti:
Component - interfaccia comune per oggetti che possono avere responsabilità aggiunte
ConcreteComponent - oggetto a cui possono essere aggiunte responsabilità
Decorator - mantiene riferimento a Component e implementa interfaccia Component
ConcreteDecorator - aggiunge responsabilità al componente
Esempi di Codice

Decorator per Coffee Shop

Aggiunta dinamica di ingredienti extra a bevande con calcolo del prezzo.

JAVASCRIPT
Loading...

Decorator per Data Streams

Aggiunta di funzionalità come compressione e crittografia a stream di dati.

JAVASCRIPT
Loading...
Esempi nel Mondo Reale
Java I/O streams - BufferedReader, FileReader, etc.
Middleware in web frameworks - logging, authentication, caching
UI components - scrollbars, borders, shadows
Text formatting - bold, italic, underline
HTTP requests - retry logic, caching, logging
Quando Usarlo
Quando vuoi aggiungere responsabilità a oggetti singoli dinamicamente
Quando l'ereditarietà non è praticabile (troppi comportamenti da combinare)
Quando vuoi che le responsabilità siano revocabili
Quando estendere funzionalità tramite sottoclassi è impraticabile
Quando NON Usarlo
Quando hai bisogno di modificare l'interfaccia dell'oggetto
Quando la catena di decorator diventa troppo complessa
Quando bastano semplici flag booleani per configurare comportamenti