Implémentation du modèle de méthode template en Java

Implémentation du modèle de méthode de modèle en Java

1. Vue d'ensemble

Dans ce rapide didacticiel, nous verrons comment tirer parti destemplate method pattern, l'un des modèlesGoF les plus populaires.

Il facilite la mise en œuvre d'algorithmes complexes en encapsulant la logique dans une seule méthode.

2. la mise en oeuvre

Pour illustrer le fonctionnement du modèle de méthode de modèle, créons un exemple simple qui représente la construction d’une station informatique.

Compte tenu de la définition du modèle,the 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, comme une carte mère et un processeur.

Ici,the build() method is the template method, qui définit les étapes de l'algorithme d'assemblage des parties de l'ordinateur et renvoie les instancesComputer entièrement initialisées.

Notez que it’s declared as final to prevent it from being overridden.

3. En action

La classe de base étant déjà définie, essayons de l’utiliser en créant deux sous-classes. L'un qui construit un ordinateur «standard» et l'autre qui construit un ordinateur «haut de gamme»:

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

Et voici la varianteHighEndComputerBuilder:

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

Comme nous pouvons le voir, nous n'avons pas eu à nous soucier de l'ensemble du processus d'assemblage, mais uniquement pour fournir des implémentations pour des méthodes distinctes.

Voyons maintenant cela en action:

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. Méthodes de modèle dans les bibliothèques Java Core

Ce modèle est largement utilisé dans les bibliothèques Java Core, par exemple parjava.util.AbstractList oujava.util.AbstractSet.

Par exemple,Abstract List fournit une implémentation squelettique de l'interfaceList.

Un exemple de méthode de modèle peut être la méthodeaddAll(), bien qu’elle ne soit pas explicitement définie commefinal:

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

Les utilisateurs doivent uniquement implémenter la méthodeadd():

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

Ici, il est de la responsabilité du programmeur de fournir une implémentation pour ajouter un élément à la liste à l'index donné (la partie variante de l'algorithme de listage).

5. Conclusion

Dans cet article, nous avons montré le modèle de méthode template et comment l'implémenter en Java.

Le modèle de méthode de modèle favorise la réutilisation et le découplage du code, mais aux dépens de l’utilisation de l’héritage.

Comme toujours, tous les exemples de code présentés dans cet article sont disponiblesover on GitHub.