** 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).
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.
・ Classe de contexte avec différents états -Classe abstraite d'état d'état -ConcreteState classe de béton d'état
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.
State.kt
package state
interface State {
fun coin(v: VendingMachine)
fun push(v: VendingMachine)
}
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 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
}
}
Client.kt
package state
class Client {
init {
val v: Context = VendingMachine()
v.coin()
v.push()
v.coin()
v.coin()
v.push()
}
}
[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