El Patrón de Diseño “State” tiene como tarea principal alterar el comportamiento de un objeto cuando su estado interno cambia, por lo tanto, es útil cuando queremos tener acciones diferentes según el estado que estemos monitoreando en tiempo de ejecución.

Partes

Contexto

  • Contiene una referencia del estado actual del objeto
  • Permite la solicitud de cambio del estado
class Context {
    private var state: State

    init(state: State) {
        self.state = state
    }

    func setState(state: State) {
        self.state = state
    }

    func processAction() {
        state.action(context: self)
    }
}

Estado

  • Define la interfaz que engloba el comportamiento del objeto de acuerdo al estado en el contexto
protocol State {
    func action(context: Context)
}

Estado concreto

  • Implementación de los diferentes comportamientos acorde al estado en el contexto
  • Cada estado tiene su propia implementación de acuerdo al contexto
class ConcreteStateA: State {
    func action(context: Context) {
        print(“Acciones o procesos A”)
        context.setState(state: ConcreteStateB())
    }
}

class ConcreteStateB: State {
    func action(context: Context) {
        print(“Acciones o procesos B”)
        context.setState(state: ConcreteStateA())
    }
}

Uso

let context = Context(state: ConcreteStateA())
context.action() // Hace acciones del context A y cambia a ConcreteState B
context.action() // Hace acciones del context B y cambia a ConcreteState A
VentajasDesventajas
– Encapsulación del comportamiento del estado en una clase
– Favorece el mantenimiento y la extensión del código ya que se deben realizar en sus clases correspondientes
– Las acciones de cada estado son independientes
– Reduce las condiciones complejas
Aumenta la cantidad de clases que representan diferentes estados y transiciones
Puede existir una dependencia entre el contexto y los estados concretos
Mayor cantidad de estados y transiciones lo pueden volver más complejo de implementar y entender
Share:

Leave a reply

Your email address will not be published. Required fields are marked *