Sto implementando le classi per simulare e generare diversi tipi di automi. Preferirei utilizzare le stesse classi di stato e transizione per tutti gli automi: NFA, DFA, PDA, ecc.
Per un PDA una transizione da uno stato ad un altro richiede una specie di estensione, perché la transizione richiede di estrarre qualcosa e inviare qualcosa sullo stack.
Quindi mi è venuta l'idea di consentire alle transizioni di accettare una classe di estensione come parametro template:
public class Transition<T> {
private State target;
private T extension;
public Transition(State target, T extension) {
this.target = target;
this.extension = extension;
}
public State getTarget() {
return target;
}
public T getExtension() {
return extension;
}
}
Tieni presente che ci sono% derivate daEpsilonTransition
e RegularTransition
da questa classe base.
Un PDA richiederebbe ad esempio questa estensione:
public class StackExtension {
private Character toPop, toPush;
public StackExtension(Character toPop, Character topush) {
this.toPop = toPop;
this.toPush = topush;
}
public Character getToPop() {
return toPop;
}
public Character getToPush() {
return toPush;
}
}
In modo che la classe PDA
possa utilizzare% istanze diTransition<StackExtension>
.
Sebbene questa sia una soluzione per il mio problema, sembra un cattivo design. Soprattutto per NFA e DFA, che non richiedono alcuna estensione.
Esiste un altro modello di progettazione per il mio particolare problema?