[GO] [Gang of Four] Apprentissage des modèles de conception - Visiteur

Visiteur-Visiteur

** Table des matières ** Je comprends que le modèle consiste à fournir au visiteur une interface pour tous les éléments et à laisser le visiteur gérer le traitement lié à cet élément.

Objectif

Représente une opération effectuée sur un élément sur une structure d'objet. Le modèle Visiteur vous permet de définir une nouvelle opération sans changer la classe de l'objet auquel vous ajoutez l'opération.

Composant

・ Classe de résumé de visiteur visiteur ・ ConcreteVisitor Visiteur de cours de béton -Element Classe abstraite d'éléments qui transfèrent le traitement aux visiteurs -ConcreteElement Une classe concrète d'éléments qui transfèrent le traitement aux visiteurs -Une classe qui peut énumérer des éléments ObjectStructure (il semble, mais je ne comprends pas la nécessité)

la mise en oeuvre

Mettre en place un programme de cuisson avec les ingrédients préparés.

Classe de résumé de visiteur visiteur

Visitor.kt


package visitor

interface Visitor {
    fun visit(e: PotatoElement)
    fun visit(e: CarrotElement)
    fun visit(e: PorkElement)
    fun visit(e: OtherElement)
    fun serve()
}

ConcreteVisitor Visiteur de classe de béton

Visiteurs faisant du curry

CurryVisitor.kt


package visitor

class CurryVisitor: Visitor {
    private var cookingPotato = false
    private var cookingCarrot = false
    private var cookingPork = false
    private var cookingOther = false

    override fun visit(e: PotatoElement) {
        cookingPotato = true
        println("${e.name()}Peler et couper et laisser mijoter dans une casserole.")
    }

    override fun visit(e: CarrotElement) {
        cookingCarrot = true
        println("${e.name()}Prenez les bourgeons, épluchez et coupez et laissez mijoter dans une casserole.")
    }

    override fun visit(e: PorkElement) {
        cookingPork = true
        println("${e.name()}Coupez et laissez mijoter dans une casserole.")
    }

    override fun visit(e: OtherElement) {
        cookingOther = true
        println("Au curry roux${e.name()}Mettez dans une casserole et laissez mijoter.")
    }

    override fun serve() {
        if (cookingPotato && cookingCarrot && cookingOther && cookingPork) {
            println("Achèvement du curry!")
        } else {
            println("Je cuisine encore.")
        }
    }

}

Élément Classe abstraite d'éléments qui transfèrent le traitement aux visiteurs

Classe abstraite matérielle

Element.kt


package visitor

interface Element {
    fun name(): String
    fun cooking(v: Visitor)
}

ConcreteElement Une classe concrète d'éléments qui transfèrent le traitement au visiteur

Classes de béton matériel Patate

PotatoElement.kt


package visitor

class PotatoElement: Element {
    override fun name(): String {
        return "Patate"
    }

    override fun cooking(v: Visitor) {
        v.visit(this)
    }
}

Carottes

CarrotElement.kt


package visitor

class CarrotElement: Element {
    override fun name(): String {
        return "Carottes"
    }

    override fun cooking(v: Visitor) {
        v.visit(this)
    }
}

porc

PorkElement.kt


package visitor

class PorkElement: Element {
    override fun name(): String {
        return "porc"
    }

    override fun cooking(v: Visitor) {
        v.visit(this)
    }

}

Autre

OtherElement.kt


package visitor

class OtherElement: Element {
    override fun name(): String {
        return "Sel et poivre"
    }

    override fun cooking(v: Visitor) {
        v.visit(this)
    }
}

Les personnes qui utilisent

Client.kt


package visitor

class Client {
    init {
        serveCurry()
    }

    private fun serveCurry() {
        val pot = PotatoElement()
        val c = CarrotElement()
        val por = PorkElement()
        val o = OtherElement()
        val v = CurryVisitor()

        pot.cooking(v)
        c.cooking(v)
        por.cooking(v)
        v.serve()
        o.cooking(v)
        v.serve()
    }
}
[out-put]

Peler et couper les pommes de terre et laisser mijoter dans une casserole.
Prenez les bourgeons de carottes, épluchez-les et coupez-les et laissez mijoter dans une casserole.
Coupez le porc et laissez mijoter dans une casserole.
Je cuisine encore.
Mettre le roux au curry, le sel et le poivre dans une casserole et laisser mijoter.
Achèvement du curry!

Je veux faire des légumes frits, donc je vais mettre en œuvre Fried Vegetables Visitor.

FriedVegetablesVisitor.kt


package visitor

class FriedVegetablesVisitor: Visitor {
    private var cookingPotato = false
    private var cookingCarrot = false
    private var cookingPork = false
    private var cookingOther = false

    override fun visit(e: PotatoElement) {
        cookingPotato = true
        println("${e.name()}Peler, couper et faire frire.")
    }

    override fun visit(e: CarrotElement) {
        cookingCarrot = true
        println("${e.name()}Prenez les bourgeons, épluchez, coupez et faites frire.")
    }

    override fun visit(e: PorkElement) {
        cookingPork = true
        println("${e.name()}Coupez et faites frire.")
    }

    override fun visit(e: OtherElement) {
        cookingOther = true
        println("${e.name()}Mettez dans une casserole et faites frire.")
    }

    override fun serve() {
        if (cookingPotato && cookingCarrot && cookingOther && cookingPork) {
            println("Achèvement des légumes frits!")
        } else {
            println("Je cuisine encore.")
        }
    }
}

Client.kt


package visitor

class Client {
    init {
        serveCurry()
        println("--------------------------------")
        serveFriedVegetables()
    }

    private fun serveFriedVegetables() {
        val pot = PotatoElement()
        val c = CarrotElement()
        val por = PorkElement()
        val o = OtherElement()
        val v = FriedVegetablesVisitor()

        pot.cooking(v)
        c.cooking(v)
        por.cooking(v)
        v.serve()
        o.cooking(v)
        v.serve()
    }

    private fun serveCurry() {
        val pot = PotatoElement()
        val c = CarrotElement()
        val por = PorkElement()
        val o = OtherElement()
        val v = CurryVisitor()

        pot.cooking(v)
        c.cooking(v)
        por.cooking(v)
        v.serve()
        o.cooking(v)
        v.serve()
    }
}

Résultat de sortie

[out-put]
Épluchez et coupez les pommes de terre et laissez mijoter dans une casserole.
Prenez les bourgeons de carottes, épluchez-les, coupez-les et laissez mijoter dans une casserole.
Coupez le porc et laissez mijoter dans une casserole.
Je cuisine encore.
Mettre le roux au curry, le sel et le poivre dans une casserole et laisser mijoter.
Achèvement du curry!
--------------------------------
Épluchez les pommes de terre, coupez-les et faites-les frire.
Prenez les bourgeons de carottes, épluchez-les, coupez-les et faites-les frire.
Coupez le porc et faites-le frire.
Je cuisine encore.
Mettez du sel et du poivre dans une casserole et faites-les frire.
Achèvement des légumes frits!

Recommended Posts

[Gang of Four] Apprentissage des modèles de conception - Visiteur
[Gang of Four] Apprentissage des modèles de conception
[Gang of Four] Apprentissage des modèles de conception --Singleton
[Gang of Four] Apprentissage des modèles de conception - Décorateur
[Gang of Four] Apprentissage des modèles de conception - Médiateur
[Gang of Four] Apprentissage des modèles de conception - Itérateur
[Gang of Four] Apprentissage des modèles de conception - Façade
[Gang of Four] Apprentissage des modèles de conception - Composite
[Gang of Four] Apprentissage des modèles de conception - Prototype
[Gang of Four] Apprentissage des modèles de conception --Mémento
[Gang of Four] Apprentissage des modèles de conception - État
[Gang of Four] Apprentissage des modèles de conception - Interprétation
[Gang of Four] Apprentissage des modèles de conception - Constructeur
[Gang of Four] Apprentissage des modèles de conception - Pont
[Gang of Four] Apprentissage des modèles de conception - Proxy
[Gang of Four] Apprentissage des modèles de conception - Stratégie
[Gang of Four] Apprentissage des modèles de conception - Adaptateur
[Gang of Four] Apprentissage des modèles de conception --Observer
[Gang of Four] Apprentissage des modèles de conception - Commande
[Gang of Four] Apprentissage des modèles de conception - Usine abstraite
[Gang of Four] Apprentissage des modèles de conception - Méthode d'usine
[Gang of Four] Apprentissage des modèles de conception - Chaîne de responsabilité
[Gang of Four] Apprentissage des modèles de conception - Méthode du modèle
Apprenez le modèle de conception "Visiteur" avec Python
Modèles Gang of Four (GoF) en Python
Modèle de conception #Builder
Modèle de conception #Adapter
Modèle de conception #Decorator
Apprentissage de la reconnaissance de formes en vidéo Partie 1 Champ de reconnaissance de formes
Modèle de conception #Observer
Modèle de conception #Facade
Modèle de conception #Strategy
Modèle de conception #Singleton
Modèle de conception #Proxy
Apprenez le modèle de conception «Chaîne de responsabilité» en Python
Design Pattern #Factory, méthode
Modèle de visiteur en Python
Deep learning 1 Pratique du deep learning
Design Pattern #Template, méthode
À propos du modèle de visiteur
L'histoire selon laquelle les modèles de conception du GoF ne sont rien de plus qu'une «introduction de couches abstraites»