[JAVA] [Modèle de conception] Logique commune avec la méthode de modèle

introduction

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.

table des matières

―― Qu'est-ce qui vous satisfait de la méthode de modèle?

Qu'est-ce qui vous satisfait avec 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.

Diagramme de classe

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

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?

Classe de cercle

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

Classe carrée

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 ■.

Je vais vraiment le déplacer

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.

Essayez de changer la logique

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

[Modèle de conception] Logique commune avec la méthode de modèle
Modèle de conception ~ Méthode de modèle ~
Modèle de conception par la méthode Ruby Template Mémo de modèle
Modèle de conception mâché C #: TemplateMethod
Modèle de méthode de modèle
Modèle de modèle de méthode
Modèle de conception ~ Méthode d'usine ~
Repenser les modèles d'expression et de conception de flux Java8 - Modèle de méthode
Modèle de conception Java pour débutant (modèle de méthode d'usine)
Modèle de conception ~ Constructeur ~
Modèle de conception ~ Visiteur ~
Modèle de conception Java
Modèle de conception ~ Proxy ~
Modèle de conception ~ État ~
Modèle de méthode d'usine
Modèle de conception ~ Stratégie ~
Modèle de conception ~ Composite ~
Modèle de conception (1): AbstractFactory
Modèle de conception ~ Itérateur ~
Modèle de conception ~ Façade ~
Modèle de conception ~ Pont ~
Modèle de conception ~ Médiateur ~
Modèle de conception ~ Décorateur ~
Modèle de conception ~ Interprète ~
Modèle de méthode d'usine
Modèle de conception ~ Observateur ~
Modèle de conception ~ Prototype ~
Modèle de conception ~ Memento ~
Modèle de conception ~ Adaptateur ~
Modèle de conception ~ Poids mouche ~
Modèle de conception C ++ (modèle TemplateMethod)
Modèle de conception ~ Usine abstraite ~
Résumé du modèle de conception du GoF
Résumé du modèle de conception Java
Repenser les modèles de conception avec les expressions lambda Java8 et Stream --Builder pattern -
[Note] Modèle de conception pris en compte lors de l'automatisation du test de l'interface graphique avec Selenium