Ho un sistema Screen Window, uno Screen (IScreen come interfaccia), che contiene una finestra, WindowA o WindowB. Il sistema può cambiare finestra chiamando stateChanged:
class IScreen{
public:
virtual void stateChanged(int state)=0;
};
class Window{};
class WindowA : public Window{
public:
WindowA(IScreen* screen){
screen->stateChanged(1);
}
};
class WindowB : public Window{
public:
WindowB(IScreen* screen){}
};
class Screen : public IScreen{
protected:
Window* window;
public:
Screen(){this->window=NULL;}
void stateChanged(int state){
if(window!=NULL){
delete window;
}
switch(state){
case 0:
window=new WindowA(this);
printf("state 0 with WindowA\n");
break;
case 1:
window=new WindowB(this);
printf("state 1 with WindowB\n");
break;
}
}
};
int main(){
Screen screen;
screen.stateChanged(0);
return 0;
}
ma non so se questo modello di progettazione sia corretto, in primo luogo, per ogni finestra, la chiamata "statechanged ()" potrebbe potenzialmente distruggere se stessa, in secondo luogo, se cambia finestra nello stesso stack di chiamate, cioè: chiama "statechanged" () "all'interno di un'altra finestra, la finestra che è collegata alla fine dello schermo non è la stessa della finestra che chiama" statechanged () ", vedi l'output quando creo WindowA e poi creo WindowB:
state 1 with WindowB
state 0 with WindowA
Esiste un modello di progettazione per migliorare il sistema se il modello corrente ha qualche problema?