** Inhaltsverzeichnis ** Wie der Name schon sagt, dient dieses Muster dazu, die Beziehungen zwischen Objekten durch die Mediatorklasse zu beseitigen.
Wir sehen oft, dass Spezifikationen wie die Schaltfläche nur aktiviert werden, wenn das Textfeld einen Wert enthält. Dies kann nur erreicht werden, wenn das Textfeldobjekt das Schaltflächenobjekt kennt (und es als Instanzvariable enthält). Mit solch einer einfachen Spezifikation ist es möglicherweise kein Problem, wenn es in direktem Zusammenhang steht, aber für kompliziertere Funktionen muss eine Klasse eine Reihe von Objekten kennen. Beseitigen Sie es mit der Zwischenklasse.
Schließlich führt jedes Muster zu einer erhöhten Orthogonalität.
Definieren Sie ein Objekt, das die Interaktion einer Gruppe von Objekten kapselt. Das Mediator-Muster verringert den Kopplungsgrad, indem verhindert wird, dass Objekte explizit aufeinander verweisen. Dadurch kann die Interaktion von Objekten unabhängig voneinander geändert werden.
・ Mediator Mediator abstrakte Klasse ・ ConcreteMediator-Betonklasse ・ Collegeague-Objekte, die Sie verschiedenen Objekten zuordnen möchten
Implementiert Kontrollkästchen, Textfelder und Schaltflächenobjekte. Textfelder können nur eingegeben werden, wenn eines der Kontrollkästchen aktiviert ist. Die Schaltfläche kann nur gedrückt werden, wenn das Kontrollkästchen aktiviert und das Textfeld leer ist.
Mediator.kt
package mediator
interface Mediator {
/**
*Ob die Taste gedrückt werden kann
*/
fun buttonPress(): Boolean
/**
*Gibt an, ob ein Textfeld eingegeben werden kann
*/
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
}
}
Abstrakte Klasse
Colleague.kt
package mediator
interface Colleague {
enum class Type {
CheckBox,
TextBox,
Button
}
val type: Type
val mediator: Mediator
}
Konkrete Klasse · Kontrollkästchen
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
}
}
·Textfeld
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("Erfolgreiche Eingabe in ein Textfeld")
} else {
println("Fehler bei der Eingabe des Textfelds")
}
}
}
·Taste
Button.kt
package mediator
class Button(override val mediator: Mediator): Colleague {
override val type = Colleague.Type.Button
fun press() {
if (mediator.buttonPress()) {
println("Tastendruck erfolgreich")
} else {
println("Fehler beim Drücken der Taste")
}
}
}
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
//Die Eingabe des Textfelds ist fehlgeschlagen, da das Kontrollkästchen nicht aktiviert ist
textBox.input("Yamada Taro")
//Auswahl der Kontrollkästchen
checkBox.select(CheckBox.Sex.Female)
//Drücken Sie die Taste Fehler, da kein Textfeld eingegeben wurde
button.press()
//Textfeldeingabe erfolgreich!!!
textBox.input("Hanako Yamada")
//Tastendruck erfolgreich!!!
button.press()
}
}
[out-put]
Fehler bei der Eingabe des Textfelds
Fehler beim Drücken der Taste
Erfolgreiche Eingabe in ein Textfeld
Tastendruck erfolgreich
das ist alles
Recommended Posts