Cet article résume Iterator. Selon wikipedia, "En rendant indépendants les moyens d'énumération des éléments de l'objet conteneur, nous fournissons des itérateurs qui ne dépendent pas des spécifications internes du conteneur." Référence: Modèle d'itérateur
Le langage de programmation a un mécanisme pour regrouper des données telles que des tableaux, des listes et des tables de hachage en un seul objet, dont chacun a une utilisation appropriée, et ce modèle itère sur les éléments de l'objet groupé.
** Personnages principaux **
no | Nom | rôle |
---|---|---|
1 | Itérateur | Interface qui définit les méthodes d'accès séquentiel aux objets |
2 | Classe concrète d'itérateur | Implémenter des méthodes pour accéder séquentiellement aux objets |
3 | Agrégat | Une interface qui définit une méthode qui renvoie un itérateur de collection |
4 | Classe de béton d'agrégats | Implémenter une méthode qui contient une collection et retourne un itérateur |
** Implémentez le modèle ** J'aimerais imaginer le code alimentaire d'une installation commerciale complexe et mettre en œuvre plusieurs menus de restaurant selon le modèle de conception. Ici, à titre d'exemple, nous définirons les menus de deux magasins, "Hamburger" et "Oshiyaki". Nous supposons également que chaque magasin contient des données sous différentes formes (tableaux et listes).
** Itérateur **
Iterator.java
public interface Iterator {
boolean hasNext();
Object next();
}
** Classe concrète de l'itérateur **
SandwichMenuIterator.java
import java.util.ArrayList;
public class SandwichMenuIterator implements Iterator {
ArrayList<MenuItem> items = new ArrayList<>();
int position = 0;
public SandwichMenuIterator(ArrayList<MenuItem> items) {
this.items = items;
}
public Object next() {
MenuItem mi = items.get(this.position);
this.position++;
return mi;
}
public boolean hasNext() {
if (this.position >= this.items.size()) return false;
if (this.items.get(this.position) == null) return false;
return true;
}
}
OkonomiyakiMenuIterator.java
public class OkonomiyakiMenuIterator implements Iterator {
MenuItem[] items;
int position = 0;
public OkonomiyakiMenuIterator(MenuItem[] items) {
this.items = items;
}
public Object next() {
MenuItem mi = this.items[this.position];
this.position++;
return mi;
}
public boolean hasNext() {
if (this.position >= this.items.length) return false;
if (this.items[this.position] == null) return false;
return true;
}
}
** Agrégat **
Menu.java
public interface Menu {
public Iterator createIterator();
}
** Classe de béton de granulats **
SandwichMenu.java
import java.util.ArrayList;
public class SandwichMenu implements Menu {
ArrayList<MenuItem> menuItems = new ArrayList<>();
public SandwichMenu() {
addItem("Hamburger", "Sandwich ordinaire", true, 120);
addItem("cheeseburger", "Sandwich au fromage", true, 240);
addItem("Burger de poisson", "Sandwich au poisson frit", true, 320);
}
public void addItem(String name, String desc, Boolean coffee, Integer price) {
MenuItem mi = new MenuItem(name, desc, coffee, price);
menuItems.add(mi);
}
public Iterator createIterator() {
return new SandwichMenuIterator(menuItems);
}
public ArrayList<MenuItem> getMenuItems() {
return menuItems;
}
}
OkonomiyakiMenu.java
public class OkonomiyakiMenu implements Menu {
static final int MAX_ITEMS = 2;
MenuItem[] menuItems;
Integer cnt = 0;
public OkonomiyakiMenu() {
menuItems = new MenuItem[MAX_ITEMS];
addItem("Boule de porc", "Grillades à base de porc local", false, 600);
addItem("Grillé moderne", "Grillades à base de légumes locaux et de nouilles", false, 750);
}
public void addItem(String name, String desc, Boolean coffee, Integer price) {
MenuItem mi = new MenuItem(name, desc, coffee, price);
menuItems[cnt] = mi;
cnt++;
}
public Iterator createIterator() {
return new OkonomiyakiMenuIterator(menuItems);
}
public MenuItem[] getMenuItems() {
return menuItems;
}
}
** Classe contenant les données du menu **
MenuItem.java
public class MenuItem {
String name;
String desc;
Boolean coffee;
Integer price;
public MenuItem(String name, String desc, Boolean coffee, Integer price) {
this.name = name;
this.desc = desc;
this.coffee = coffee;
this.price = price;
}
public String getName() { return name; }
public String getDesc() { return desc; }
public Boolean getCoffee() { return coffee; }
public Integer getPrice() { return price; }
}
** Classe principale **
Main.java
public class Main {
public static void main(String args[]) {
SandwichMenu sm = new SandwichMenu();
OkonomiyakiMenu om = new OkonomiyakiMenu();
Iterator sandwichIterator = sm.createIterator();
Iterator okonomiyakiIterator = om.createIterator();
printMenu(sandwichIterator);
printMenu(okonomiyakiIterator);
}
public static void printMenu(Iterator iterator) {
while (iterator.hasNext()) {
MenuItem mi = (MenuItem)iterator.next();
System.out.print(mi.getName());
if(mi.getCoffee()) System.out.print("(Avec café)");
System.out.println("," + mi.getPrice());
System.out.println("--" + mi.getDesc());
}
}
}
résultat
$java Main
Hamburger(Avec café),120
--Sandwich ordinaire
cheeseburger(Avec café),240
--Sandwich au fromage
Burger de poisson(Avec café),320
--Sandwich au poisson frit
Boule de porc,600
--Grillades à base de porc local
Grillé moderne,750
--Grillades à base de légumes locaux et de nouilles
Le modèle Iterator consiste à implémenter une fonction qui accède séquentiellement aux objets qui collectent des données. Cette fois, pour deux objets de types de données différents, nous avons créé une classe (○○ MenuIterator.java) qui accède à chaque objet en séquence et l'affiche à l'écran. La méthode Iterator est implémentée dans l'interface "java.util.Collection" du langage Java, elle devrait donc être facile à imaginer.
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