[GO] [Gang of Four] Apprentissage des modèles de conception - État

État-État

** Table des matières **

Je pense que vous avez souvent une propriété qui gère l'état comme XXXStatus, et l'implémente comme switch (XXXStatus) {// effectuer divers traitements par cas}. Au fur et à mesure que le nombre d'états augmente, l'instruction switch continuera pendant longtemps et il sera difficile pour le lecteur de la lire, mais je pense que le but de ce modèle est de faire de chaque état un objet pour le rendre plus intelligent. Je vais. Je pense que c'est similaire au modèle de commande (https://qiita.com/takumi0620/items/f7f755a4fe0d1dbfd153).

Objectif

Fait changer le comportement de l'objet lorsque son état interne change. Ceci est réalisé en introduisant un objet qui représente l'état sans décrire le changement de comportement au sein de la classe.

Composant

・ Classe de contexte avec différents états -Classe abstraite d'état d'état -ConcreteState classe de béton d'état

la mise en oeuvre

Nous mettrons en place un distributeur automatique. Il y a deux états et deux opérations du distributeur automatique à installer, et le prix du produit est uniformément de 100 yens. Statut ・ Le montant inférieur au prix du produit a été déposé. ・ Le montant d'argent qui dépasse le prix du produit a été déposé.

opération · Faire un dépôt. ・ Appuyez sur le bouton du produit.

Classe abstraite d'état d'état

State.kt


package state

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

ConcreteState State classe de béton

Une classe qui représente l'état dans lequel un montant inférieur au prix de l'article a été déposé

LackState.kt


package state

class LackState: State {
    override fun coin(v: VendingMachine) {
        v.insertMoney(50)
    }

    override fun push(v: VendingMachine) {
        v.errorMessage()
    }
}

Classes où le montant d'argent supérieur au prix de l'article est déposé

SufficientState.kt


package state

class SufficientState: State {
    override fun coin(v: VendingMachine) {
        v.warningMessage()
    }

    override fun push(v: VendingMachine) {
        v.buy()
    }

}

Classe de contexte avec différents états

Classe abstraite

Context.kt


package state

interface Context {
    fun coin()
    fun push()
}

Classe de béton de distributeur automatique

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("Aucun autre dépôt n'est requis.")
    }

    fun errorMessage() {
        println("Le montant requis n'a pas été saisi.")
    }

    fun insertMoney(m: Int) {
        println("J'ai mis de l'argent.")
        money += m
        if (money >= 100) {
            state = sufficient
        }
    }

    fun buy() {
        println("Veuillez sortir la boisson de la prise.")
        state = lack
    }
}

Les personnes qui utilisent

Client.kt


package state

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

Résultat de sortie

[out-put]
J'ai mis l'argent.
Le montant requis n'a pas été saisi.
J'ai mis l'argent.
Aucun autre dépôt n'est requis.
Veuillez sortir la boisson de la prise.

Je pense qu'il serait préférable d'implémenter la classe Factory, qui crée une instance de la classe VendingMachine de type Context.

Recommended Posts

[Gang of Four] Apprentissage des modèles de conception - État
[Gang of Four] Apprentissage des modèles de conception
[Gang of Four] Apprentissage des modèles de conception --Singleton
[Gang of Four] Apprentissage des modèles de conception - Visiteur
[Gang of Four] Apprentissage des modèles de conception - Médiateur
[Gang of Four] Apprentissage des modèles de conception - Itérateur
[Gang of Four] Apprentissage des modèles de conception - Composite
[Gang of Four] Apprentissage des modèles de conception - Prototype
[Gang of Four] Apprentissage des modèles de conception --Mémento
[Gang of Four] Apprentissage des modèles de conception - Interprétation
[Gang of Four] Apprentissage des modèles de conception - Constructeur
[Gang of Four] Apprentissage des modèles de conception - Pont
[Gang of Four] Apprentissage des modèles de conception - Proxy
[Gang of Four] Apprentissage des modèles de conception - Stratégie
[Gang of Four] Apprentissage des modèles de conception - Adaptateur
[Gang of Four] Apprentissage des modèles de conception --Observer
[Gang of Four] Apprentissage des modèles de conception - Commande
[Gang of Four] Apprentissage des modèles de conception - Poids du vol
[Gang of Four] Apprentissage des modèles de conception - Usine abstraite
[Gang of Four] Apprentissage des modèles de conception - Méthode d'usine
[Gang of Four] Apprentissage des modèles de conception - Chaîne de responsabilité
[Gang of Four] Apprentissage des modèles de conception - Méthode du modèle
Modèles Gang of Four (GoF) en Python
Apprenez le modèle de conception "État" en Python
Modèle de conception #Builder
Modèle de conception #Adapter
Apprentissage de la reconnaissance de formes en vidéo Partie 1 Champ de reconnaissance de formes
Modèle de conception #Observer
Modèle de conception #Facade
Modèle de conception #Strategy
Modèle de conception #Singleton
Modèle de conception #Proxy
Design Pattern #Factory, méthode
Deep learning 1 Pratique du deep learning
Design Pattern #Template, méthode
L'histoire selon laquelle les modèles de conception du GoF ne sont rien de plus qu'une «introduction de couches abstraites»