[JAVA] [Entwurfsmuster] Allgemeine Logik mit der Vorlagenmethode

Einführung

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.

Inhaltsverzeichnis

――Was macht Sie mit der Vorlagenmethode glücklich? --Klassen Diagramm --DisplayFigure-Klasse

Was macht Sie mit der Vorlagenmethode glücklich?

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.

Klassen Diagramm

クラス図.png 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-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?

Kreisklasse

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!!  --

Quadratische Klasse

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.

Ich werde es tatsächlich bewegen

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.

Versuchen Sie, die Logik zu ä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

[Entwurfsmuster] Allgemeine Logik mit der Vorlagenmethode
Entwurfsmuster ~ Vorlagenmethode ~
Entwurfsmuster nach Ruby Template-Methode Musternotiz
C # gekautes Designmuster: TemplateMethod
Muster der Vorlagenmethode
Muster der Vorlagenmethode
Entwurfsmuster ~ Fabrikmethode ~
Überdenken des Java8-Lambda-Ausdrucks- und Stream-Entwurfsmusters - Muster der Vorlagenmethode -
Java-Anfänger-Entwurfsmuster (Factory-Methodenmuster)
Entwurfsmuster ~ Builder ~
Entwurfsmuster ~ Besucher ~
Java-Entwurfsmuster
Entwurfsmuster ~ Proxy ~
Entwurfsmuster ~ Zustand ~
Factory Method Pattern
Entwurfsmuster ~ Strategie ~
Entwurfsmuster ~ Composite ~
Entwurfsmuster (1): AbstractFactory
Entwurfsmuster ~ Iterator ~
Entwurfsmuster ~ Fassade ~
Entwurfsmuster ~ Brücke ~
Entwurfsmuster ~ Mediator ~
Entwurfsmuster ~ Dekorateur ~
Entwurfsmuster ~ Interpreter ~
Factory Method Muster
Entwurfsmuster ~ Beobachter ~
Entwurfsmuster ~ Prototyp ~
Entwurfsmuster ~ Memento ~
Entwurfsmuster ~ Adapter ~
Entwurfsmuster ~ Fliegengewicht ~
C ++ - Entwurfsmuster (TemplateMethod-Muster)
Entwurfsmuster ~ Abstrakte Fabrik ~
Zusammenfassung des GoF-Entwurfsmusters
Zusammenfassung des Java-Entwurfsmusters
Überdenken von Entwurfsmustern mit Java8-Lambda-Ausdrücken und Stream - Builder-Muster -
[Hinweis] Entwurfsmuster, das bei der Automatisierung des GUI-Tests mit Selen berücksichtigt wird