Modifica della classe (apparente) di un oggetto in fase di runtime

1

Sto cercando un modello di progettazione per risolvere il seguente problema:

Un oggetto (diciamo che rappresenta un documento) può cambiarne il tipo in modo dinamico durante la sua durata (ad es. quando viene salvato con una diversa estensione di file).

L'oggetto contiene molti metodi virtuali in modo che, a seconda del tipo di oggetto, può comportarsi in modi diversi (ad esempio l'evidenziazione della sintassi diversa).

L'applicazione contiene molti riferimenti all'oggetto, che non dovrebbero diventare non validi quando il tipo dell'oggetto cambia. Quindi non lo farà per distruggere l'oggetto e crearne uno nuovo del nuovo tipo.

Una soluzione "ovvia" è usare la composizione, in modo che l'oggetto visto dall'applicazione (l'oggetto esterno) non cambi mai, ma inoltra tutte le chiamate a un oggetto contenuto che può essere distrutto e ricreato ogni volta che il tipo cambia.

Ma questo richiede un metodo nell'oggetto esterno per ogni metodo virtuale nell'oggetto contenuto per inoltrare la chiamata.

Esiste un modello di progettazione che evita questa necessità di metodi di inoltro?

(Idealmente mi piacerebbe uno schema che non richieda la lingua per supportare le interfacce.)

Aggiorna

Grazie ai commenti riportati di seguito, ho identificato che il pattern di progettazione State implementa ciò che voglio, tranne che richiede l'inoltro esplicito di ogni metodo dalla classe wrapper alla classe wrapee.

Quindi un altro (forse più chiaro?) modo di affermare la mia domanda originale è questo: esiste un modello di progettazione alternativo che implementa la funzionalità del modello di stato in (praticamente) qualsiasi linguaggio orientato agli oggetti senza dover esplicitamente inoltrare ogni metodo?

('No' è una risposta perfettamente valida a patto che tu possa giustificarlo.)

    
posta Ian Goldby 14.01.2015 - 10:42
fonte

1 risposta

2

La soluzione che descrivi nella tua domanda viene solitamente chiamata "schema del ponte". A seconda della lingua utilizzata, potrebbe esserci un modo per implementarla senza gestire manualmente tutti i metodi di delega. Ad esempio, in Ruby è possibile definire semplicemente il metodo "method_missing" per eseguire una ricerca dinamica sull'oggetto di destinazione e inviarlo a un metodo con lo stesso nome del metodo chiamato. In Java potresti essere in grado di utilizzare una libreria di generazione di bytecode per ottenere un effetto simile, ad esempio Javassist.

    
risposta data 14.01.2015 - 12:43
fonte

Leggi altre domande sui tag