Siemka,
piszę prostą aplikację w Springu, prosty serwer. Komunikacja to zwykłe przesyłanie String
ów, typu pytanie-odpowiedź.
Chciałbym tak zaprojektować apkę, że kiedy mam dodać nową funkcję to nie muszę znowu grzebać w switch
i ręcznie dopasowywać jej odpowiadającą funkcję. Jest na to jakiś wzorzec, łatwiejsze rozwiązanie?
0
0
Przez polimorfizm. Zrób klasę bazową z jedną funkcją np. Execute. Niech klasy po niej dziedziczą i różnie ją implementują tą metodę.
1
Wzorce Polecenie, Łańcuch zobowiązań. I raczej interfejs, nie klasa bazowa.
0
Okej, dzięki ;) Jeszcze tylko pytanie jak konkretnym String
om przychodzącym od klienta przypasować konkretne funkcje?
0
Fabryka z możliwością rejestrowania klas wraz z nazwą.
0
Ostatnia odpowiedź to w sumie to o co mi chodziło, teraz mam tylko problemy z implementacją.
Mam interfejs:
public interface Command {
void execute();
}
fabrykę:
@Service("commandFactory")
public class CommandFactory {
private static Map<String, Class> registeredClasses = new HashMap<>();
protected static void registerCommand(String commandName, Class commandClass) {
registeredClasses.put(commandName, commandClass);
}
public Command getCommand(String commandName) {
Class productClass = (Class)registeredClasses.get(commandName);
return (Command) productClass.cast(Command.class);
}
}
i klasę implementującą interfejs:
@Service("sayHello")
public class SayHello implements Command {
@Override
public void execute() {
System.out.println("Hello!");
}
}
Pytanie brzmi jak je rejestrować? Próbowałem tego
static {
Factory.instance().registerProduct("ID1",OneProduct.class);
}
ale obrywam
Exception in thread "main" java.lang.ClassCastException: Cannot cast java.lang.Class to com.burdzi0.kit.user.command.SayHello
at java.base/java.lang.Class.cast(Class.java:3578)
at com.burdzi0.kit.user.command.CommandFactory.getCommand(CommandFactory.java:19)
at com.burdzi0.kit.Main.main(Main.java:12)
Wywołuję kodem (żeby sprawdzić czy działa):
CommandFactory commandFactory = new CommandFactory();
Command command = commandFactory.getCommand("sayHello");