Come lasciare che il mondo esterno decori il mio campo privato?

1

Immagina un'interfaccia semplice Controller (come nel controllo di processo). Ho alcune classi concrete, diciamo PIDController , che la implementano. Ho anche alcune classi di decoratori che estendono queste classi in qualche modo, diciamo ITAETuningDecorator .

Ora immagina che una classe FloodGate abbia un campo Controller privato. Mi piacerebbe, dall'esterno e in fase di runtime, allegare al Controller in FloodGate a ITAETuningDecorator . Come posso farlo? Non ho accesso al campo dall'esterno e ovviamente il decoratore ha bisogno di un riferimento al controller originale da costruire.

    
posta CarrKnight 01.09.2014 - 06:21
fonte

2 risposte

3

La domanda è: chi crea un'istanza di Controller ?

  • Se è creato al di fuori dell'istanza FloodGate , puoi racchiuderlo lì e passare l'istanza spostata in FloodGate .
  • Se è creato da FloodGate internamente (che mi sembra strano, ma non sono nel tuo dominio), puoi modificarlo e passarlo (ad es. come parametro costruttore) o aggiungere un metodo addControllerDecorator(Controller c) a FloodGate . Quest'ultimo implica che è possibile creare un'istanza del wrapper e successivamente impostare l'istanza che esso avvolge, il che mi sembra una scelta scadente per il design ...
risposta data 01.09.2014 - 08:47
fonte
0

Il codice "mondo esterno" potrebbe utilizzare la riflessione (il tipo sgradevole) per accedere e / o aggiornare il campo privato.

Ma un'idea migliore (IMO) potrebbe modificare le tue API per fornire l'accesso ai campi che desideri decorare. Questo potrebbe assumere la forma di getter e / o setter, oppure potrebbero essere metodi più specializzati che aggiungono e (se necessario) rimuovono le decorazioni. In breve, "decoratibility" dovrebbe far parte dell'API.

    
risposta data 01.09.2014 - 09:53
fonte

Leggi altre domande sui tag