Implementación State Pattern - lenoryv/Design-Patterns GitHub Wiki
Tomemos un escenario de ejemplo usando un móvil. Con respecto a las alertas, un móvil puede estar en diferentes estados. Por ejemplo, vibración y silencio. Según este estado de alerta, el comportamiento del móvil cambia cuando se debe realizar una alerta. Cuál es un escenario adecuado para el patrón de diseño estatal.
El código completo para el patrón State en Kotlin:
MobileAlertState: Esta interfaz representa los diferentes estados involucrados. Todos los estados deben implementar esta interfaz.
interface MobileAlertState {
fun alert(ctx: AlertStateContext)
}
AlertStateContext: esta clase mantiene el estado actual y es el núcleo del patrón de diseño del estado. Un cliente debe acceder / ejecutar toda la configuración a través de esta clase.
class AlertStateContext {
private var currentState: MobileAlertState? = null
init {
currentState = Vibration()
}
fun setState(state: MobileAlertState) {
currentState = state
}
fun alert() {
currentState!!.alert(this)
}
}
Vibración (State1): Representación de un estado que implementa el objeto de estado abstracto. Similar a esto tenemos clases de Silencio y Sonido
class Vibration : MobileAlertState {
override fun alert(ctx: AlertStateContext) {
println("vibration...")
}
}
class Silent : MobileAlertState {
override fun alert(ctx: AlertStateContext) {
println("silent...")
}
}
class Sound : MobileAlertState {
override fun alert(ctx: AlertStateContext) {
println("tu..tu..tu..tu")
}
}
fun main(args: Array<String>) {
val stateContext = AlertStateContext()
stateContext.alert()
stateContext.alert()
stateContext.setState(Silent())
stateContext.alert()
stateContext.alert()
stateContext.setState(Sound())
stateContext.alert()
}