Patrón de Estado

En el patrón de estado (State Pattern), el comportamiento de una clase cambia según su estado. Este tipo de patrón de diseño pertenece a los patrones de comportamiento.

En el patrón de estado, creamos objetos que representan varios estados y un objeto context cuyo comportamiento cambia según el objeto de estado.

El patrón de estado permite que un objeto cambie su comportamiento cuando su estado interno cambia, de modo que el objeto tenga diferentes comportamientos en diferentes estados. Al encapsular cada estado en una clase independiente, se evita el uso de una gran cantidad de declaraciones condicionales para realizar transiciones de estado.

Introducción

Intención

Permitir que un objeto cambie su comportamiento cuando su estado interno cambia, como si hubiera cambiado su clase.

Problemas que resuelve principalmente

  • El patrón de estado resuelve el problema de que el comportamiento de un objeto depende de su estado, permitiendo que el objeto cambie de comportamiento cuando su estado cambia.

Escenarios de uso

  • Cuando hay muchas declaraciones condicionales en el código y estas dependen del estado del objeto.

Forma de implementación

  • Definir la interfaz de estado: declarar uno o más métodos para encapsular el comportamiento del estado concreto.
  • Crear clases de estado concretas: implementar la interfaz de estado y proporcionar comportamientos específicos según el estado.
  • Definir la clase de contexto: contener una referencia al objeto de estado y actualizar su comportamiento cuando cambia el estado.

Código clave

  • Interfaz de estado: declarar métodos de comportamiento.
  • Clases de estado concretas: implementar la interfaz de estado y encapsular comportamientos específicos.
  • Clase de contexto: mantener un objeto de estado y proporcionar métodos para cambiar su estado.

Ejemplos de aplicación

  • Estado de un jugador de baloncesto: el jugador puede tener estados como normal, anormal y excepcional.
  • Campanas bianzhong de Zeng Hou Yi: las campanas bianzhong actúan como contexto; diferentes campanas (estados) producen diferentes efectos de interpretación.

Ventajas

  • Encapsular las reglas de transición de estados: encapsular la lógica de transición de estados dentro de los objetos de estado.
  • Fácil de extender: agregar nuevas clases de estado no afecta el código existente.
  • Concentrar los comportamientos relacionados con el estado: concentrar todos los comportamientos relacionados con un estado específico en una sola clase.
  • Simplificar las declaraciones condicionales: evitar el uso de gran cantidad de declaraciones condicionales para cambiar de comportamiento.
  • Compartir estados: permitir que múltiples objetos de contexto compartan el mismo objeto de estado.

Desventajas

  • Aumenta el número de clases y objetos: cada estado requiere una clase de estado concreta.
  • Implementación compleja: la estructura y la implementación del patrón son relativamente complejas.
  • Soporte insuficiente del principio abierto/cerrado: agregar un nuevo estado o modificar el comportamiento de un estado puede requerir modificar el código existente.

Recomendaciones de uso

  • Cuando el comportamiento de un objeto cambia según su estado, considere usar el patrón de estado.
  • El patrón de estado es adecuado para reemplazar declaraciones condicionales o de ramificación complejas.

Notas

  • El patrón de estado es adecuado para casos con un número limitado de estados (generalmente no más de 5).
  • Úselo con precaución para evitar que el sistema se vuelva demasiado complejo.

Estructura

El patrón de estado incluye los siguientes roles principales:

  • Contexto (Context): define la interfaz que le interesa al cliente y mantiene una referencia al objeto de estado actual. El contexto puede delegar el manejo de comportamientos relacionados con el estado a través del objeto de estado.

  • Estado (State): define una interfaz para encapsular el comportamiento de un estado relacionado con el contexto.

  • Estado concreto (Concrete State): implementa la interfaz de estado y se encarga de manejar los comportamientos relacionados con ese estado. El objeto de estado concreto generalmente mantiene internamente una referencia al objeto de contexto para poder cambiar a diferentes estados según diferentes condiciones.

Implementación

Vamos a crear unaStateinterfaz y clases de entidad que implementan laStateinterfaz de estado.Contextes una clase que tiene un estado particular.

StatePatternDemo, nuestra clase de demostración utilizaContexty objetos de estado para demostrar el cambio de comportamiento del Context cuando cambia de estado.

状态模式的 UML 图

Paso 1

Crear una interfaz.

State.java

public interface State { public void doAction(Context context); }

Paso 2

Crear clases de entidad que implementen la interfaz.

StartState.java

public class StartState implements State { public void doAction(Context context) { System.out.println("Player is in start state"); context.setState(this); } public String toString(){ return "Start State"; } }

StopState.java

public class StopState implements State { public void doAction(Context context) { System.out.println("Player is in stop state"); context.setState(this); } public String toString(){ return "Stop State"; } }

Paso 3

Crear laContextclase.

Context.java

public class Context { private State state; public Context(){ state = null; } public void setState(State state){ this.state = state; } public State getState(){ return state; } }

Paso 4

UsarContextpara ver el cambio de comportamiento cuando el estadoStatecambia.

StatePatternDemo.java

public class StatePatternDemo { public static void main(String[] args) { Context context = new Context(); StartState startState = new StartState(); startState.doAction(context); System.out.println(context.getState().toString()); StopState stopState = new StopState(); stopState.doAction(context); System.out.println(context.getState().toString()); } }

Paso 5

Ejecutar el programa y ver el resultado:

Player is in start state
Start State
Player is in stop state
Stop State

Más artículos

Otras extensiones