Command pattern per aggiornare il campo privato

3

Ho una classe che rappresenta lo stato della mia applicazione e voglio creare molti comandi per aggiornare questo stato.

class State{
    private:
        list<int> intList;
    ...
}

class ICommand {
    public:
        virtual ~ICommand(){}
        virtual void execute(State* state) = 0;
}

Le implementazioni di ICommand specificheranno come aggiornare state , quindi dovrebbero interagire con i suoi campi privati.

Il mio problema è : qual è l'approccio migliore in C ++ per consentire ai comandi di aggiornare il campo privato di State ?

Se espongo intList con un getter pubblico, non posso garantire che solo i comandi aggiornino lo stato.

Se dovessi usare class friendship devo collegare State con l'implementazione del comando perché collegarlo all'interfaccia non funziona e non mi sembra così bello ...

Il mio dubbio sull'amicizia è infondato? Dovrei scegliere un approccio diverso?

    
posta Marco Stramezzi 06.03.2017 - 12:08
fonte

1 risposta

0

In questo caso, usare friend dichiarazioni è una buona scelta.

Queste condizioni spesso arrivano con l'implementazione di alcuni modelli di progettazione come comando, macchina di stato e strategia. Penso a questi modelli come estensioni della classe che detiene lo stato. Questo è se fosse pratico, ICommand sarebbe parte della classe State . Ciò significa utilizzare friend in C ++.

In molti di questi casi, vado oltre e creo ICommand una classe nidificata in State , indicando chiaramente che queste classi sono legate insieme.

    
risposta data 06.03.2017 - 17:36
fonte

Leggi altre domande sui tag