[JAVA] Einführung in Entwurfsmuster (Composite)

Dieser Artikel fasst Composite zusammen. Laut Wikipedia "kann es rekursive Datenstrukturen mit Baumstrukturen wie Verzeichnissen und Dateien darstellen." Referenz: Zusammengesetztes Muster

Wenn Sie in einer objektdenkenden Sprache arbeiten, werden Sie häufig sehen, wie Objekte in Sammlungen wie Arrays, Stapel, Listen und Hashes gepackt und der Reihe nach verarbeitet werden. Selbst wenn die Objekte im zusammengesetzten Muster eine baumartige Struktur haben (eine Struktur, in der Objekte, die untergeordnete Elemente enthalten, und Objekte, die keine untergeordneten Elemente enthalten, gemischt werden), z. B. "Single-Many", werden die Unterschiede zwischen einzelnen Objekten ignoriert. Und wenden Sie den gleichen Prozess an.

Skizze der Komponenten


Zusammengesetzter Knoten
 |-Blattknoten
 |-Blattknoten
 |-Blattknoten

** Hauptcharaktere **

no Name Rolle
1 Komponente Eine Knoteneinheit wie Composite und Leaf wird so genannt. Schnittstelle, die auf dem Knoten implementiert werden soll
2 Zusammengesetzter Knoten Objekt, das untergeordnete Elemente enthält
3 Blattknoten Objekte ohne untergeordnete Elemente

** Implementiere das Muster ** Durch Kombinieren der Knoten wie eine Hierarchie wird die komplizierte Struktur wie folgt ausgedrückt. Betrachten Sie die fiktive Cafeteria-Menütabelle.

Cafeteria-Menü


Speisekarte
 |-Reis
 |  |-Set Mahlzeit A ¥ 1,000
 |  |-Mahlzeit B ¥ 1 einstellen,200
 |
 |-Nudeln
 |  |-Ramen ¥ 900
 |  |-Udon 800 Yen
 |
 |-trinken
    |-Cola 250 Yen
    |-Tee ¥ 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("(Mit Kaffee)");
        System.out.println("," + getPrice());
        System.out.println(" -- " + getDescription());
    }
}

Main.java


public class Main {
    public static void main(String args[]) {
         MenuComponent rice = new Menu("Reis", "Menü einstellen");
         MenuComponent noodles = new Menu("Nudeln", "Nudeln類メニュー");
         MenuComponent drink = new Menu("trinken", "trinkenメニュー");
         MenuComponent all = new Menu("Speisekarte", "Klicken Sie noch heute hier");
         all.add(rice);
         all.add(noodles);
         all.add(drink);
         rice.add(new MenuItem("Mahlzeit einstellen A.", "Vorteilhaftes Essensset A.", true, 1000));
         rice.add(new MenuItem("Mahlzeit einstellen B.", "Vorteilhaftes Essensset B.", true, 1200));
         noodles.add(new MenuItem("Ramen", "自家製Ramen", false, 900));
         noodles.add(new MenuItem("Udon", "本格Udon", false, 800));
         drink.add(new MenuItem("Cola", "Rotes Paket", false, 250));
         drink.add(new MenuItem("Tee", "どこにでもあるTee", false, 300));
         all.print();
    }
}

Ergebnis


$java Main
Speisekarte,Klicken Sie noch heute hier
--------
Reis,Menü einstellen
--------
Mahlzeit einstellen A.(Mit Kaffee),1000
 --Vorteilhaftes Essensset A.
Mahlzeit einstellen B.(Mit Kaffee),1200
 --Vorteilhaftes Essensset B.

Nudeln,Nudeln類メニュー
--------
Ramen,900
 --Hausgemachte Ramen
Udon,800
 --Authentisches Udon

trinken,trinkenメニュー
--------
Cola,250
 --Rotes Paket
Tee,300
 --Tee überall

Das Muster wird von print () in Menu.java angewendet. Für die Zusammensetzung von Objekten werden Kategorien in der Menüklasse definiert und Menüdetails (Menü, Details, Preis, Anwesenheit / Abwesenheit von Kaffee) in der MenuItem-Klasse verwaltet. Menüobjekte und MenuItem-Objekte werden in der Liste der Menüklasse gespeichert. Wenn print () Daten ausgibt, wird die Ausgabeverarbeitung für jedes Objekt ausgeführt, unabhängig vom Vorhandensein oder der Anzahl der Menüobjekte und MenuItem-Objekte.

Referenz: [Head First Design Pattern-Design Patterns, an die Sie sich mit Ihrem Kopf und Körper erinnern sollten] (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

Einführung in Entwurfsmuster (Composite)
Einführung in Entwurfsmuster (Einführung)
Einführung in Designmuster (Fliegengewicht)
Einführung in Entwurfsmuster Prototyp
Einführung in Entwurfsmuster (Iterator)
Einführung in Entwurfsmuster (Strategie)
Einführung in Entwurfsmuster (Factory-Methode)
Einführung in Design Patterns (Abstract Factory)
Wichtiges Entwurfsmuster zur Verbesserung der Wartbarkeit
Einführung in Ruby 2
Verschiedene Designmuster
Entwurfsmuster ~ Composite ~
Java-Entwurfsmuster
Einführung in web3j
Einführung in Micronaut 1 ~ Einführung ~
[Java] Einführung in Java
Einführung in die Migration
Einführung in Java
Einführung in Doma
Einführung in JAR-Dateien
Einführung in die Bitarithmetik
Einführung in Ratpack (6) --Promise
Einführung in Ratpack (9) - Thymeleaf
Einführung in PlayFramework 2.7 ① Übersicht
Einführung in das Android-Layout
Einführung in die praktische Programmierung
Einführung in den Befehl javadoc
Einführung in den Befehl jar
Einführung in Ratpack (2) -Architektur
Einführung in den Lambda-Stil
Einführung in den Java-Befehl
Einführung in die Keycloak-Entwicklung
Studieren Sie GoF-Entwurfsmuster
Einführung in den Befehl javac
Ich las Hiroshi Yuki "Einführung in Designmuster, die in Java gelernt wurden" (SB Creative)
Einführung in die Android App-Entwicklung
Einführung in Ratpack (5) --Json & Registry
Einführung in Metabase ~ Umgebungskonstruktion ~
Einführung in Ratpack (7) - Guice & Spring
(Punktinstallation) Einführung in Java8_Impression
Einführung in Micronaut 2 ~ Unit Test ~
Einführung in JUnit (Studiennotiz)
Einführung in Spring Boot ~ ~ DI ~
[Java] Einführung in den Lambda-Ausdruck
Einführung in Spring Boot ② ~ AOP ~
Einführung in Apache Beam (2) ~ ParDo ~
Einführung in die EHRbase 2-REST-API
[Java] Einführung in die Stream-API
Einführung in Spring Boot Teil 1
Einführung in Ratpack (1) - Was ist Ratpack?
Warum Designmuster benötigt werden
[Java] Zusammenfassung der Entwurfsmuster
[Einführung in Janken (ähnliche) Spiele] Java