El patrón de estado es un patrón de diseño de software de comportamiento que permite que un objeto altere su comportamiento cuando cambia su estado interno. Este patrón se acerca al concepto de máquinas de estados finitos . El patrón de estado se puede interpretar como un patrón de estrategia , que puede cambiar una estrategia a través de invocaciones de métodos definidos en la interfaz del patrón.
El patrón de estado se utiliza en la programación de computadoras para encapsular el comportamiento variable del mismo objeto , según su estado interno. Esta puede ser una forma más limpia para que un objeto cambie su comportamiento en tiempo de ejecución sin recurrir a declaraciones condicionales y así mejorar la mantenibilidad. [1] : 395
Descripción general
El patrón de diseño estatal es uno de los veintitrés patrones de diseño documentados por la Banda de los Cuatro que describen cómo resolver problemas de diseño recurrentes. Estos problemas abarcan el diseño de software orientado a objetos flexible y reutilizable, como los objetos que son fáciles de implementar, cambiar, probar y reutilizar. [3]
El patrón de estado está configurado para resolver dos problemas principales: [4]
- Un objeto debe cambiar su comportamiento cuando cambia su estado interno.
- El comportamiento específico del estado debe definirse de forma independiente. Es decir, agregar nuevos estados no debería afectar el comportamiento de los estados existentes.
La implementación de un comportamiento específico del estado directamente dentro de una clase es inflexible porque compromete a la clase con un comportamiento particular y hace que sea imposible agregar un nuevo estado o cambiar el comportamiento de un estado existente más adelante independientemente de (sin cambiar) la clase. En esto, el patrón describe dos soluciones:
- Defina objetos (estado) separados que encapsulen el comportamiento específico del estado para cada estado. Es decir, defina una interfaz (estado) para realizar un comportamiento específico del estado y defina clases que implementen la interfaz para cada estado.
- Una clase delega el comportamiento específico del estado a su objeto de estado actual en lugar de implementar el comportamiento específico del estado directamente.
Esto hace que una clase sea independiente de cómo se implementa el comportamiento específico del estado. Se pueden agregar nuevos estados definiendo nuevas clases de estados. Una clase puede cambiar su comportamiento en tiempo de ejecución cambiando su objeto de estado actual.
Estructura
En el diagrama de clases del Lenguaje de modelado unificado (UML) adjunto , la Context
clase no implementa directamente el comportamiento específico del estado. En cambio, se Context
refiere a la State
interfaz para realizar el comportamiento específico del estado ( state.operation()
), lo que lo hace Context
independiente de cómo se implementa el comportamiento específico del estado. Las clases State1
y State2
implementan la State
interfaz, es decir, implementan (encapsulan) el comportamiento específico del estado para cada estado. El diagrama de secuencia de UML muestra las interacciones en tiempo de ejecución:
El Context
objeto delega el comportamiento específico del estado a diferentes State
objetos. En primer lugar, Context
las llamadas operation(this)
en su actual (inicial) objeto de estado ( State1
), que realiza la operación y las llamadas setState(State2)
en Context
que el estado actual del contexto de cambio a State2
. La próxima vez, Context
vuelve a llamar operation(this)
a su objeto de estado actual ( State2
), que realiza la operación y cambia el estado actual del contexto a State1
.
Ejemplo
Java
La interfaz de estado y dos implementaciones. El método del estado tiene una referencia al objeto de contexto y puede cambiar su estado.
interfaz State { void writeName ( contexto StateContext , nombre de cadena ); } class LowerCaseState implementa State { @Override public void writeName ( contexto StateContext , String name ) { System . fuera . println ( nombre . toLowerCase ()); contexto . setState ( new MultipleUpperCaseState ()); } } class MultipleUpperCaseState implementa State { / * Contador local para este estado * / private int count = 0 ; @Override public void writeName ( contexto StateContext , nombre de cadena ) { System . fuera . println ( nombre . toUpperCase ()); / * Cambiar el estado después de que se invoca dos veces el writeName () de StateMultipleUpperCase * / if ( ++ count > 1 ) { context . setState ( nuevo LowerCaseState ()); } } }
La clase de contexto tiene una variable de estado que instancia en un estado inicial, en este caso LowerCaseState
. En su método, utiliza los métodos correspondientes del objeto de estado.
class StateContext { estado privado del estado ; public StateContext () { estado = nuevo LowerCaseState (); } / ** * Establece el estado actual. * Normalmente solo lo llaman las clases que implementan la interfaz de estado. * @param newState el nuevo estado de este contexto * / void setState ( State newState ) { state = newState ; } public void writeName ( nombre de cadena ) { estado . writeName ( este , nombre ); } }
La siguiente demostración muestra el uso:
StateDemo public class { public static void main ( String [] args ) { StateContext context = new StateContext (); contexto . writeName ( "Lunes" ); contexto . writeName ( "martes" ); contexto . writeName ( "miércoles" ); contexto . writeName ( "jueves" ); contexto . writeName ( "viernes" ); contexto . writeName ( "sábado" ); contexto . writeName ( "Domingo" ); } }
Con el código anterior, la salida de main()
from StateDemo
es:
lunes MARTES MIÉRCOLES jueves VIERNES SÁBADO domingo
Referencias
- ↑ a b Erich Gamma , Richard Helm , Ralph Johnson , John M. Vlissides (1995). Patrones de diseño: elementos de software orientado a objetos reutilizable . Addison-Wesley . ISBN 0-201-63361-2.Mantenimiento de CS1: utiliza el parámetro de autores ( enlace )
- ^ "El patrón de diseño del Estado - Estructura y Colaboración" . w3sDesign.com . Consultado el 12 de agosto de 2017 .
- ^ Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides (1994). Patrones de diseño: elementos de software orientado a objetos reutilizable . Addison Wesley. págs. 305ff . ISBN 0-201-63361-2.CS1 maint: varios nombres: lista de autores ( enlace )
- ^ "El patrón de diseño del estado: problema, solución y aplicabilidad" . w3sDesign.com . Consultado el 12 de agosto de 2017 .