L'implementazione di un'interfaccia come dimostrata in modo semplice e chiaro da dfa è pulita ed elegante (e supportata "ufficialmente"). Questo è ciò per cui si intende il concetto di interfaccia.
In C #, potremmo usare i delegati per i programmatori a cui piace usare i puntatori a functon in c, ma la tecnica di DFA è il modo di usare.
Potresti avere anche un array
Command[] commands =
{
new CommandA(), new CommandB(), new CommandC(), ...
}
Quindi potresti eseguire un comando tramite index
commands[7].exec();
Plagio da DFA, ma con una classe di base astratta invece di un'interfaccia. Notare il cmdKey che verrà utilizzato in seguito. Per esperienza, mi rendo conto che spesso un comando di apparecchiatura ha anche dei sottocomandi.
abstract public class Command()
{
abstract public byte exec(String subCmd);
public String cmdKey;
public String subCmd;
}
Costruisci così i tuoi comandi,
public class CommandA
extends Command
{
public CommandA(String subCmd)
{
this.cmdKey = "A";
this.subCmd = subCmd;
}
public byte exec()
{
sendWhatever(...);
byte status = receiveWhatever(...);
return status;
}
}
È quindi possibile estendere HashMap o HashTable generici fornendo una funzione di succhiamento coppia chiave-valore:
public class CommandHash<String, Command>
extends HashMap<String, Command>
(
public CommandHash<String, Command>(Command[] commands)
{
this.commandSucker(Command[] commands);
}
public commandSucker(Command[] commands)
{
for(Command cmd : commands)
{
this.put(cmd.cmdKey, cmd);
}
}
}
Quindi costruisci il tuo archivio di comandi:
CommandHash commands =
new CommandHash(
{
new CommandA("asdf"),
new CommandA("qwerty"),
new CommandB(null),
new CommandC("hello dolly"),
...
});
Ora puoi inviare i controlli in modo obiettivo
commands.get("A").exec();
commands.get(condition).exec();