** Inhaltsverzeichnis **
Ich denke, dass Sie oft eine Eigenschaft haben, die den Status wie "XXXStatus" verwaltet und wie "switch (XXXStatus) {// verschiedene Verarbeitungen nach Fall durchführen}" implementiert. Ich denke, dass der Zweck dieses Musters darin besteht, jeden Zustand zu einem Objekt zu machen, so dass die switch-Anweisung für eine lange Zeit fortgesetzt wird und es für den Leser schwierig sein wird, sie zu lesen, wenn die Anzahl der Zustände zunimmt. Ich werde. Ich denke, es ähnelt dem Befehlsmuster (https://qiita.com/takumi0620/items/f7f755a4fe0d1dbfd153).
Bewirkt, dass das Objekt sein Verhalten ändert, wenn sich der interne Status des Objekts ändert. In der Klasse wird dies erreicht, indem ein Objekt eingeführt wird, das den Zustand darstellt, ohne die Verhaltensänderung zu beschreiben.
・ Kontextklasse mit verschiedenen Zuständen -State State Abstract Class -ConcreteState Zustand konkrete Klasse
Wir werden einen Automaten implementieren. Es gibt zwei Zustände und zwei Operationen des zu installierenden Automaten, und der Preis des Produkts beträgt einheitlich 100 Yen. Status ・ Der Betrag, der unter dem Preis des Produkts liegt, wurde hinterlegt. ・ Der Geldbetrag, der den Preis des Produkts übersteigt, wurde hinterlegt.
Operation ・ Machen Sie eine Einzahlung. ・ Drücken Sie die Produkttaste.
State.kt
package state
interface State {
fun coin(v: VendingMachine)
fun push(v: VendingMachine)
}
Eine Klasse, die den Zustand darstellt, in dem ein Betrag hinterlegt wurde, der unter dem Preis des Artikels liegt
LackState.kt
package state
class LackState: State {
override fun coin(v: VendingMachine) {
v.insertMoney(50)
}
override fun push(v: VendingMachine) {
v.errorMessage()
}
}
Klassen, in denen der Geldbetrag über dem Preis des Artikels hinterlegt wird
SufficientState.kt
package state
class SufficientState: State {
override fun coin(v: VendingMachine) {
v.warningMessage()
}
override fun push(v: VendingMachine) {
v.buy()
}
}
Abstrakte Klasse
Context.kt
package state
interface Context {
fun coin()
fun push()
}
Automatenbetonklasse
VendingMachine.kt
package state
class VendingMachine: Context {
companion object {
private val lack = LackState()
private val sufficient = SufficientState()
}
private var state: State = lack
private var money = 0
override fun coin() {
state.coin(this)
}
override fun push() {
state.push(this)
}
fun warningMessage() {
println("Es ist keine weitere Anzahlung erforderlich.")
}
fun errorMessage() {
println("Der erforderliche Betrag wurde nicht eingegeben.")
}
fun insertMoney(m: Int) {
println("Ich habe das Geld investiert.")
money += m
if (money >= 100) {
state = sufficient
}
}
fun buy() {
println("Bitte nehmen Sie das Getränk aus der Steckdose.")
state = lack
}
}
Client.kt
package state
class Client {
init {
val v: Context = VendingMachine()
v.coin()
v.push()
v.coin()
v.coin()
v.push()
}
}
[out-put]
Ich habe das Geld investiert.
Der erforderliche Betrag wurde nicht eingegeben.
Ich habe das Geld investiert.
Es ist keine weitere Anzahlung erforderlich.
Bitte nehmen Sie das Getränk aus der Steckdose.
Ich denke, es wäre besser, die Klasse "Factory" zu implementieren, die eine Instanz der Klasse "VendingMachine" vom Typ "Context" erstellt.
Recommended Posts