2012-11-20 11 views
5

Si consideri che abbiamo un oggetto Car. L'accelerazione e interruzione delle funzioni vengono implementate utilizzando il modello di strategia . Ma cosa succede se vogliamo introdurre la funzione del gas nitro su un oggetto auto esistente? Qual è lo schema di progettazione che posso usare?Design pattern per aggiungere dinamicamente gli attributi agli oggetti

Desidero aggiungere la funzione nitro (Attributo) dopo aver creato l'oggetto auto.

risposta

-1

Nelle lingue con tipizzazione statica non è possibile aggiungere metodi a un oggetto in fase di esecuzione. Compilatore, quando incontra una dichiarazione come: car.nitroAccelerate(), controlla se un oggetto auto implementa qualsiasi interfaccia che abbia il metodo nitroAccelerate. Se si potessero aggiungere (o rimuovere) i metodi durante il runtime tali verifiche sarebbero impossibili.

I linguaggi dinamici consentono di aggiungere metodi durante il runtime. Ma questo ha un inconveniente, quando inserisci car.nitroAccelerate() nel codice, devi analizzare attentamente se l'oggetto auto in questo punto ha un tale metodo.

È possibile utilizzare decorator per modificare i metodi esistenti in fase di esecuzione, ma, in tal modo, non si modifica un oggetto esistente, ma solo uno nuovo che avvolge quello esistente.

Quindi, se si fa qualcosa di simile:

Car fasterCar = new CarWithNitro(car); 

e qualche pezzo del codice detiene ancora un riferimento alla vettura originale, questa vettura originale non sarebbe più veloce, perché l'atto di avvolgimento non modifica il originale.

10

È possibile controllare lo Decorator pattern, può essere utilizzato per aggiungere dinamicamente funzionalità a un oggetto esistente.

+1

Amo il motivo Decoratore. – Neowizard

+0

Ma possiamo aggiungere nuovi stati o comportamenti in fase di esecuzione utilizzando il pattern Decorator. –

+1

Il motivo decorativo consiste nell'aggiunta di funzionalità avvolgendo l'oggetto e esponendo un'interfaccia estesa. Questa nuova implementazione della funzionalità stessa potrebbe utilizzare strumenti e tecniche aggiuntivi, come modelli di progettazione aggiuntivi. Ricorda, il modello di progettazione non è una sostituzione per il tuo codice, è uno strumento che dovrebbe essere usato quando appropriato. – SomeWittyUsername

2

Il motivo decorativo può aggiungere dinamicamente funzionalità diverse agli oggetti. Ma queste funzionalità devono essere implementate in un Concrete Decorator. Lo sviluppatore può decidere quali funzionalità aggiungere in fase di esecuzione.

0

Se si desidera aggiungere nuovi metodi, è necessario creare una nuova sottoclasse e/o utilizzare la delega. Questo sarà necessario se la funzione "nitro" richiede una chiamata al metodo esplicita per l'attivazione.

Se tuttavia tutto ciò che si vuole fare è aggiungere funzionalità esistenti senza aggiungere metodi, Decorator è una buona scommessa. Diciamo che l'interfaccia "Car" ha un metodo chiamato floorIt(). In tal caso, è possibile aggiungere un "calcio nitro" a floorIt con Decorator senza dover aggiungere al centro auto.

Naturalmente, c'è una via di mezzo. Se si utilizza il rilevamento del tipo di runtime e/o più interfacce, è possibile utilizzare Decorator e aggiungere metodi all'oggetto risultante.

Problemi correlati