** 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.
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.
・ Classe abstraite de médiateur ・ Classe de béton ConcreteMediator ・ Objets Collegeague que vous souhaitez associer à divers objets
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.
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.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
}
}
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")
}
}
}
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()
}
}
[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