[GO] [Viererbande] Design Pattern Learning - Composite

Composite-Composite

** Inhaltsverzeichnis ** ** Bauen Sie die Klasse mit einer Holzstruktur zusammen. Es scheint ein Muster zu sein, das aus Objekten besteht, die als zusammengesetzt und Blatt bezeichnet werden, wie in **.

Zweck

Teile Objekte zu einer Baumstruktur zusammen, um die gesamte Hierarchie darzustellen. Das zusammengesetzte Muster ermöglicht es dem Client, einzelne Objekte und ihre Verbundstoffe einheitlich zu behandeln.

Komponente

· Zusammenfassung der Komponenten Root, Node, Leaf Abstract Class ・ Blattblatt ・ Zusammengesetzte Wurzel oder Knoten ・ Client-Benutzer

Implementierung

Wenn Sie das Wort "Baumstruktur" hören, können Sie sich einen Verzeichnisbaum vorstellen. Implementieren Sie daher ein Programm, das den Verzeichnisbaum verwalten und ausgeben kann.

Das Verzeichnis ist zusammengesetzt und die Datei ist Blatt.

Komponente Wurzel, Knoten, Blatt abstrakte Klasse

Verzeichnis- und Dateischnittstelle

Element.kt


package composite

interface Element {
    enum class ElementType(val type: String) {
        DIRECTORY("Direcotry"),
        FILE("File")
    }

    fun getType(): ElementType
    fun getName(): String
}

Zusammengesetzte Wurzel oder Knoten

Verzeichnis abstrakte Klasse

Haben Sie eine Elementliste, damit Sie die Elemente unter Ihrer Kontrolle verwalten können.

AbstractDirectory.kt


package composite

abstract class AbstractDirectory: Element {
    var elementList: MutableList<Element> = mutableListOf()

    abstract fun addElement(element: Element)
}

Verzeichnis konkrete Klasse

Directory.kt


package composite

class Directory(private val name: String): AbstractDirectory() {

    override fun getType(): Element.ElementType {
        return Element.ElementType.DIRECTORY
    }

    override fun addElement(element: Element) {
        elementList.add(element)
    }

    override fun getName(): String {
        return name
    }
}

Blatt Blatt

Datei konkrete Klasse

File.kt


package composite

class File(private val name: String): Element {

    override fun getType(): Element.ElementType {
        return Element.ElementType.FILE
    }

    override fun getName(): String {
        return name
    }
}

Client-Benutzer

Die Person, die den Verzeichnisbaum verwaltet

DirectoryManager.kt


package composite

class DirectoryManager {
    init {
        //Root-Verzeichnis
        val rootDirectory = Directory("/")
        rootDirectory.addElement(File("sample.config"))
        rootDirectory.addElement(File("gof.env"))

        //Ordner für iOS-Apps
        val iosDirectory = Directory("iOS")

        val iosAppDirectory = Directory("GofiOSApp")
        iosAppDirectory.addElement(File("xcode.project"))

        val iosAppSourceDirectory = Directory("Source")
        iosAppSourceDirectory.addElement(File("hoge.swift"))
        iosAppSourceDirectory.addElement(File("fuga.swift"))

        iosDirectory.addElement(iosAppDirectory)
        iosAppDirectory.addElement(iosAppSourceDirectory)
        rootDirectory.addElement(iosDirectory)

        //Ordner für Android Apps
        val androidDirectory = Directory("AndroidOS")

        val androidAppDirectory = Directory("GofAndroidApp")
        androidAppDirectory.addElement(File("AndroidManifest.xml"))

        val androidAppSourceDirectory = Directory("Source")
        androidAppSourceDirectory.addElement(File("moge.kt"))
        androidAppSourceDirectory.addElement(File("unbaba.kt"))

        androidDirectory.addElement(androidAppDirectory)
        androidAppDirectory.addElement(androidAppSourceDirectory)
        rootDirectory.addElement(androidDirectory)

        show(rootDirectory, 0)
    }

    private fun show(element: Element, indent: Int) {

        if (element is Directory) {
            println("${"----".repeat(indent)}【${element.getType().type}】${element.getName()}")
            element.elementList.forEach {
                show(it, indent + 1)
            }
        } else {
            println("${"----".repeat(indent)}【${element.getType().type}】${element.getName()}")
        }
    }
}

Dies vervollständigt den Verzeichnisbaum unter Verwendung des zusammengesetzten Musters.

Ausgabeergebnis

[output]
【Direcotry】/
----【File】sample.config
----【File】gof.env
----【Direcotry】iOS
--------【Direcotry】GofiOSApp
------------【File】xcode.project
------------【Direcotry】Source
----------------【File】hoge.swift
----------------【File】fuga.swift
----【Direcotry】AndroidOS
--------【Direcotry】GofAndroidApp
------------【File】AndroidManifest.xml
------------【Direcotry】Source
----------------【File】moge.kt
----------------【File】unbaba.kt

Wenn Sie den Ordner / iOS / GofIosApp / Source derselben Hierarchie duplizieren möchten, fügen Sie "iosAppDirectory.addElement (iosAppSourceDirectory)" hinzu.

[output]
【Direcotry】/
----【File】sample.config
----【File】gof.env
----【Direcotry】iOS
--------【Direcotry】GofiOSApp
------------【File】xcode.project
------------【Direcotry】Source
----------------【File】hoge.swift
----------------【File】fuga.swift
------------【Direcotry】Source
----------------【File】hoge.swift
----------------【File】fuga.swift
Abkürzung

Sie können das Verzeichnis frei bearbeiten.

Recommended Posts

[Viererbande] Design Pattern Learning - Composite
[Viererbande] Designmuster lernen
[Viererbande] Design Pattern Learning - Singleton
[Viererbande] Design Pattern Learning --Decorator
[Viererbande] Designmuster lernen --Besucher
[Viererbande] Design Pattern Learning - Vermittler
[Viererbande] Designmusterlernen --Iterator
[Viererbande] Designmuster lernen - Fassade
[Viererbande] Designmuster lernen - Prototyp
[Viererbande] Designmuster lernen - Andenken
[Viererbande] Designmuster lernen - Staat
[Vierergruppe] Design Pattern Learning - Interpreter
[Viererbande] Design Pattern Learning - Builder
[Viererbande] Designmuster lernen - Brücke
[Viererbande] Designmuster lernen --Proxy
[Viererbande] Design Pattern Learning - Strategie
[Viererbande] Designmuster lernen --Adapter
[Viererbande] Design Pattern Learning - Beobachter
[Viererbande] Designmuster lernen - Befehl
[Viererbande] Designmuster lernen - Fluggewicht
[Viererbande] Designmusterlernen - Abstract Factory
[Viererbande] Designmuster lernen - Fabrikmethode
[Viererbande] Designmuster lernen - Kette der Verantwortung
[Viererbande] Design Pattern Learning - Template-Methode
Gang of Four (GoF) -Muster in Python
Lernen Sie das Entwurfsmuster "Composite" mit Python
Entwurfsmuster #Builder
Entwurfsmuster #Adapter
Entwurfsmuster #Decorator
Lernen der Mustererkennung im Video Teil 1 Bereich der Mustererkennung
Entwurfsmuster #Observer
Entwurfsmuster #Facade
Entwurfsmuster #Strategie
Entwurfsmuster #Singleton
Entwurfsmuster #Proxy
Lernen Sie das Entwurfsmuster "Chain of Responsibility" in Python
Deep Learning 1 Übung des Deep Learning
Entwurfsmuster # Template-Methode
Die Geschichte, dass GoF-Designmuster nichts anderes sind als "Einführung abstrakter Ebenen"