Ich habe Anfang dieses Jahres angefangen, Designmuster zu studieren. Vor kurzem hatte ich das Gefühl, dass die Eingabe zu hoch wurde, und schrieb eine Zusammenfassung der Vorlagenmethode, um das Gelernte auszugeben. Ich hoffe, es wird dem Leser hilfreich sein. Ich wäre Ihnen auch dankbar, wenn Sie auf Fehler oder Bedenken hinweisen könnten.
――Was macht Sie mit der Vorlagenmethode glücklich? --Klassen Diagramm --DisplayFigure-Klasse
Mithilfe der Vorlagenmethode können Sie ** allgemeine Prozesse zu einem ** kombinieren **, die Anzahl der Änderungen reduzieren, wenn Sie die Logik später ändern möchten, und die Wartbarkeit Ihres Codes verbessern. Ich denke, es ist schwierig, diese Erklärung allein zu verstehen, deshalb werde ich sie mit einem tatsächlichen Programm erklären.
Es gibt Kreise und Quadrate, die von der abstrakten Klasse DisplayFigure erben. Die Hauptklasse verwendet die Methoden der untergeordneten Klasse über die DisplayFigure-Klasse.
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();
}
}
Diese Klasse implementiert den Prozess der Anzeige von Zahlen. Diese Klasse ist eine abstrakte Klasse, die die abstrakte Methode "printFigure ()" implementiert und untergeordnete Klassen zur Implementierung zwingt. In dispaly ()
werden die obigen drei Methoden zusammengefasst und die Verarbeitung in der untergeordneten Klasse standardisiert. Das Wichtigste hier ist der Modifikator "final", und Methoden mit diesem Modifikator können in untergeordneten Klassen nicht überschrieben und neu geschrieben werden. Ist es nicht möglich, die Absicht zu lesen, diese Methode so zu verwenden, wie sie ist?
Circle.java
public class Circle extends DisplayFigure {
private char symbol;
public Circle(char symbol) {
this.symbol = symbol;
}
public void printFigure() {
System.out.print(symbol);
}
}
Schauen wir uns als nächstes die Circle-Klasse an, die die DisplayFigure-Klasse erbt. Es implementiert den Inhalt von "printFigure ()", der in der oberen Klasse definiert ist. Da die Logik in der übergeordneten Klasse implementiert ist, handelt es sich um eine relativ einfache Implementierung. Die Abbildung wird mit dem Symbol der Variablen symbpl angezeigt, die zum Zeitpunkt der Klassenerstellung initialisiert wurde. Bei der Initialisierung mit dem Symbol ● ist dies wie folgt.
Ausführungsbeispiel
-- 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);
}
}
Diese Klasse erbt sowohl DisplayFigure.java als auch Circle.java. Das Initialisieren dieser Klasse mit dem Symbol ■ führt zur folgenden Ausführung. Die Hauptklasse, die dieses Programm ausführt, wird am Ende erklärt.
Ausführungsbeispiel
-- start!! --
■
■■
■■■
■■■■
■■■■■
-- finish!! --
Sie können sehen, dass "Kreis" und "Quadrat" eine ** allgemeine Verarbeitung ** ausführen. Der einzige Unterschied besteht darin, ob das Dreieck mit ● oder ■ gezeichnet wird.
Erstellen wir eine Hauptklasse und führen sie tatsächlich aus.
Main.java
public class Main {
public static void main(String[] args) {
DisplayFigure circle = new Circle('●');
DisplayFigure square = new Square('■');
circle.display();
square.display();
}
}
Ausführungsergebnis
-- start!! --
●
●●
●●●
●●●●
●●●●●
-- finish!! --
-- start!! --
■
■■
■■■
■■■■
■■■■■
-- finish!! --
Beachten Sie hierbei, dass ** die erstellte Instanz einer Variablen vom Typ der abstrakten Klasse (Upcast) ** zugeordnet ist. Anstatt die Methode der untergeordneten Klasse direkt aufzurufen, ruft sie dann die abstrakte Klasse display ()
der Klasse DisplayFigure
auf. Wenn Sie die Logik ändern möchten, müssen Sie daher nur das display ()
der DisplayFigure
-Klasse ändern.
Lassen Sie uns zum Schluss die Logik ändern. Bisher haben wir Dreiecke angezeigt. Schreiben Sie es also in ein Programm, das Quadrate anzeigt.
Abbildung nach Änderung anzeigen.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();
} */
//In ein Programm geändert, das Quadrate anzeigt
public final void display() {
init();
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
printFigure();
}
System.out.println();
}
finish();
}
}
Wenn du rennst ...
Ausführungsergebnis nach Änderung
-- start!! --
●●●●●
●●●●●
●●●●●
●●●●●
●●●●●
-- finish!! --
-- start!! --
■■■■■
■■■■■
■■■■■
■■■■■
■■■■■
-- finish!! --
Ich konnte das Verhalten der beiden Klassen "Circle" und "Square" ändern, indem ich einfach "print ()" der Klasse "DisplayFigure" änderte.
Nachschlagewerk: [Einführung in in der erweiterten und überarbeiteten Java-Sprache erlernte Entwurfsmuster](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 & keywords =% 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