** Inhaltsverzeichnis ** Ich verstehe, dass das Muster darin besteht, dem Besucher eine Schnittstelle für alle Elemente bereitzustellen und den Besucher die Verarbeitung in Bezug auf dieses Element übernehmen zu lassen.
Stellt eine Operation dar, die für ein Element in einer Objektstruktur ausgeführt wird. Mit dem Besuchermuster können Sie eine neue Operation definieren, ohne die Klasse des Objekts zu ändern, zu dem Sie die Operation hinzufügen.
・ Besucher Besucher abstrakte Klasse ・ ConcreteVisitor Besucherbetonklasse -Element Abstrakte Klasse von Elementen, die die Verarbeitung an Besucher übertragen -ConcreteElement Eine konkrete Klasse von Elementen, die die Verarbeitung an Besucher übertragen
Implementieren Sie ein Programm zum Kochen mit den vorbereiteten Zutaten.
Visitor.kt
package visitor
interface Visitor {
fun visit(e: PotatoElement)
fun visit(e: CarrotElement)
fun visit(e: PorkElement)
fun visit(e: OtherElement)
fun serve()
}
Besucher machen 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()}In einem Topf schälen, schneiden und köcheln lassen.")
}
override fun visit(e: CarrotElement) {
cookingCarrot = true
println("${e.name()}Nehmen Sie die Knospen, schälen und schneiden Sie sie und kochen Sie sie in einem Topf.")
}
override fun visit(e: PorkElement) {
cookingPork = true
println("${e.name()}In einem Topf schneiden und köcheln lassen.")
}
override fun visit(e: OtherElement) {
cookingOther = true
println("Mit Curry Mehlschwitze${e.name()}In einen Topf geben und köcheln lassen.")
}
override fun serve() {
if (cookingPotato && cookingCarrot && cookingOther && cookingPork) {
println("Abschluss des Curry!")
} else {
println("Ich koche immer noch.")
}
}
}
Materielle abstrakte Klasse
Element.kt
package visitor
interface Element {
fun name(): String
fun cooking(v: Visitor)
}
Materialbetonklassen Kartoffel
PotatoElement.kt
package visitor
class PotatoElement: Element {
override fun name(): String {
return "Kartoffel"
}
override fun cooking(v: Visitor) {
v.visit(this)
}
}
Karotte
CarrotElement.kt
package visitor
class CarrotElement: Element {
override fun name(): String {
return "Karotte"
}
override fun cooking(v: Visitor) {
v.visit(this)
}
}
Schweinefleisch
PorkElement.kt
package visitor
class PorkElement: Element {
override fun name(): String {
return "Schweinefleisch"
}
override fun cooking(v: Visitor) {
v.visit(this)
}
}
Andere
OtherElement.kt
package visitor
class OtherElement: Element {
override fun name(): String {
return "Salz und Pfeffer"
}
override fun cooking(v: Visitor) {
v.visit(this)
}
}
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]
Kartoffeln schälen, schneiden und in einem Topf köcheln lassen.
Karottenknospen nehmen, schälen, schneiden und in einem Topf köcheln lassen.
Das Schweinefleisch schneiden und in einem Topf köcheln lassen.
Ich koche immer noch.
Curry-Mehlschwitze, Salz und Pfeffer in einen Topf geben und köcheln lassen.
Abschluss des Curry!
Ich möchte gebratenes Gemüse machen, also werde ich Fried Vegetables Visitor implementieren.
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()}Schälen, schneiden und braten.")
}
override fun visit(e: CarrotElement) {
cookingCarrot = true
println("${e.name()}Nehmen Sie die Knospen, schälen und schneiden Sie und braten Sie.")
}
override fun visit(e: PorkElement) {
cookingPork = true
println("${e.name()}Schneiden und braten.")
}
override fun visit(e: OtherElement) {
cookingOther = true
println("${e.name()}In einen Topf geben und braten.")
}
override fun serve() {
if (cookingPotato && cookingCarrot && cookingOther && cookingPork) {
println("Fertigstellung von gebratenem Gemüse!")
} else {
println("Ich koche immer noch.")
}
}
}
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()
}
}
[out-put]
Kartoffeln schälen, schneiden und in einem Topf köcheln lassen.
Nehmen Sie die Karottenknospen, schälen und schneiden Sie sie und kochen Sie sie in einem Topf.
Das Schweinefleisch schneiden und in einem Topf köcheln lassen.
Ich koche immer noch.
Curry-Mehlschwitze, Salz und Pfeffer in einen Topf geben und köcheln lassen.
Abschluss des Curry!
--------------------------------
Kartoffeln schälen, schneiden und anbraten.
Karottenknospen nehmen, schälen, schneiden und braten.
Schneiden Sie das Schweinefleisch und braten Sie es.
Ich koche immer noch.
Salz und Pfeffer in einen Topf geben und anbraten.
Fertigstellung von gebratenem Gemüse!
Recommended Posts