Capisco perfettamente come implementare il pattern Decorator e capisco anche qual è l'intento.
Decorator viene utilizzato in uno dei due casi:
In alternativa alla sottoclasse - quando ci sono più caratteristiche che un oggetto può avere, si può usare l'ereditarietà per creare sottoclassi per tutte le possibili combinazioni. Ad esempio, tre caratteristiche A, B e C risulteranno in molte classi: A, B, C, ABC, AB, AC, BC. Ciò si traduce in un'esplosione di classe. Con Decorator, uno avrebbe tre decoratori A, B e C, e una classe D per 'decorare' - e il gioco è fatto.
Come modo per espandere la funzionalità di un oggetto durante il runtime - possiamo decidere quali decoratori "avvolgere" un oggetto durante il runtime, quindi "personalizzando" un oggetto in modo dinamico.
Questo era solo per dimostrare che capisco cos'è Decorator (capisco anche perfettamente come è implementato). Ora la mia domanda:
Ho familiarità con esempi teorici di quando e come utilizzare Decorator. E come puoi vedere, so qual è il suo intento. Ma non sono ancora sicuro quando usarlo in pratica, in un'applicazione vera e propria. Dire che "è usato come alternativa alla sottoclasse", o "è usato per aggiungere dinamicamente funzionalità a un oggetto" non sarà utile dato che conosco il suo intento.
Dicendo anche "pensa ad una finestra dell'interfaccia utente, ad esempio, può avere un bordo, oppure no, e può essere ridimensionabile, oppure no" non è utile, ho già familiarità con questi esempi teorici.
Quindi quello che sto chiedendo è un concreto mondo reale esempio di Decorator, in uno scenario pratico e realistico, con una breve spiegazione dei vantaggi di usando un pattern Decorator su altre tecniche.
Giusto per chiarire, non sto cercando un elenco di applicazioni in cui è stato utilizzato Decorator. Sto cercando un esempio di dove e come Decorator è stato utilizzato in un progetto, perché è stata una buona scelta di design e il problema concreto che ha risolto. Quando vedrò problema concreto risolto con Decorator, spero che lo comprenderò meglio.