Un modèle de conception dans lequel une superclasse définit le cadre de traitement et les sous-classes définissent le contenu spécifique est appelé la méthode de modèle. Il y a deux rôles à apparaître, le rôle de classe abstraite et le rôle de classe concrète.
Le rôle AbstractClass implémente la méthode de modèle. Déclarez également la méthode abstraite utilisée dans la méthode modèle.
package templateMethod;
public abstract class AbstractDisplay {
public abstract void open();
public abstract void print();
public abstract void close();
public final void display() {
open();
for(int i = 0; i < 5; i++) {
print();
}
close();
}
}
Implémentez concrètement la méthode abstraite définie par le rôle de AbstractClass. La méthode implémentée ici est appelée à partir de la méthode template qui joue le rôle de Abstract.
package templateMethod;
public class CharDisplay extends AbstractDisplay {
private char ch;
public CharDisplay(char ch) {
this.ch = ch;
}
@Override
public void open() {
System.out.print("<<");
}
@Override
public void print() {
System.out.print(ch);
}
@Override
public void close() {
System.out.println(">>");
}
}
package templateMethod;
public class StringDisplay extends AbstractDisplay{
private String string;
private int width;
public StringDisplay(String string) {
this.string = string;
this.width = string.getBytes().length;
}
@Override
public void open() {
printLine();
}
@Override
public void print() {
System.out.println("|" + string + "|");
}
@Override
public void close() {
printLine();
}
private void printLine() {
System.out.print("+");
for (int i = 0; i < width; i++) {
System.out.print("-");
}
System.out.println("+");
}
}
package templateMethod;
public class Main {
public static void main(String[] args) {
AbstractDisplay cd = new CharDisplay('c');
cd.display();
AbstractDisplay sd = new StringDisplay("Hello,World");
sd.display();
}
}
//résultat
//<<ccccc>>
//+-----------+
//|Hello,World|
//|Hello,World|
//|Hello,World|
//|Hello,World|
//|Hello,World|
//+-----------+
Le modèle de méthode modèle peut être utilisé pour normaliser la logique. Dans cet exemple, l'algorithme est décrit dans la méthode de modèle de la super classe, il n'est donc pas nécessaire de décrire l'algorithme un par un du côté de la sous-classe.
Si vous créez plusieurs ConcreteClasses en copiant sans utiliser la méthode de modèle Si vous trouvez plus tard un bogue dans ConcreteClass, vous devez le corriger dans toutes les ConcreteClasses. Si vous utilisez le modèle de méthode modèle, même si vous trouvez un bogue dans la méthode modèle Tout ce que vous avez à faire est de modifier la méthode du modèle.
Recommended Posts