In che modo il motivo Decoratore viene effettivamente utilizzato nella pratica? [chiuso]

6

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.

    
posta Aviv Cohn 16.05.2014 - 19:33
fonte

1 risposta

7

Questo è stato essenzialmente risposto da kdgregory in un commento sulla domanda, ma ...

Un flusso è qualcosa che può beneficiare di più attributi che vengono aggiunti ad esso, indipendentemente l'uno dall'altro. Voglio un grosso dump di dati applicativi in un flusso. Grande. Anch'io lo voglio crittografato. Oh, in questo caso lo voglio anche zippato. Da questo particolare client, voglio cambiare lo stile delle interruzioni di linea che usano pure.

Questo è un esempio della alternativa alla sottoclasse che la tua domanda menziona. Piuttosto che avere LineBreakFixingEncryptingZippingStream (che non sarà in grado di ereditare tutti e 3 i comportamenti e quindi porterebbe alla duplicazione del codice se hai già un LineBreakFixingStream, un EncryptingStream e un ZippingStream), puoi usare la composizione di classi che condividono un'interfaccia di streaming.

Quindi, LineBreakFixingStream decora BoringStream e viene implementato leggendo da BoringStream e inoltrando le letture al chiamante di LineBreakFixingStream, tranne che modifica le interruzioni di riga. Quindi EncryptingStream, che può decorare un flusso qualsiasi , può decorare un'istanza di LineBreakFixingStream che, in questo caso, sta decorando BoringStream. Quindi ZippingStream può decorare quel EncryptingStream. Qualsiasi combinazione delle tue classi stream può essere combinata abbastanza facilmente, anche in fase di esecuzione, se necessario (anche se non è nel mio esempio), ma puoi immaginare uno scenario in cui i client chiamano un'API per metterle insieme come una possibile scenario mondiale che userebbe la composizione del tempo di esecuzione).

Anche se questo è ancora un po 'astratto sullo scopo, è uno scenario del mondo reale. Ho composto flussi prima in applicazioni reali. La chiusura lampo e la crittografia sono frequenti e anche un po 'di formattazione personalizzata di un flusso di dati client è comune.

    
risposta data 16.05.2014 - 20:29
fonte

Leggi altre domande sui tag