Also, ich habe eine Client/Server Anwendung geschrieben, die Daten und Befehle (einfache Strings) hin und her schickt. Die Verarbeitung übernimmt dabei ein eigenes Protokoll. Bislang sieht das so aus, das ich Konstanten habe, die die Befehle definieren und eine Methode mit sehr vielen If-Bedingungen, welche die weitere Verarbeitung übernimmt (je nachdem welcher Befehl gesendet wurde).
Dafür hab ich ein Interface,..
public interface Protocol
{
public static final String COMMAND_1 = "befehl1";
//[...]
public void process(String input);
}
... welches von zwei Klassen implementiert wird (jeweils ein ServerProtocol und ein ClientProtocol).
public class ServerProtocol implements Protocol
{
public void procss(String input)
{
if(input.equals(Protocol.COMMAND_1)
{ // tu was
}
// [... und viele weitere]
}
}
Das ist jedoch sehr Erweiterungs- und Wartungsunfreundlich wie ich finde. Wie könnte man das anders lösen?
Mein bisherigen Idee ist folgende:
Ich habe eine abstrakte Klasse für einen Befehl:
public abstract class Command
{
private String name;
public Command(String name)
{
this.name = name;
}
public abstract void execute();
public String getCommandName()
{
return name;
}
}
Alles anzeigen
In dem ServerProtocol gibt es nun eine Map, in der alle möglichen Befehle für die Server-Seite eingefügt werden.
private void init()
{
Map<String, Command> temp = new HashMap<String, Command>();
temp.put(COMMAND_1, new Command(COMMAND_1)
{
@Override
public void execute()
{
client.tuWas();
}
});
//[...]
commands = Collections.unmodifiableMap(temp);
}
Alles anzeigen
Aufgerufen wird das dann durch die process(String input) Methode.
Das ist schon besser als vorher, jedoch auch nicht ganz optimal, da man auch hier wieder suchen muss, wenn man einen Befehl ändern will. Hab da gedacht, man könnte eventuell etwas mit Reflection machen, aber das funktioniert auch nicht, da ich das nicht automatisieren kann, da die Verarbeitung eines Behfels ja immer unterschiedlich ist.
Also nochmal die Frage, gibt es eine bessere Möglichkeit?
block_