[GO] [Viererbande] Designmuster lernen - Staat

Staat-Staat

** 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).

Zweck

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.

Komponente

・ Kontextklasse mit verschiedenen Zuständen -State State Abstract Class -ConcreteState Zustand konkrete Klasse

Implementierung

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 State abstrakte Klasse

State.kt


package state

interface State {
    fun coin(v: VendingMachine)
    fun push(v: VendingMachine)
}

ConcreteState State Betonklasse

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()
    }

}

Kontextklasse mit verschiedenen Zuständen

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
    }
}

Menschen, die verwenden

Client.kt


package state

class Client {
    init {
        val v: Context = VendingMachine()
        v.coin()
        v.push()
        v.coin()
        v.coin()
        v.push()
    }
}

Ausgabeergebnis

[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

[Viererbande] Designmuster lernen - Staat
[Viererbande] Designmuster lernen
[Viererbande] Design Pattern Learning - Singleton
[Viererbande] Designmuster lernen --Besucher
[Viererbande] Design Pattern Learning - Vermittler
[Viererbande] Designmusterlernen --Iterator
[Viererbande] Design Pattern Learning - Composite
[Viererbande] Designmuster lernen - Prototyp
[Viererbande] Designmuster lernen - Andenken
[Vierergruppe] Design Pattern Learning - Interpreter
[Viererbande] Design Pattern Learning - Builder
[Viererbande] Designmuster lernen - Brücke
[Viererbande] Designmuster lernen --Proxy
[Viererbande] Design Pattern Learning - Strategie
[Viererbande] Designmuster lernen --Adapter
[Viererbande] Design Pattern Learning - Beobachter
[Viererbande] Designmuster lernen - Befehl
[Viererbande] Designmuster lernen - Fluggewicht
[Viererbande] Designmusterlernen - Abstract Factory
[Viererbande] Designmuster lernen - Fabrikmethode
[Viererbande] Designmuster lernen - Kette der Verantwortung
[Viererbande] Design Pattern Learning - Template-Methode
Gang of Four (GoF) -Muster in Python
Lernen Sie das Entwurfsmuster "State" in Python
Entwurfsmuster #Builder
Entwurfsmuster #Adapter
Lernen der Mustererkennung im Video Teil 1 Bereich der Mustererkennung
Entwurfsmuster #Observer
Entwurfsmuster #Facade
Entwurfsmuster #Strategie
Entwurfsmuster #Singleton
Entwurfsmuster #Proxy
Entwurfsmuster #Factory-Methode
Deep Learning 1 Übung des Deep Learning
Entwurfsmuster # Template-Methode
Die Geschichte, dass GoF-Designmuster nichts anderes sind als "Einführung abstrakter Ebenen"