** Inhaltsverzeichnis ** Plötzlich geht die Geschichte schief, aber wenn ich Bücher über Designmuster und Objektorientierung lese, höre ich oft die Worte ** Verantwortung ** und ** Verantwortung ** für Objekte. Dies zeigt, was das Objekt tun muss. Es gibt auch das Prinzip der Einzelverantwortung, das besagt, dass es einen Grund geben sollte, die Klassen zu wechseln.
Die folgenden Klassen haben beispielsweise zwei Gründe, Änderungen vorzunehmen.
Bildschirmberechnung.kt
Berechnung des Schnittstellenbildschirms{
Spaß beim Zeichnen(): Boolean
lustige Ergänzung(num1: Int, num2: Int): Int
}
Nach dem Prinzip der Einzelverantwortung sollte es wie folgt getrennt werden.
Bildschirm.kt
Schnittstellenbildschirm{
Spaß beim Zeichnen(): Boolean
lustiger Bildschirmübergang(): Boolean
}
Berechnung.kt
Schnittstellenberechnung{
lustige Ergänzung(num1: Int, num2: Int): Int
lustige Subtraktion(num2: Int, num2: Int): Int
}
Ich verstehe, dass dieses Prinzip der Einzelverantwortung auch eine Idee ist, flexibel auf Veränderungen zu reagieren. Das ist alles für die Nebengeschichte.
Dann besteht das Hauptthema darin, dem Zweck dynamisch Verantwortung hinzuzufügen. Es handelt sich also um ein Muster, das Objekten (Instanzen) zu einem beliebigen Zeitpunkt Funktionen hinzufügt, ohne Vererbung zu verwenden.
Fügen Sie dem Objekt dynamisch Verantwortlichkeiten hinzu. Das Decorator-Muster bietet eine flexiblere Erweiterungsmethode als die Unterklasse.
· Komponente Eine abstrakte Klasse, die eine Schnittstelle definiert, die dynamisch Verantwortlichkeiten hinzufügen kann -ConcreteComponent Komponentenklasse Betonklasse Eine abstrakte Klasse, die eine Schnittstelle definiert, die der Decorator Component-Klasse Verantwortung hinzufügt ・ Betonklasse der Klasse Concrete Decorator Decorator
Implementieren Sie ein Programm, das zum Zeitpunkt der Erstellung einer Textansichtsinstanz verschiedene Funktionen hinzufügen kann.
Komponentenschnittstelle anzeigen
ViewComponent.kt
package decorator
interface ViewComponent {
fun draw()
}
Textvorschau
TextView.kt
package decorator
class TextView: ViewComponent {
override fun draw() {
print("[Textvorschau]")
}
}
Dekorateur, um einen Schatten zu werfen
ShadowDecorator.kt
package decorator
class ShadowDecorator(viewComponent: ViewComponent): ViewComponent {
val viewComponent = viewComponent
override fun draw() {
viewComponent.draw()
addShadow()
}
private fun addShadow() {
print(": Mit Schatten")
}
}
Dekorateur zum Scrollen
ScrollDecorator.kt
package decorator
class ScrollDecorator(viewComponent: ViewComponent): ViewComponent {
val viewComponent = viewComponent
override fun draw() {
viewComponent.draw()
addScroll()
}
private fun addScroll() {
print(": Bildlauffähig")
}
}
Alle Teile sind fertig. Lass es uns benutzen.
** Nutzer **
ComponentManager.kt
package decorator
class ComponentManager {
init {
//Bildlaufbare schattierte Textansicht
val scrollShadowTextView = ScrollDecorator(ShadowDecorator(TextView()))
//Bildlaufbare Textansicht
val scrollTextView = ScrollDecorator(TextView())
//Zeichnung
scrollShadowTextView.draw()
print("\n")
scrollTextView.draw()
}
}
Bei der Ausführung ist dies wie folgt.
[output]
[Textansicht]: Schatten: Bildlauffähig
[Textansicht]: Bildlauffähig
Recommended Posts