Das Template Method Pattern in Java implementieren

Implementieren des Vorlagenmethodenmusters in Java

1. Überblick

In diesem kurzen Tutorial erfahren Sie, wie Sie dietemplate method pattern nutzen können - eines der beliebtestenGoF-Muster.

Es erleichtert die Implementierung komplexer Algorithmen, indem die Logik in einer einzigen Methode gekapselt wird.

2. Implementierung

Um zu demonstrieren, wie das Muster der Vorlagenmethode funktioniert, erstellen wir ein einfaches Beispiel, das den Aufbau einer Computerstation darstellt.

In Anbetracht der Definition des Musters sindthe algorithm’s structure will be defined in a base class that defines the template build() method:

public abstract class ComputerBuilder {

    // ...

    public final Computer buildComputer() {
        addMotherboard();
        setupMotherboard();
        addProcessor();
        return new Computer(computerParts);
    }

    public abstract void addMotherboard();
    public abstract void setupMotherboard();
    public abstract void addProcessor();

    // ...
}

The ComputerBuilder class is responsible for outlining the steps required to build a computer by declaring methods for adding and setting up different components, z. B. ein Motherboard und ein Prozessor.

Hierthe build() method is the template method, das Schritte des Algorithmus zum Zusammensetzen der Computerteile definiert und vollständig initialisierteComputer-Instanzen zurückgibt.

Beachten Sie, dass it’s declared as final to prevent it from being overridden.

3. In Aktion

Versuchen wir, die bereits festgelegte Basisklasse zu verwenden, indem wir zwei Unterklassen erstellen. Einer, der einen "Standard" -Computer baut, und der andere, der einen "High-End" -Computer baut:

public class StandardComputerBuilder extends ComputerBuilder {

    @Override
    public void addMotherboard() {
        computerParts.put("Motherboard", "Standard Motherboard");
    }

    @Override
    public void setupMotherboard() {
        motherboardSetupStatus.add(
          "Screwing the standard motherboard to the case.");
        motherboardSetupStatus.add(
          "Pluging in the power supply connectors.");
        motherboardSetupStatus.forEach(
          step -> System.out.println(step));
    }

    @Override
    public void addProcessor() {
        computerParts.put("Processor", "Standard Processor");
    }
}

Und hier ist die Variante vonHighEndComputerBuilder:

public class HighEndComputerBuilder extends ComputerBuilder {

    @Override
    public void addMotherboard() {
        computerParts.put("Motherboard", "High-end Motherboard");
    }

    @Override
    public void setupMotherboard() {
        motherboardSetupStatus.add(
          "Screwing the high-end motherboard to the case.");
        motherboardSetupStatus.add(
          "Pluging in the power supply connectors.");
        motherboardSetupStatus.forEach(
          step -> System.out.println(step));
    }

    @Override
    public void addProcessor() {
         computerParts.put("Processor", "High-end Processor");
    }
}

Wie wir sehen können, mussten wir uns nicht um den gesamten Montageprozess kümmern, sondern nur um Implementierungen für separate Methoden.

Lassen Sie es uns jetzt in Aktion sehen:

new StandardComputerBuilder()
  .buildComputer();
  .getComputerParts()
  .forEach((k, v) -> System.out.println("Part : " + k + " Value : " + v));

new HighEndComputerBuilder()
  .buildComputer();
  .getComputerParts()
  .forEach((k, v) -> System.out.println("Part : " + k + " Value : " + v));

4. Vorlagenmethoden in Java Core Libraries

Dieses Muster wird in den Java-Kernbibliotheken häufig verwendet, beispielsweise vonjava.util.AbstractList oderjava.util.AbstractSet.

Zum Beispiel bietetAbstract List eine Skelettimplementierung derList-Schnittstelle.

Ein Beispiel für eine Vorlagenmethode kann die MethodeaddAll()ein, obwohl sie nicht explizit alsfinal:definiert ist

public boolean addAll(int index, Collection c) {
    rangeCheckForAdd(index);
    boolean modified = false;
    for (E e : c) {
        add(index++, e);
        modified = true;
    }
    return modified;
}

Benutzer müssen nur dieadd()-Methode implementieren:

public void add(int index, E element) {
    throw new UnsupportedOperationException();
}

Hier liegt es in der Verantwortung des Programmierers, eine Implementierung zum Hinzufügen eines Elements zur Liste am angegebenen Index (dem varianten Teil des Auflistungsalgorithmus) bereitzustellen.

5. Fazit

In diesem Artikel wurde das Muster der Template-Methode und die Implementierung in Java beschrieben.

Das Vorlagenmethodenmuster fördert die Wiederverwendung und Entkopplung von Code, jedoch auf Kosten der Verwendung von Vererbung.

Wie immer sind alle in diesem Artikel gezeigten Codebeispieleover on GitHub verfügbar.