[JAVA] Introduction aux modèles de conception (composite)

Cet article résume Composite. Selon wikipedia, «il peut représenter des structures de données récursives avec des arborescences, telles que des répertoires et des fichiers». Référence: Motif composite

Si vous êtes un langage orienté objet, vous verrez souvent comment les objets sont regroupés dans des collections telles que des tableaux, des piles, des listes et des hachages, et traités dans l'ordre. Dans le modèle composite, même si les objets ont une structure arborescente (une structure dans laquelle sont mélangés des objets contenant des éléments enfants et des objets sans éléments enfants), telle que "un-plusieurs", les différences entre les objets individuels sont ignorées. Et appliquez le même processus.

Croquis des composants


Nœud composite
 |-Noeud feuille
 |-Noeud feuille
 |-Noeud feuille

** Personnages principaux **

no Nom rôle
1 composant Une unité de nœud telle que composite et feuille est appelée ainsi. Interface à implémenter sur le nœud
2 Nœud composite Objet contenant des éléments enfants
3 Noeud feuille Objets qui n'ont aucun élément enfant

** Implémentez le modèle ** En combinant les nœuds comme une hiérarchie, la structure complexe est exprimée comme suit. Considérez le tableau fictif du menu de la cafétéria.

Menu de la cafétéria


menu
 |-riz
 |  |-Set repas A ¥ 1,000
 |  |-Set repas B ¥ 1,200
 |
 |-nouilles
 |  |-Ramen 900 ¥
 |  |-Udon 800 ¥
 |
 |-boisson
    |-Cola 250 ¥
    |-Thé 300 ¥

MenuCompnent.java


public abstract class MenuComponent {
    public void add(MenuComponent mc) {
        throw new UnsupportedOperationException();
    }
    public void remove(MenuComponent mc) {
        throw new UnsupportedOperationException();
    }
    public MenuComponent getChild(Integer i) {
        throw new UnsupportedOperationException();
    }

    abstract public String getName();
    abstract public String getDescription();
    abstract public void print();
}

Menu.java


import java.util.ArrayList;
import java.util.Iterator;

public class Menu extends MenuComponent {
    ArrayList<MenuComponent> mcs = new ArrayList<>();
    String name;
    String description;

    public Menu(String name, String description) {
        this.name = name;
        this.description = description;
    }
    public void add(MenuComponent mc) { mcs.add(mc); }
    public void remove(MenuComponent mc) { mcs.remove(mc); }
    public MenuComponent getChild(Integer i) { return mcs.get(i); }
    public String getName() { return name; }
    public String getDescription() { return description; }
    public void print() {
        System.out.print("\n" + getName());
        System.out.println("," + getDescription());
        System.out.println("--------");
        
        Iterator iterator = mcs.iterator();
        while(iterator.hasNext()) {
            MenuComponent mc = (MenuComponent) iterator.next();
            mc.print();
        }
    }
}

MenuItem.java


public class MenuItem extends MenuComponent {
    public String name;
    public String description;
    public Boolean coffee;
    public Integer price;

    public MenuItem(String name, String description, Boolean coffee, Integer price) {
        this.name = name;
        this.description = description;
        this.coffee = coffee;
        this.price = price;
    }
    public String getName() { return name; }
    public String getDescription() { return description; }
    public Integer getPrice() { return price; }
    public Boolean isCoffee() { return coffee; }
    public void print() {
        System.out.print(" " + getName());
        if (isCoffee()) System.out.print("(Avec café)");
        System.out.println("," + getPrice());
        System.out.println(" -- " + getDescription());
    }
}

Main.java


public class Main {
    public static void main(String args[]) {
         MenuComponent rice = new Menu("riz", "Menu de repas");
         MenuComponent noodles = new Menu("nouilles", "nouilles類メニュー");
         MenuComponent drink = new Menu("boisson", "boissonメニュー");
         MenuComponent all = new Menu("menu", "Cliquez ici aujourd'hui");
         all.add(rice);
         all.add(noodles);
         all.add(drink);
         rice.add(new MenuItem("Set repas A", "Ensemble repas avantageux A", true, 1000));
         rice.add(new MenuItem("Set repas B", "Set repas avantageux B", true, 1200));
         noodles.add(new MenuItem("ramen", "自家製ramen", false, 900));
         noodles.add(new MenuItem("Udon", "本格Udon", false, 800));
         drink.add(new MenuItem("Cola", "Paquet rouge", false, 250));
         drink.add(new MenuItem("thé", "どこにでもあるthé", false, 300));
         all.print();
    }
}

résultat


$java Main
menu,Cliquez ici aujourd'hui
--------
riz,Menu de repas
--------
Set repas A(Avec café),1000
 --Ensemble repas avantageux A
Set repas B(Avec café),1200
 --Set repas avantageux B

nouilles,nouilles類メニュー
--------
ramen,900
 --Ramen maison
Udon,800
 --Udon authentique

boisson,boissonメニュー
--------
Cola,250
 --Paquet rouge
thé,300
 --Du thé partout

Le motif est appliqué par print () dans Menu.java. Quant à la composition des objets, les catégories sont définies dans la classe Menu, et les détails du menu (menu, détails, prix, présence / absence café) sont gérés dans la classe MenuItem. Les objets Menu et les objets MenuItem sont stockés dans la liste de la classe Menu, et lorsque print () sort des données, le traitement de sortie est effectué pour chacun, indépendamment de la présence ou du nombre d'objets Menu et d'objets MenuItem.

Référence: [Head First Design Patterns Design Patterns to Remember with Your Head and Body] (https://www.amazon.co.jp/Head-First%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3-%E2%80%95%E9%A0%AD%E3%81%A8%E3%81%8B%E3%82%89%E3%81%A0%E3%81%A7%E8%A6%9A%E3%81%88%E3%82%8B%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%AE%E5%9F%BA%E6%9C%AC-Eric-Freeman/dp/4873112494)

Recommended Posts

Introduction aux modèles de conception (composite)
Introduction aux modèles de conception (introduction)
Introduction aux modèles de conception (poids mouche)
Introduction au prototype de modèles de conception
Introduction aux modèles de conception (Iterator)
Introduction aux modèles de conception (stratégie)
Introduction aux modèles de conception (méthode d'usine)
Introduction aux modèles de conception (Abstract Factory)
Modèle de conception important pour améliorer la maintenabilité
Introduction à Ruby 2
Divers modèles de conception
Modèle de conception ~ Composite ~
Modèles de conception Java
Introduction à web3j
Introduction à Micronaut 1 ~ Introduction ~
[Java] Introduction à Java
Introduction à la migration
Introduction à Java
Introduction à Doma
Introduction aux fichiers JAR
Introduction à l'arithmétique des bits
Introduction à Ratpack (6) - Promesse
Introduction à Ratpack (9) --Thymeleaf
Introduction à PlayFramework 2.7 ① Présentation
Introduction à la mise en page Android
Introduction à la programmation pratique
Introduction à la commande javadoc
Introduction à la commande jar
Introduction à Ratpack (2) -Architecture
Introduction au style lambda
Introduction à la commande java
Introduction au développement de Keycloak
Étudier les modèles de conception du GoF
Introduction à la commande javac
J'ai lu Hiroshi Yuki "Introduction aux modèles de conception appris en langage Java" (SB Creative)
Introduction au développement d'applications Android
Introduction à Ratpack (5) --Json & Registry
Introduction à la métabase ~ Construction de l'environnement ~
Introduction à Ratpack (7) --Guice & Spring
(Installation par points) Introduction à Java8_Impression
Introduction à Micronaut 2 ~ Test unitaire ~
Introduction à JUnit (note d'étude)
Introduction à Spring Boot ① ~ DI ~
[Java] Introduction à l'expression lambda
Introduction à Spring Boot ② ~ AOP ~
Introduction à Apache Beam (2) ~ ParDo ~
Introduction à l'API EHRbase 2-REST
[Java] Introduction à l'API Stream
Introduction à Spring Boot, partie 1
Introduction à Ratpack (1) - Qu'est-ce que Ratpack?
Pourquoi vous avez besoin d'un modèle de conception
[Java] Résumé des modèles de conception
[Introduction aux jeux Janken (comme)] Java