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

Server i wywoływanie funkcji ze względu na ich nazwę
  • Rejestracja: dni
  • Ostatnio: dni
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?

ekhart
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: ekhart.pl
  • Postów: 140
0

Przez polimorfizm. Zrób klasę bazową z jedną funkcją np. Execute. Niech klasy po niej dziedziczą i różnie ją implementują tą metodę.

jarekczek
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Siemianowice Śląskie
  • Postów: 500
1

Wzorce Polecenie, Łańcuch zobowiązań. I raczej interfejs, nie klasa bazowa.

  • Rejestracja: dni
  • Ostatnio: dni
0

Okej, dzięki ;) Jeszcze tylko pytanie jak konkretnym Stringom przychodzącym od klienta przypasować konkretne funkcje?

SL
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Bydgoszcz
0

Fabryka z możliwością rejestrowania klas wraz z nazwą.

  • Rejestracja: dni
  • Ostatnio: dni
0

Ostatnia odpowiedź to w sumie to o co mi chodziło, teraz mam tylko problemy z implementacją.
Mam interfejs:

Kopiuj
public interface Command {
    void execute();
}

fabrykę:

Kopiuj
@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:

Kopiuj
@Service("sayHello")
public class SayHello implements Command {
    @Override
    public void execute() {
        System.out.println("Hello!");
    }
}

Pytanie brzmi jak je rejestrować? Próbowałem tego

Kopiuj
static {
		Factory.instance().registerProduct("ID1",OneProduct.class);
	}

ale obrywam

Kopiuj
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):

Kopiuj
CommandFactory commandFactory = new CommandFactory();
Command command = commandFactory.getCommand("sayHello");

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.