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