[GO] [Gang of Four] Apprentissage des modèles de conception - Médiateur

Médiateur-intermédiaire

** Table des matières ** Comme son nom l'indique, ce modèle consiste à éliminer les relations entre les objets via la classe médiateur.

Nous voyons souvent des spécifications telles que le bouton ne pas être activé à moins que la zone de texte ne contienne une valeur. Cela ne peut être réalisé que si l'objet zone de texte connaît l'objet bouton (et le conserve comme variable d'instance). Avec une spécification aussi simple, cela peut ne pas poser de problème si elle est directement liée, mais pour des fonctions plus compliquées, une classe doit connaître un certain nombre d'objets. Éliminez-le en utilisant la classe intermédiaire.

Après tout, tout motif entraîne une orthogonalité accrue.

Objectif

Définissez un objet qui encapsule l'interaction d'un groupe d'objets. Le modèle Mediator permet de réduire le degré de couplage en empêchant les objets de se référencer explicitement les uns les autres. Cela permet à l'interaction des objets d'être modifiée indépendamment.

Composant

・ Classe abstraite de médiateur ・ Classe de béton ConcreteMediator ・ Objets Collegeague que vous souhaitez associer à divers objets

la mise en oeuvre

Implémente des cases à cocher, des zones de texte et des objets bouton. Les zones de texte ne peuvent être saisies que si l'une des cases à cocher est cochée. Le bouton ne peut être enfoncé que si la case à cocher est cochée et que la zone de texte est vide.

Classe abstraite de médiateur médiateur

Mediator.kt


package mediator

interface Mediator {

    /**
     *Si le bouton peut être enfoncé
     */
    fun buttonPress(): Boolean

    /**
     *Si la zone de texte peut être saisie
     */
    fun inputTextBox(): Boolean
}

ConcreteMediator Classe de béton

ConcreteMediator.kt


package mediator

class ConcreteMediator: Mediator {

    var checkBox: CheckBox? = null
    var textBox: TextBox? = null
    var button: Button? = null

    override fun buttonPress(): Boolean {
        return checkBox?.sex != null && textBox?.value?.isNotEmpty() ?: false
    }

    override fun inputTextBox(): Boolean {
        return checkBox?.sex != null
    }

}

Objets de collègue que vous souhaitez associer à divers objets

Classe abstraite

Colleague.kt


package mediator

interface Colleague {
    enum class Type {
        CheckBox,
        TextBox,
        Button
    }

    val type: Type
    val mediator: Mediator
}

Classe de béton · Case à cocher

CheckBox.kt


package mediator

    class CheckBox(override val mediator: Mediator): Colleague {
    override val type = Colleague.Type.CheckBox
    enum class Sex {
        Male,
        Female
    }

    var sex: Sex? = null

    fun select(sex: Sex) {
        this.sex = sex
    }
}

·Zone de texte

TextBox.kt


package mediator

class TextBox(override val mediator: Mediator): Colleague {
    override val type = Colleague.Type.TextBox
    var value = ""

    fun input(value: String) {
        if (mediator.inputTextBox()) {
            this.value = value
            println("Saisie réussie de la zone de texte")
        } else {
            println("Échec de la saisie de la zone de texte")
        }
    }
}

·bouton

Button.kt


package mediator

class Button(override val mediator: Mediator): Colleague {
    override val type = Colleague.Type.Button

    fun press() {
        if (mediator.buttonPress()) {
            println("Appuyez sur le bouton avec succès")
        } else {
            println("Échec de la pression du bouton")
        }
    }
}

Les personnes qui utilisent

Client.kt


package mediator

class Client {
    init {
        val mediator = ConcreteMediator()
        val checkBox = CheckBox(mediator)
        val textBox = TextBox(mediator)
        val button = Button(mediator)

        mediator.checkBox = checkBox
        mediator.textBox = textBox
        mediator.button = button

        //La saisie de la zone de texte a échoué car la case n'est pas cochée
        textBox.input("Yamada Taro")

        //Sélection de la case à cocher
        checkBox.select(CheckBox.Sex.Female)

        //Appuyez sur le bouton Échec car aucune zone de texte n'a été saisie
        button.press()

        //Entrée de la zone de texte réussie!!!
        textBox.input("Hanako Yamada")

        //Appuyez sur le bouton avec succès!!!
        button.press()
    }
}

Résultat de sortie

[out-put]
Échec de la saisie de la zone de texte
Échec de la pression du bouton
Saisie réussie de la zone de texte
Appuyez sur le bouton avec succès

c'est tout

Recommended Posts

[Gang of Four] Apprentissage des modèles de conception - Médiateur
[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 - Visiteur
[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 - Poids du vol
[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 "Mediator" 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
J'ai étudié les modèles de conception (mémo personnel) Partie 6 (modèle de chaîne de responsabilité, modèle de façade, modèle de médiateur)
Apprenez le modèle de conception «Chaîne de responsabilité» en Python
Design Pattern #Factory, méthode
Deep learning 1 Pratique du deep learning
Design Pattern #Template, méthode
L'histoire selon laquelle les modèles de conception du GoF ne sont rien de plus qu'une «introduction de couches abstraites»