Ursprungligen inskrivet av badboll
Det går, men jag vet inte om det skulle göra din kod tydligare. Ibland är en episk if-else både mer lättläst och lättunderhållen än det du vill åstadkomma, även om det blir mer kod på samma ställe.
Hur som helst. Skapa ett interface, Command, som har en metod, execute(), enligt:
public interface Command {
void execute();
}
Sedan kan du skapa en hel räcka klasser som implementerar detta interface. Varje sådan klass representerar en typ av åtgärd som du vill utföra i din actionPerformed() (som den väl heter).
Säg att vi vill ändra bakgrundsfärg på någon JPanel när vi trycker på någon av två knappar, en som ändrar till blå färg och en som ändrar till röd. Deras kommandoklasser skulle kunna se ut så här:
class BlueButtonCommand implements Command {
private JPanel affectedPanel;
BlueButtonCommand(JPanel affectedPanel) {
this.affectedPanel = affectedPanel;
}
void execute() {
affectedPanel.setBackground(Color.BLUE);
}
}
class RedButtonCommand implements Command {
private JPanel affectedPanel;
RedButtonCommand(JPanel affectedPanel) {
this.affectedPanel = affectedPanel;
}
void execute() {
affectedPanel.setBackground(Color.RED);
}
}
Sedan kan du koppla instanser av dessa klasser till knapptryckningshändelsen genom att:
1) ha en Map<Object, Command> som kopplar en komponent till ett kommando, säg att den heter commandMap.
2) lägga in varje komponent och dess kommando i denna map, som såhär:
JButton blueButton = new JButton("Make it blue!");
commandMap.put(blueButton, new BlueButtonCommand(aPanel));
JButton redButton = new JButton("Make it red!");
commandMap.put(redButton, new RedButtonCommand(aPanel));
3) i actionPerformed plocka ut event-källan och använda den som nyckel till din commandMap:
public void actionPerformed(ActionEvent e) {
commandMap.get(e.getSource()).execute();
}
Detta angreppssätt har klassats som ett av de vanliga "designmönstren", och fått just namnet Command. Exemplet ovan är egentligen mest löjligt, men det illustrerar förhoppningsvis hur det kan gå till.
I min mening finns det ganska sällan anledning till att använda det här i ett fall som ditt. Visst, din actionPerformed() blir jäkligt kompakt och elegant, men istället får du en massa andra klasser att hålla reda på, och det är för en som läser koden svårare att få reda på vad som egentligen händer när man trycker på en viss knapp.
Men det är ju samtidigt alltid kul att testa ett nytt sätt att jobba på också...