Server i wywoływanie funkcji ze względu na ich nazwę

0

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

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 Stringom 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");

1 użytkowników online, w tym zalogowanych: 0, gości: 1