Na linguagem Java existe a palavra-chave “switch” e todos (todos os desenvolvedores relacionados a Java) sabem como ela funciona. No entanto, e se alguns casos não forem conhecidos na etapa de compilação? E se quisermos adicionar casos dinamicamente? A resposta é fácil – implemente seu próprio mecanismo de “troca”.
Precisamos de alguma interface que significa comando de caso.
interface Command {
void execute();
}
Precisamos de uma classe que implementa a interface Command e na chamada do método de execução não fará nada (padrão caso especial ).
class DoNothingCommand implements Command {
@Override public void execute() {}
}
Agora, estamos prontos para implementar a classe Switcher .
class Switcher {
private Map<Integer, Command> caseCommands;
private Command defaultCommand;
private Command getCaseCommandByCaseId(Integer caseId) {
if (caseCommands.containsKey(caseId)) {
return caseCommands.get(caseId);
} else {
return defaultCommand;
}
}
public Switcher() {
caseCommands = new HashMap<Integer, Command>();
setDefaultCaseCommand(new DoNothingCommand());
}
public void addCaseCommand(Integer caseId, Command caseCommand) {
caseCommands.put(caseId, caseCommand);
}
public void setDefaultCaseCommand(Command defaultCommand) {
if (defaultCommand != null) {
this.defaultCommand = defaultCommand;
}
}
public void on(Integer caseId) {
Command command = getCaseCommandByCaseId(caseId);
command.execute();
}
}
Agora, estamos prontos para escrever a classe principal.
public class Main {
public static void main(String[] args) {
Switcher switcher = new Switcher();
switcher.addCaseCommand(1, new Command() {
@Override
public void execute() {
System.out.println("Command on {id: 1}");
}
});
switcher.addCaseCommand(2, new Command() {
@Override
public void execute() {
System.out.println("Command on {id: 2}");
}
});
switcher.addCaseCommand(3, new Command() {
@Override
public void execute() {
System.out.println("Command on {id: 3}");
}
});
switcher.setDefaultCaseCommand(new Command() {
@Override
public void execute() {
System.out.println("Command on {default}");
}
});
for (int i = 1; i <= 4; i++) {
switcher.on(i);
}
}
}
// output
Command on {id: 1}
Command on {id: 2}
Command on {id: 3}
Command on {default}