Dieser Artikel fasst Iterator zusammen. Laut Wikipedia "stellen wir Iteratoren bereit, die nicht von den internen Spezifikationen des Containers abhängen, indem wir die Mittel zur Aufzählung der Elemente des Containerobjekts unabhängig machen." Referenz: Iteratormuster
Die Programmiersprache verfügt über einen Mechanismus zum Gruppieren von Daten wie Arrays, Listen und Hash-Tabellen in einem einzelnen Objekt, von denen jedes eine geeignete Verwendung hat. Dieses Muster iteriert über die Elemente des gruppierten Objekts.
** Hauptcharaktere **
no | Name | Rolle |
---|---|---|
1 | Iterator | Schnittstelle, die Methoden für den sequentiellen Zugriff auf Objekte definiert |
2 | Konkrete Klasse von Iteratoren | Implementieren Sie Methoden, um nacheinander auf Objekte zuzugreifen |
3 | Aggregat | Eine Schnittstelle, die eine Methode definiert, die einen Sammlungsiterator zurückgibt |
4 | Konkrete Klasse von Aggregaten | Implementieren Sie eine Methode, die eine Sammlung enthält und einen Iterator zurückgibt |
** Implementiere das Muster ** Ich möchte mir den Lebensmittelcode einer komplexen kommerziellen Einrichtung vorstellen und mehrere Restaurantmenüs gemäß dem Entwurfsmuster implementieren. Hier definieren wir als Beispiel die Menüs für zwei Geschäfte, "Hamburger" und "Oshiyaki". Wir gehen auch davon aus, dass jeder Speicher Daten in unterschiedlichen Formen (Arrays und Listen) enthält.
** Iterator **
Iterator.java
public interface Iterator {
boolean hasNext();
Object next();
}
** Konkrete Klasse von Iteratoren **
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;
}
}
** Aggregat **
Menu.java
public interface Menu {
public Iterator createIterator();
}
** Konkrete Klasse von Zuschlagstoffen **
SandwichMenu.java
import java.util.ArrayList;
public class SandwichMenu implements Menu {
ArrayList<MenuItem> menuItems = new ArrayList<>();
public SandwichMenu() {
addItem("Hamburger", "Gewöhnliches Sandwich", true, 120);
addItem("Cheeseburger", "Sandwich mit Käse", true, 240);
addItem("Fischburger", "Gebratenes Fischsandwich", 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("Schweinefleischball", "Gegrilltes Essen mit lokalem Schweinefleisch", false, 600);
addItem("Modern gegrillt", "Gegrilltes Essen mit lokalem Gemüse und Nudeln", 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;
}
}
** Klasse, die Menüdaten enthält **
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; }
}
** Hauptklasse **
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("(Mit Kaffee)");
System.out.println("," + mi.getPrice());
System.out.println("--" + mi.getDesc());
}
}
}
Ergebnis
$java Main
Hamburger(Mit Kaffee),120
--Gewöhnliches Sandwich
Cheeseburger(Mit Kaffee),240
--Sandwich mit Käse
Fischburger(Mit Kaffee),320
--Gebratenes Fischsandwich
Schweinefleischball,600
--Gegrilltes Essen mit lokalem Schweinefleisch
Modern gegrillt,750
--Gegrilltes Essen mit lokalem Gemüse und Nudeln
Das Iteratormuster besteht darin, eine Funktion zu implementieren, die nacheinander auf Objekte zugreift, die Daten sammeln. Dieses Mal haben wir für zwei Objekte unterschiedlichen Datentyps eine Klasse (○○ MenuIterator.java) erstellt, die nacheinander auf jedes Objekt zugreift und es auf dem Bildschirm ausgibt. Die Iterator-Methode ist in der Schnittstelle "java.util.Collection" der Java-Sprache implementiert, daher sollte sie leicht vorstellbar sein.
Referenz: [Kopf zuerst Entwurfsmuster - Entwurfsmuster, an das man sich mit Kopf und Körper erinnert] (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