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
Ventajas | Desventajas |
– 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 |