[JAVA] Einführung in Entwurfsmuster (Iterator)

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

Einführung in Entwurfsmuster (Iterator)
Einführung in Entwurfsmuster (Einführung)
Einführung in Entwurfsmuster (Builder)
Einführung in Entwurfsmuster (Composite)
Einführung in Designmuster (Fliegengewicht)
Einführung in Entwurfsmuster (Strategie)
Einführung in Design Patterns (Abstract Factory)
Wichtiges Entwurfsmuster zur Verbesserung der Wartbarkeit
Einführung in Ruby 2
Entwurfsmuster ~ Iterator ~
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 Ratpack (8) -Session
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 ~
(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
Entwerfen Sie ein Muster, um es mit dem Swift-Iterator-Muster zu versuchen, das Array und Dictionary unterstützt