Patrón de diseño de estado

El patrón de estado es uno de los patrones de diseño de comportamiento . El patrón de diseño de estado se usa cuando un objeto cambia su comportamiento en función de su estado interno.

Si tenemos que cambiar el comportamiento de un objeto en función de su estado, podemos tener una variable de estado en el Objeto y usar el bloque de condición if-else para realizar diferentes acciones en función del estado. El patrón de estado se utiliza para proporcionar una forma sistemática y sin acoplamiento para lograr esto a través de implementaciones de contexto y estado.

Diagrama UML del patrón de diseño de estado

State-Design-Pattern

  • Contexto: Define una interfaz para que el cliente interactúe. Mantiene referencias a objetos de estado concreto que pueden usarse para definir el estado actual del objeto.
  • Estado: Define la interfaz para declarar lo que debe hacer cada estado concreto.
  • ConcreteState: Proporciona implementación para métodos definidos en State.

Ejemplo de patrón de diseño de estado
En el siguiente ejemplo, hemos implementado un escenario de estado móvil. Con respecto a las alertas, un móvil puede estar en diferentes estados. Por ejemplo, vibración y silencio. En función de este estado de alerta, el comportamiento del móvil cambia cuando se debe realizar una alerta.

// Java program to demonstrate working of
// State Design Pattern
  
interface MobileAlertState 
{
    public void alert(AlertStateContext ctx);
}
  
class AlertStateContext 
{
    private MobileAlertState currentState;
  
    public AlertStateContext() 
    {
        currentState = new Vibration();
    }
  
    public void setState(MobileAlertState state) 
    {
        currentState = state;
    }
  
    public void alert() 
    {
        currentState.alert(this);
    }
}
  
class Vibration implements MobileAlertState 
{
    @Override
    public void alert(AlertStateContext ctx) 
    {
         System.out.println("vibration...");
    }
  
}
  
class Silent implements MobileAlertState
{
    @Override
    public void alert(AlertStateContext ctx) 
    {
        System.out.println("silent...");
    }
  
}
  
class StatePattern 
{
    public static void main(String[] args) 
    {
        AlertStateContext stateContext = new AlertStateContext();
        stateContext.alert();
        stateContext.alert();
        stateContext.setState(new Silent());
        stateContext.alert();
        stateContext.alert();
        stateContext.alert();        
    }
}

Producción:

vibration...
vibration...
silent...
silent...
silent...

Ventajas del patrón de diseño de estado

  • Con el patrón de estado, los beneficios de implementar un comportamiento polimórfico son evidentes y también es más fácil agregar estados para admitir un comportamiento adicional.
  • En el patrón de diseño State, el comportamiento de un objeto es el resultado de la función de su estado, y el comportamiento cambia en tiempo de ejecución dependiendo del estado. Esto elimina la dependencia de la lógica condicional if/else o switch/case. Por ejemplo, en el escenario del control remoto del televisor, también podríamos haber implementado el comportamiento simplemente escribiendo una clase y un método que solicitará un parámetro y realizará una acción (encender/apagar el televisor) con un bloque if/else.
  • El patrón de diseño State también mejora Cohesion ya que los comportamientos específicos del estado se agregan a las clases ConcreteState, que se colocan en una ubicación en el código.

Desventajas del patrón de diseño estatal

  • El patrón de diseño de estado se puede usar cuando necesitamos cambiar el estado del objeto en tiempo de ejecución ingresando en él diferentes subclases de alguna clase base de estado. Esta circunstancia es ventaja y desventaja a la vez, porque tenemos un Estado claramente separado de clases con cierta lógica y por otro lado crece el número de clases.

Lectura adicional: método de estado en Python

Este artículo es una contribución de Saket Kumar . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *