J'ai commencé à étudier les modèles de conception depuis le début de cette année. Récemment, j'ai senti que les entrées étaient devenues excessives, j'ai donc écrit un résumé de la méthode modèle comme un endroit pour sortir ce que j'ai appris. J'espère que cela sera utile au lecteur. De plus, je vous serais reconnaissant de bien vouloir signaler toute erreur ou inquiétude.
―― Qu'est-ce qui vous satisfait de la méthode de modèle?
En utilisant la méthode de modèle, vous pouvez ** combiner des processus courants en un seul **, réduire le nombre de modifications lorsque vous souhaitez modifier la logique ultérieurement et améliorer la maintenabilité de votre code. Je pense que c'est difficile à comprendre à partir de cette seule explication, donc je vais l'expliquer avec un programme réel.
Il existe Circle et Square qui héritent de la classe abstraite DisplayFigure. La classe Main utilise les méthodes de la classe enfant via la classe DisplayFigure.
DisplayFigure.java
public abstract class DisplayFigure {
public void init() {
System.out.println("-- start!! --");
}
public abstract void printFigure();
public void finish() {
System.out.println("-- finish!! --");
}
public void final display() {
init();
for(int i = 0; i < 5; i ++) {
for(int j = 0; j <= i; j ++) {
printFigure();
}
System.out.println();
}
finish();
}
}
Cette classe implémente le processus d'affichage des figures. Cette classe est une classe abstraite qui implémente la méthode abstraite printFigure ()
et oblige les classes enfants à l'implémenter. Dans dispaly ()
, les trois méthodes ci-dessus sont regroupées et le traitement dans la classe enfant est standardisé. L'important ici est le modificateur final
, et les méthodes avec ce modificateur ne peuvent pas être écrasées et réécrites dans les classes enfants. N'est-il pas possible de lire l'intention d'utiliser cette méthode telle quelle?
Circle.java
public class Circle extends DisplayFigure {
private char symbol;
public Circle(char symbol) {
this.symbol = symbol;
}
public void printFigure() {
System.out.print(symbol);
}
}
Ensuite, regardons la classe Circle, qui hérite de la classe DisplayFigure. Il implémente le contenu de printFigure ()
défini dans la classe supérieure. Puisque la logique est implémentée dans la classe parente, il s'agit d'une implémentation relativement simple. La figure est affichée à l'aide du symbole du symbpl variable qui a été initialisé au moment de la création de la classe. Une fois initialisé avec le symbole ●, ce sera comme suit.
Exemple d'exécution
-- start!! --
●
●●
●●●
●●●●
●●●●●
-- finish!! --
Square.java
public class Square extends DisplayFigure {
private char symbol;
public Square(char symbol) {
this.symbol = symbol;
}
public void printFigure() {
System.out.print(symbol);
}
}
Cette classe hérite de DisplayFigure.java
ainsi que de Circle.java
. L'initialisation de cette classe avec le symbole ■ entraînera l'exécution suivante. La classe Main qui exécute ce programme est expliquée à la fin.
Exemple d'exécution
-- start!! --
■
■■
■■■
■■■■
■■■■■
-- finish!! --
Vous pouvez voir que Circle
et Square
font un ** traitement commun **, la seule différence est de savoir si le triangle est dessiné avec ● ou ■.
Créons une classe Main et exécutons-la réellement.
Main.java
public class Main {
public static void main(String[] args) {
DisplayFigure circle = new Circle('●');
DisplayFigure square = new Square('■');
circle.display();
square.display();
}
}
Résultat d'exécution
-- start!! --
●
●●
●●●
●●●●
●●●●●
-- finish!! --
-- start!! --
■
■■
■■■
■■■■
■■■■■
-- finish!! --
Ce à quoi vous devez faire attention ici, c'est que ** l'instance créée est affectée à une variable du type de la classe abstraite (upcast) **. Ensuite, au lieu d'appeler directement la méthode de la classe enfant, il appelle la classe abstraite display ()
de la classe DisplayFigure
. Grâce à cela, si vous voulez changer la logique, il vous suffit de changer le display ()
de la classe DisplayFigure
.
Enfin, changeons la logique. Jusqu'à présent, nous avons affiché des triangles, alors réécrivons-le dans un programme qui affiche des carrés.
Afficher la figure après le changement.java
public abstract class DisplayFigure {
public void init() {
System.out.println("-- start!! --");
}
public abstract void printFigure();
public void finish() {
System.out.println("-- finish!! --");
}
/* public final void display() {
init();
for(int i = 0; i < 5; i ++) {
for(int j = 0; j <= i; j ++) {
printFigure();
}
System.out.println();
}
finish();
} */
//Changé en un programme qui affiche des carrés
public final void display() {
init();
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
printFigure();
}
System.out.println();
}
finish();
}
}
Quand tu cours ...
Résultat d'exécution après modification
-- start!! --
●●●●●
●●●●●
●●●●●
●●●●●
●●●●●
-- finish!! --
-- start!! --
■■■■■
■■■■■
■■■■■
■■■■■
■■■■■
-- finish!! --
J'ai pu changer le comportement des deux classes, Circle
et Square
, simplement en changeant leprint ()
de la classe DisplayFigure
.
Ouvrage de référence: [Introduction to Design Patterns Learned in the Augmented and Revised Java Language](https://www.amazon.co.jp/%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8 % 82% E7% 89% 88Java% E8% A8% 80% E8% AA% 9E% E3% 81% A7% E5% AD% A6% E3% 81% B6% E3% 83% 87% E3% 82% B6 % E3% 82% A4% E3% 83% B3% E3% 83% 91% E3% 82% BF% E3% 83% BC% E3% 83% B3% E5% 85% A5% E9% 96% 80-% E7% B5% 90% E5% 9F% 8E-% E6% B5% A9 / dp / 4797327030 / ref = sr_1_1? __Mk_ja_JP =% E3% 82% AB% E3% 82% BF% E3% 82% AB% E3% 83% 8A & crid = 3V4BASNVFTA6O & mots-clés =% E3% 83% 87% E3% 82% B6% E3% 82% A4% E3% 83% B3% E3% 83% 91% E3% 82% BF% E3% 83% BC% E3 % 83% B3 & qid = 1564625886 & s = gateway & sprefix =% E3% 81% A7% E3% 81% 96% E3% 81% 84% E3% 82% 93% E3% 81% B1% E3% 81% 9F% 2Caps% 2C301 & sr = 8-1)
Recommended Posts