[GO] Verstehen Sie das zusammengesetzte Muster, indem Sie JavaScript und Java-Code vergleichen

Einführung

Details und andere Muster werden in ** Grundlegendes zu Entwurfsmustern durch Vergleichen von Implementierungen in JavaScript und Java ** geschrieben. Ich habe ein Beispiel für JavaScript geschrieben, indem ich mir Java angesehen habe. Unterschiede in Funktionen wie Klassentyp / Prototyp, Typstärke und Zugriffsmodifikatoren werden nicht genutzt. Bitte beachten Sie.

Zusammengesetztes Muster

Es gibt ein "Verzeichnis" im Computer-Dateisystem Es gibt andere Verzeichnisse und Dateien im Verzeichnis Verzeichnisse erstellen solche "verschachtelten" Strukturen, rekursive Strukturen

qiita1.PNG qiita2.PNG

Behandeln Sie Verzeichnisse und Dateien zusammen als Verzeichniseinträge Es kann zweckmäßig sein, den Behälter und den Inhalt als denselben Typ zu behandeln

Ein Muster, das den Inhalt mit dem Container gleichsetzt und eine rekursive Struktur erstellt, wird als zusammengesetztes Muster bezeichnet. Verbund bedeutet "Mischung" und "Verbund"

Implementierungsbeispiel in Java

Ein Programm, das Dateien und Verzeichnisse schematisch darstellt

Klassen Diagramm

Composite.png

Code

Main.java


public class Main {
    public static void main(String[] args) {
        try {
            System.out.println("Making root entries...");
            Directory rootdir = new Directory("root");
            Directory bindir = new Directory("bin");
            Directory tmpdir = new Directory("tmp");
            Directory usrdir = new Directory("usr");
            rootdir.add(bindir);
            rootdir.add(tmpdir);
            rootdir.add(usrdir);
            bindir.add(new File("vi", 10000));
            bindir.add(new File("latex", 20000));
            rootdir.printList();

            System.out.println("");
            System.out.println("Making user entries...");
            Directory yuki = new Directory("yuki");
            Directory hanako = new Directory("hanako");
            Directory tomura = new Directory("tomura");
            usrdir.add(yuki);
            usrdir.add(hanako);
            usrdir.add(tomura);
            yuki.add(new File("diary.html", 100));
            yuki.add(new File("Composite.java", 200));
            hanako.add(new File("memo.tex", 300));
            tomura.add(new File("game.doc", 400));
            tomura.add(new File("junk.mail", 500));
            rootdir.printList();
        } catch (FileTreatmentException e) {
            e.printStackTrace();
        }
    }
}

Entry.java


public abstract class Entry {
    public abstract String getName();
    public abstract int getSize();
    public Entry add(Entry entry) throws FileTreatmentException {
        throw new FileTreatmentException();
    }
    public void printList() {
        printList("");
    }
    protected abstract void printList(String prefix);
    public String toString() {
        return getName() + " (" + getSize() + ")";
    }
}

Directory.java


import java.util.Iterator;
import java.util.ArrayList;

public class Directory extends Entry {
    private String name;
    private ArrayList<Entry> directory = new ArrayList<Entry>();
    
    public Directory(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public int getSize() {
        int size = 0;
        Iterator it = directory.iterator();
        while (it.hasNext()) {
            Entry entry = (Entry)it.next();
            size += entry.getSize();
        }
        return size;
    }
    public Entry add(Entry entry) {
        directory.add(entry);
        return this;
    }
    protected void printList(String prefix) {
        System.out.println(prefix + "/" + this);
        Iterator it = directory.iterator();
        while (it.hasNext()) {
            Entry entry = (Entry)it.next();
            entry.printList(prefix + "/" + name);
        }
    }
}

File.java


public class File extends Entry {
    private String name;
    private int size;
    public File(String name, int size) {
        this.name = name;
        this.size = size;
    }
    public String getName() {
        return name;
    }
    public int getSize() {
        return size;
    }
    protected void printList(String prefix) {
        System.out.println(prefix + "/" + this);
    }
}

FileTreatmentException.java


public class FileTreatmentException extends RuntimeException {
    public FileTreatmentException() {

    }
    public FileTreatmentException(String msg) {
        super(msg);
    }
}

Implementierungsbeispiel in JavaScript

Code

index.html


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

Main.js


MAIN = {};

MAIN.init = function() {
    console.log("Making root entries...");
    MAIN.rootdir = new Directory("root");
    MAIN.bindir = new Directory("bin");
    MAIN.tmpdir = new Directory("tmp");
    MAIN.usrdir = new Directory("usr");
    MAIN.rootdir.add(MAIN.bindir);
    MAIN.rootdir.add(MAIN.tmpdir);
    MAIN.rootdir.add(MAIN.usrdir);
    MAIN.bindir.add(new File("vi", 10000));
    MAIN.bindir.add(new File("latex", 20000));
    MAIN.rootdir.printList();

    console.log("");
    console.log("Making user entries...");
    MAIN.yuki = new Directory("yuki");
    MAIN.hanako = new Directory("hanako");
    MAIN.tomura = new Directory("tomura");
    MAIN.usrdir.add(MAIN.yuki);
    MAIN.usrdir.add(MAIN.hanako);
    MAIN.usrdir.add(MAIN.tomura);
    MAIN.yuki.add(new File("diary.html", 100));
    MAIN.yuki.add(new File("Composite.java", 200));
    MAIN.hanako.add(new File("memo.tex", 300));
    MAIN.tomura.add(new File("game.doc", 400));
    MAIN.tomura.add(new File("junk.mail", 500));
    MAIN.rootdir.printList();
};

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

Directory.js


var Directory = function(name) {
    this.name = name;
    this.directory = [];
};

Directory.prototype = {
    constructor: Directory,

    getName: function() {
        return this.name;
    },
    getSize: function() {
        var size = 0;
        for (var i = 0, max = this.directory.length; i < max; i++) {
            size += this.directory[i].getSize();
        }
        return size;
    },
    add(entry) {
        this.directory.push(entry);
        return this;
    },
    printList: function(prefix) {
        if (arguments.length === 0) {
            console.log("/" + this.getName() + " (" + this.getSize() + ")");
            for (var i = 0, max = this.directory.length; i < max; i++) {
                this.directory[i].printList(this.getName());
            }
        } else {
            console.log(prefix + "/" + this.getName() + " (" + this.getSize() + ")");
            for (var i = 0, max = this.directory.length; i < max; i++) {
                this.directory[i].printList(prefix + "/" + this.getName());
            }
        }
    }
}

File.js


var File = function(name, size) {
    this.name = name;
    this.size = size;
};

File.prototype = {
    constructor: File,

    getName: function() {
        return this.name;
    },
    getSize: function() {
        return this.size;
    },

    printList(prefix) {
        console.log(prefix + "/" + this.getName() + " (" + this.getSize() + ")");
    }
};

Zeichen im zusammengesetzten Muster

** Rolle des Blattes **

Eine Rolle, die "Inhalte" darstellt Sie können nichts anderes in diese Rolle setzen Beispielprogramm ⇒ Datei (Klasse)

** Die Rolle von Composite **

Rolle für "Container" Sie können eine Blattrolle oder eine zusammengesetzte Rolle einfügen Beispielprogramm ⇒ Verzeichnis (Klasse)

** Rolle der Komponente **

Eine Rolle, um die Blattrolle mit der zusammengesetzten Rolle gleichzusetzen Die Komponentenrolle wird als Superklasse ausgedrückt, die der Blattrolle und der zusammengesetzten Rolle gemeinsam ist. Beispielprogramm ⇒ Eintrag (abstrakte Klasse)

** Die Rolle des Kunden **

Benutzer von zusammengesetzten Mustern Beispielprogramm ⇒ Main (Klasse)

Zusammengesetztes Musterklassendiagramm

test.png

Notwendigkeit für zusammengesetztes Muster

Sample.java


// Directory
public int getSize() {
  int size = 0;
  Iterator it = directory.iterator();
  while (it.hasNext()) {
    Entry entry = (Entry)it.next();
    size += entry.getSize();
  }
  return size;
}

// File
public int getSize() {
  return size;
}

In beiden Fällen können Sie die Größe mit derselben Methode wie getSize ermitteln. Dies ist eine Manifestation der Eigenschaft des zusammengesetzten Musters, "den Behälter und den Inhalt als dasselbe zu betrachten".

Sie können die Baumstruktur rekursiv aufrufen, um die Größe zu erhalten

qiita3.PNG

Datenstrukturen, die im Allgemeinen baumstrukturiert sind, passen zum zusammengesetzten Muster

Bei Verwendung des zusammengesetzten Musters

Im Testprogramm werden zusammengesetzte Muster usw. verwendet

Sie können das zusammengesetzte Muster verwenden, wenn Sie diese drei als Eingabetests verwenden möchten.

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)

Recommended Posts

Verstehen Sie das zusammengesetzte Muster, indem Sie JavaScript und Java-Code vergleichen
Verstehen Sie das Strategiemuster, indem Sie JavaScript und Java-Code vergleichen
Verstehen Sie das Decorator-Muster, indem Sie JavaScript und Java-Code vergleichen
Verstehen Sie das Statusmuster, indem Sie JavaScript und Java-Code vergleichen
Verstehen Sie Entwurfsmuster, indem Sie Implementierungen in JavaScript und Java vergleichen. [Von Zeit zu Zeit aktualisiert]
Der Versuch, Segmentbäume Schritt für Schritt zu implementieren und zu verstehen (Python)
Java-Kompilierung und Ausführung von CLI verstanden
Lesen Sie die Datei, indem Sie den Zeichencode angeben.
Verstehen Sie den Entscheidungsbaum und klassifizieren Sie Dokumente
Lernen Sie das Entwurfsmuster "Composite" mit Python