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