Comprendre le modèle Iterator en comparant le code Java et JavaScript

introduction

Plus de détails et d'autres modèles peuvent être trouvés dans ** Comprendre les modèles de conception en comparant les implémentations JavaScript et Java **. J'ai écrit un exemple de JavaScript en regardant Java. Nous ne tirons pas parti des différences de fonctionnalités telles que le type de classe / type de prototype, la force typée et les modificateurs d'accès. (Certains getters ne sont pas nécessaires) Notez s'il vous plaît.

Modèle d'itérateur

Lorsque beaucoup de choses sont rassemblées, c'est pour les pointer dans l'ordre et effectuer le processus de numérisation de l'ensemble Le mot anglais iterate signifie ** répéter ** quelque chose. Parfois appelé ** répéteur ** en japonais

Exemple d'implémentation en Java

Il y a plusieurs livres sur l'étagère et un programme qui compte le nombre de livres sur chaque étagère

Diagramme de classe

Iterator.png

code

Main.java


public class Main {
    public static void main(String[] args) {
        BookShelf bookShelf = new BookShelf(4);
        bookShelf.appendBook(new Book("Around the World in 80 Days"));
        bookShelf.appendBook(new Book("Bible"));
        bookShelf.appendBook(new Book("Chinderella"));
        bookShelf.appendBook(new Book("Dabby-Long-Legs"));
        Iterator it = bookShelf.iterator();
        while (it.hasNext()) {
            Book book = (Book)it.next();
            System.out.println(book.getName());
        }        
    }
}

Aggregate.java


public interface Aggregate {
    public abstract Iterator iterator();
}

BookShelf.java


public class BookShelf implements Aggregate {
    private Book[] books;
    private int last = 0;

    public BookShelf(int maxsize) {
        this.books = new Book[maxsize];
    }
    public Book getBookAt(int index) {
        return books[index];
    }
    public void appendBook(Book book) {
        this.books[last] = book;
        last++;
    }
    public int getLength() {
        return last;
    }
    public Iterator iterator() {
        return new BookShelfIterator(this);
    }
}

Book.java


public class Book {
    private String name;

    public Book(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
}

Iterator.java


public interface Iterator {
    public abstract boolean hasNext();
    public abstract Object next();    
}

BookShelfIterator.java


public class BookShelfIterator implements Iterator {
    private BookShelf bookShelf;
    private int index;

    public BookShelfIterator(BookShelf bookShelf) {
        this.bookShelf = bookShelf;
        this.index = 0;
    }
    public boolean hasNext() {
        if (index < bookShelf.getLength()) {
            return true;
        } else {
            return false;
        }
    }
    public Object next() {
        Book book = bookShelf.getBookAt(index);
        index++;
        return book;
    }
}

Exemple JavaScript

code

index.html


<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Iterator</title>
</head>
<body>
    <script src="Main.js"></script>
    <script src="Interface.js"></script>
    <script src="Aggregate.js"></script>
    <script src="BookShelf.js"></script>
    <script src="Book.js"></script>
    <script src="iterator.js"></script>
    <script src="BookShelfIterator.js"></script>
</body>
</html>

Main.js


MAIN = {};
MAIN.init = function() {
    var bookShelf = new BookShelf();
    bookShelf.appendBook(new Book("Around the World in 80 Days"));
    bookShelf.appendBook(new Book("Bible"));
    bookShelf.appendBook(new Book("Chinderella"));
    bookShelf.appendBook(new Book("Dabby-Long=legs"));
    var it = bookShelf.iterator();
    while (it.hasNext()) {
        var book = it.next();
        console.log(book.name);
    }
};

window.addEventListener("load", MAIN.init);

Interface.js


/**
 * @namespace INTERFACE
 */
INTERFACE = {};

/**
 *Déterminez s'ils ont les mêmes propriétés
 * @static
 * @method implements
 */
INTERFACE.implements = function(child, Pr) {
    var parent = new Pr();
    for (var p in parent) {
        if (!(p in child)) {
            console.error(child.constructor.name + "classe(une fonction)À" + p + "La méthode n'a pas été déclarée.");
        }
    }
};

Aggregate.js


var Aggregate = function() {};
Aggregate.prototype.iterator = function() {};

BookShelf.js


var BookShelf = function() {
    this.books = [];
    this.last = 0;

    INTERFACE.implements(this, Aggregate);
};

BookShelf.prototype = {
    constructor: BookShelf,

    getBookAt: function(index) {
        return this.books[index];
    },
    appendBook: function(book) {
        this.books[this.last] = book;
        this.last += 1;
    },
    getLength: function() {
        return this.last;
    },
    iterator: function() {
        return new BookShelfIterator(this);
    }
};

Book.js


var Book = function(name) {
    this.name = name;
};

Book.prototype.getName = function() {
    return this.name;
};

Iterator.js


var Iterator = function() {};
Iterator.prototype = {
    constructor: Iterator,

    hasNext: function() {},
    next: function() {}
};

BookShelfIterator.js


var BookShelfIterator = function(bookShelf) {
    this.bookShelf = bookShelf;
    this.index = 0;

    INTERFACE.implements(this, Iterator);
};

BookShelfIterator.prototype = {
    constructor: BookShelfIterator,

    hasNext: function() {
        if (this.index < this.bookShelf.getLength()) {
            return true;
        } else {
            return false;
        }
    },
    next: function() {
        var book = this.bookShelf.getBookAt(this.index);
        this.index += 1;
        return book;
    }
}

Modèle d'itérateur en JavaScript écrit dans un livre

Le modèle Iterator est un comportement, donc ce serait bien d'avoir hasNext () et next (), non? J'ai l'impression de ne pas pouvoir le réutiliser, donc un peu. .. .. je me sens comme Pour votre référence

index.html


<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Iterator</title>
</head>
<body>
    <script src="Main.js"></script>
</body>
</html>

Main.js


MAIN = {};

MAIN.init = function() {
    while(egg.hasNext()) {
        console.log(egg.next());
    }
};

var egg = (function() {
    var index = 0,
        data = [1, 2, 3, 4, 5],
        length = data.length;

    return {
        next: function() {
            var element;
            if (!this.hasNext()) {
                return null;
            }
            element = data[index];
            index = index + 1;
            return element;
        },

        hasNext: function() {
            return index < length;
        }
    };
}());

window.addEventListener("load", MAIN.init);

Caractères dans le modèle Iterator

** Le rôle d'Iterator **

Un rôle qui détermine l'interface qui analyse les éléments dans l'ordre Exemple de programme ⇒ Itérateur (interface)

** Le rôle de Concreate Iterator **

Le rôle qui implémente réellement l'interface définie par le rôle d'itérateur Exemple de programme ⇒ BookShelfIterator (classe)

** Le rôle de l'agrégat **

Le rôle qui définit l'interface qui crée le rôle Iterator Exemple de programme ⇒ Agrégat (interface)

** Le rôle de Concreate Aggregate **

Le rôle qui implémente réellement l'interface définie par le rôle Aggregate Exemple de programme ⇒ BookShelf (classe)

Diagramme de classe de modèle d'itérateur

クラス図2.png

Besoin d'un modèle d'itérateur

Même si vous n'utilisez pas le modèle Iterator, vous pouvez utiliser une instruction for, etc. La principale raison d'utiliser Iterator est qu'en utilisant Iterator, il est possible de compter séparément de l'implémentation.

Type d'itérateur

Dans cet exemple, il s'agit d'un exemple simple qui ne balaye qu'une seule fois vers l'avant, mais il y en a d'autres.

Modèles associés

référence

[Introduction aux modèles de conception appris dans le langage Java augmenté et révisé](https://www.amazon.co.jp/%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82% E7% 89% 88Java% E8% A8% 80% E8% AA% 9E% E3% 81% A7% E5% AD% A6% E3% 81% B6% E3% 83% 87% E3% 82% B6% E3% 82% A4% E3% 83% B3% E3% 83% 91% E3% 82% BF% E3% 83% BC% E3% 83% B3% E5% 85% A5% E9% 96% 80-% E7% B5 % 90% E5% 9F% 8E-% E6% B5% A9 / dp / 4797327030) Modèle JavaScript - Comment faire de bonnes applications

Recommended Posts

Comprendre le modèle Iterator en comparant le code Java et JavaScript
Comprendre le modèle Singleton en comparant le code Java et JavaScript
Java et JavaScript
[Java] Comprendre la différence entre List et Set
Comprendre le bogue en l'implémentant et en l'analysant (1) Deadlock (Java)
Classes et instances Java comprises dans la figure
Introduction à Effective Java en pratiquant et en apprenant (modèle Builder)
Je n'ai pas vraiment compris le comportement de Java Scanner et .nextLine ()
[Pour les débutants] À propos de la syntaxe JavaScript expliquée par Java Gold
[Java] Introduction appropriée par Tenpa people Java Part 0 (règles du code)
Devinez le code de caractère en Java
[java8] Pour comprendre l'API Stream
Nouvelles fonctionnalités de Java 9 et exemple de code
Code de création de chaîne arbitraire par Java
Java passe par valeur et passe par référence
La route de JavaScript à Java
Structure de l'application Web par Java et flux de traitement dans la couche de présentation
Une collection de phrases qui impressionne le "sentiment différent" de Java et de JavaScript
Les débutants peuvent voir le code de Devise et comprendre son fonctionnement [registrations new]
Comprendre la différence entre int et Integer et BigInteger en java et float et double
Référence Java à comprendre dans la figure
Lier le code Java et C ++ avec SWIG
Essayons WebSocket avec Java et javascript!
J'ai essayé d'implémenter le modèle Iterator
[Java 7] Divisez la liste Java et exécutez le processus
Exécutez le code Java stocké dans le presse-papiers.
L'histoire reçue par Java SE11 silver
J'ai étudié le modèle d'état et le modèle de stratégie
[Java8] Recherchez le répertoire et récupérez le fichier
Logique du numéro de page et code de référence (java)
Java vs JavaScript: quelle est la différence?
Différence entre Java, C # et JavaScript (comment trouver le degré d'obésité)
Créez un environnement Apache et Tomcat avec Docker. À propos, coopération Maven & Java
Analyser en Java les chaînes de date et d'heure formatées par la fonction asctime du langage C