Verstehen Sie das Iterator-Muster, indem Sie Java- und JavaScript-Code vergleichen

Einführung

Weitere Details und andere Muster finden Sie in ** Grundlegendes zu Entwurfsmustern durch Vergleichen von JavaScript- und Java-Implementierungen **. Ich habe ein Beispiel für JavaScript geschrieben, indem ich mir Java angesehen habe. Unterschiede in Funktionen wie Klassentyp / Prototypentyp, Typstärke und Zugriffsmodifikatoren werden nicht ausgenutzt. (Einige Getter werden nicht benötigt) Bitte beachten Sie.

Iteratormuster

Wenn viele Dinge gesammelt werden, dient dies dazu, auf sie zu zeigen und den Vorgang des Scannens des Ganzen durchzuführen Das englische Wort iterate bedeutet ** etwas wiederholen **. Manchmal auf Japanisch ** Repeater ** genannt

Implementierungsbeispiel in Java

Es gibt mehrere Bücher im Bücherregal und ein Programm, das die Anzahl der Bücher in jedem Bücherregal zählt

Klassen Diagramm

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;
    }
}

JavaScript-Beispiel

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 = {};

/**
 *Stellen Sie fest, ob sie dieselben Eigenschaften haben
 * @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 + "Klasse(Funktion)Zu" + p + "Die Methode wurde nicht deklariert.");
        }
    }
};

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;
    }
}

Iteratormuster in JavaScript in einem Buch geschrieben

Das Iterator-Muster ist Verhalten, also wäre es schön, hasNext () und next () zu haben, oder? Ich habe das Gefühl, ich kann es nicht wiederverwenden, also ein bisschen. .. .. ich fühle mich wie Als Referenz

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);

Zeichen im Iteratormuster

** Die Rolle des Iterators **

Eine Rolle, die die Schnittstelle bestimmt, die Elemente der Reihe nach scannt Beispielprogramm ⇒ Iterator (Schnittstelle)

** Die Rolle von Concreate Iterator **

Die Rolle, die die durch die Rolle des Iterators definierte Schnittstelle tatsächlich implementiert Beispielprogramm ⇒ BookShelfIterator (Klasse)

** Die Rolle des Aggregats **

Die Rolle, die die Schnittstelle definiert, die die Iterator-Rolle erstellt Beispielprogramm ⇒ Aggregat (Schnittstelle)

** Die Rolle von Concreate Aggregate **

Die Rolle, die die durch die Aggregatrolle definierte Schnittstelle tatsächlich implementiert Beispielprogramm ⇒ BookShelf (Klasse)

Iteratormuster-Klassendiagramm

クラス図2.png

Notwendigkeit für Iteratormuster

Auch wenn Sie das Iterator-Muster nicht verwenden, können Sie eine for-Anweisung usw. verwenden. Der Hauptgrund für die Verwendung von Iterator ist, dass mit Iterator getrennt von der Implementierung gezählt werden kann.

Art des Iterators

In diesem Beispiel ist es ein einfaches Beispiel, das nur einmal vorwärts gescannt wird, aber es gibt andere.

Verwandte Muster

Referenz

[Einführung in Entwurfsmuster, die in der erweiterten und überarbeiteten Java-Sprache gelernt wurden](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) JavaScript-Muster - wie man gute Anwendungen macht

Recommended Posts

Verstehen Sie das Iterator-Muster, indem Sie Java- und JavaScript-Code vergleichen
Verstehen Sie das Singleton-Muster, indem Sie Java- und JavaScript-Code vergleichen
Java und JavaScript
[Java] Verstehe den Unterschied zwischen List und Set
Verstehen Sie den Fehler, indem Sie ihn implementieren und analysieren. (1) Deadlock (Java)
In der Abbildung verstandene Java-Klassen und -Instanzen
Einführung in effektives Java durch Üben und Lernen (Builder-Muster)
Ich habe das Verhalten von Java Scanner und .nextLine () nicht wirklich verstanden.
[Für Anfänger] Über die von Java Gold erklärte JavaScript-Syntax
[Java] Angemessene Einführung durch Tenpa-Leute Java Teil 0 (Code-Regeln)
Errate den Zeichencode in Java
[java8] Um die Stream-API zu verstehen
Java 9 neue Funktionen und Beispielcode
Beliebiger Code zum Erstellen von Zeichenfolgen durch Java
Java als Wert übergeben und als Referenz übergeben
Der Weg von JavaScript nach Java
Webanwendungsstruktur nach Java und Verarbeitungsablauf in der Präsentationsschicht
Eine Sammlung von Phrasen, die das "unterschiedliche Gefühl" von Java und JavaScript beeindruckt
Anfänger können den Devise-Code sehen und verstehen, wie er funktioniert [Registrierungen neu]
Verstehen Sie den Unterschied zwischen int und Integer und BigInteger in Java und float und double
Java-Referenz zum Verständnis in der Abbildung
Verknüpfen Sie Java- und C ++ - Code mit SWIG
Probieren wir WebSocket mit Java und Javascript aus!
Ich habe versucht, das Iterator-Muster zu implementieren
[Java 7] Teilen Sie die Java-Liste und führen Sie den Prozess aus
Führen Sie den in der Zwischenablage gespeicherten Java-Code aus.
Die Geschichte von Java SE11 Silber erhalten
Ich habe das Zustandsmuster und das Strategiemuster studiert
[Java8] Durchsuchen Sie das Verzeichnis und holen Sie sich die Datei
Seitenzahllogik und Referenzcode (Java)
Java vs. JavaScript: Was ist der Unterschied?
Unterschied zwischen Java, C # und JavaScript (wie man den Grad der Fettleibigkeit findet)
Erstellen Sie mit Docker eine Apache- und Tomcat-Umgebung. Übrigens Maven & Java Kooperation
Analysieren Sie die Datums- und Zeitzeichenfolge, die von der asctime-Funktion der C-Sprache in Java formatiert wurde