[JAVA] Introduction aux modèles de conception (Iterator)

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

Introduction aux modèles de conception (Iterator)
Introduction aux modèles de conception (introduction)
Introduction aux modèles de conception (Builder)
Introduction aux modèles de conception (composite)
Introduction aux modèles de conception (poids mouche)
Introduction aux modèles de conception (stratégie)
Introduction aux modèles de conception (Abstract Factory)
Modèle de conception important pour améliorer la maintenabilité
Introduction à Ruby 2
Modèle de conception ~ Itérateur ~
Modèles de conception Java
Introduction à web3j
Introduction à Micronaut 1 ~ Introduction ~
[Java] Introduction à Java
Introduction à la migration
Introduction à Java
Introduction à Doma
Introduction aux fichiers JAR
Introduction à Ratpack (8) - Session
Introduction à l'arithmétique des bits
Introduction à Ratpack (6) - Promesse
Introduction à Ratpack (9) --Thymeleaf
Introduction à PlayFramework 2.7 ① Présentation
Introduction à la mise en page Android
Introduction à la programmation pratique
Introduction à la commande javadoc
Introduction à la commande jar
Introduction à Ratpack (2) -Architecture
Introduction au style lambda
Introduction à la commande java
Introduction au développement de Keycloak
Étudier les modèles de conception du GoF
Introduction à la commande javac
J'ai lu Hiroshi Yuki "Introduction aux modèles de conception appris en langage Java" (SB Creative)
Introduction au développement d'applications Android
Introduction à Ratpack (5) --Json & Registry
Introduction à la métabase ~ Construction de l'environnement ~
(Installation par points) Introduction à Java8_Impression
Introduction à Micronaut 2 ~ Test unitaire ~
Introduction à JUnit (note d'étude)
Introduction à Spring Boot ① ~ DI ~
[Java] Introduction à l'expression lambda
Introduction à Spring Boot ② ~ AOP ~
Introduction à Apache Beam (2) ~ ParDo ~
Introduction à l'API EHRbase 2-REST
[Java] Introduction à l'API Stream
Introduction à Spring Boot, partie 1
Introduction à Ratpack (1) - Qu'est-ce que Ratpack?
Pourquoi vous avez besoin d'un modèle de conception
[Java] Résumé des modèles de conception
[Introduction aux jeux Janken (comme)] Java
Modèle de conception à essayer avec le modèle Swift-Iterator qui prend en charge Array et Dictionary