Un automa a stati finiti è formato appunto da stati e transizioni , ogni stato ha transizioni in entrata e in uscita da e verso altri stati.Ogni automa ha uno stato iniziale e uno o più stati finali.
Viene rappresentato come un grafo orientato in cui gli stati corrispondono ,in questo caso ,ai pannelli ma più in generale contengono svariate azioni.
Un automa a stati finiti è molto comodo per far si che un oggetto possa rispondere o comportarsi in modo diverso a seconda dello stato in cui si trova.
Passando al nostro caso crei una classe GestoreTransazioni che al suo interno contiene una matrice di interi di dimensione n*m dove n è l'indice di stato corrente e m l'indice di transizione, l'elemento matrice[n][m] ti da l'indice del prossimo stato.
Poi ti crei un array di oggetti Stato di dimensione n(dove n = numero di stati che ha la tua applicazione) che conterrà le istanze degli oggetti Stato
La classe GestoreTransazioni dopo aver inizializzato avvierà questo ciclo :
codice:
//Variabili di classe
int transizione[][]=new int[n][m];//Rappresenta il grafo
Stato stato[]=new Stato[n];//Rappresenta l'array degli stati
....
public void esegui(){
int numStatoCorrente=initial;
Stato statoCorrente=null;
while(true){
statoCorrente=stato[numStatoCorrente];//Ottengo l'oggetto Stato corrente , all'inizio è quello definito dal programmatore
statoCorrente.action(); //Dico allo stato corrente di eseguirsi
//Quando avrà finito passerò alla scelta successiva
//Questo si fa trovando l'indice di stato successivo
//all'interno della matrice , determinato dalla posizione
//corrente e dall'indice che l'utente ha scelto
//durante l'esecuzione dello stato corrente(Avanti , //indietro....)
numStatoCorrente=transizione[numStatoCorrente][statoCorrente.scelta()];
//Se non è uno stato finale , rappresentato dall'indice -1
// proseguo ricominciando il ciclo
if( numStatoCorrente==- 1 ) break;
}
}
Ora devi crearti una classe astratta(o interfaccia) Stato che realizza(ha) il metodo action() ed ulteriori metodi che servono per la visualizzazione del pannello e che sono comuni a tutti gli stati.
Tutti i tuoi pannelli dovranno estendere la classe Stato , in questo modo la classe GestoreTransizioni può chiamare il metodo action() senza sapere in che stato ci si trova.
A grandi linee è così
Può sembrare complesso , soprattutto per come l'ho spiegato , ma alla fine è molto semplice