Wzorce projektowe – Command Pattern

Wzorzec stosowany w celu zamknięcia w w obiekcie wszystkich danych wymaganych do wykonania określonego polecenia.

Pozwala na odseparowanie obiektów, które tworzą polecenia od obiektów które będą je wywoływać.

Składa się z czterech komponentów: Receiver, Command, Invoker oraz Client.

Komponent Receiver – obiekt, który faktycznie wykonuje określone polecenie po wywołaniu metody execute() na obiekcie należącym do komponentu Command.

public class ReceiverObject1 {
    public String command1() {
        return "command1";
    }
    public String command2() {
        return "command2";
    }
}

Komponent Command – zbiór klas, które odpowiadają za wykonanie określonego polecenia i zawierają wszystkie wymagane do tego informacje. Każda klasa odpowiada za jedno polecenie. Klasy implementują wspólny interfejs definiujący wszystkie operacje, jakie musi obsługiwać każdy obiekt należący do tego komponentu.

public interface CommandInterface{
    public String execute();
}

public class Command1 implements CommandInterface{
    private ReceiverObject1 receiver;

    @Override
    public String execute() {
        return receiver.command1();
    }
}

public class Command2 implements CommandInterface{
  private ReceiverObject1 receiver;

  @Override
  public String execute() {
    return receiver.command2();
  }
}

Komponent Invoker – obiekt, którego rolą jest wykonanie metody zadeklarowanej w interfejsie.

public class Invoker1 {
  public String executeCommand(CommandInterface command) {
    return command.execute();
  }
}

Komponent Client – obiekt, który kontroluje wywołanie poleceń

public static void main(String[] args) {
        System.out.println("command pattern");

        Invoker1 invoker = new Invoker1();
        ReceiverObject1 receiver = new ReceiverObject1();
        
        String s1 = invoker.executeCommand(new Command1(receiver));
        System.out.println(s1);
        
        String s2 = invoker.executeCommand(new Command2(receiver));
        System.out.println(s2);
}

Kod z przykładów jest dostępny pod adresem https://github.com/mirekgab/commandPattern

Źródła:

https://en.wikipedia.org/wiki/Command_pattern

https://www.baeldung.com/java-command-pattern