State
Propósito
- Un estado orientado a objetos.
- Un Wrapper + el objeto envuelto por el Wrapper + colaboración.
También conocido como: Objetcs for States.
Motivación
Permite que un objeto modifique su comportamiento cada vez que cambie su estado interno. Parecerá que cambia la clase del objeto.
Aplicabilidad
- Aplicaciones cuyos componentes cambian de estado de forma dinámica durante su ejecución.
- Aplicaciones con grandes condicionales dependientes del estado de un objeto.
Estructura
Participantes
Context
- Define interfaz y mantiene una instancia con el estado actual
State
- Define interfaz para el comportamiento asociado a un determinado estado del Contexto.
Subclases Concrete State
- Cada subclase implementa el comportamiento asociado con un estado del contexto.
Consecuencias
Localiza el comportamiento dependiente del estado y divide dicho comportamiento en diferentes estados. Las transiciones entre estados no residen en sentencias if o swtich monolíticas, sino que se reparte entre las subclases.
Hace explícitas las transiciones entre estados. Introducir objetos separados para los diferentes estados hace que las transiciones sean más explícitas.
Los objetos Estado pueden compartirse.
Implementación
Al momento de implementar el patrón State debemos tener en cuenta:
- No queda claro quien define las transiciones entre estados.
- Una alternativa basada en tablas.
- Crear y destruir objetos estados.
- Usar herencia dinámica (sólo permitido en algunos lenguajes de programación (self) )
Código de ejemplo
Imaginemos que vamos a un banco y cuando llegamos nos colocamos en la fila de mostrador: si la misma esta abierta, seguiremos en la fila. En cambio, si esta cerrada nos colocaremos en otra fila o tomaremos alguna decisión acorde. Por otro lado, si vemos un cartel que dice "enseguida vuelvo" quizás tenemos que contemplar el tiempo disponible que tenemos. Es decir, para nosotros, el comportamiento de un banco cambia radicalmente según el estado en el que se encuentre. Para estas ocasiones, es ideal el uso de un patrón de estados.
El banco publica un método llamado atende() pero en realidad la atención la realiza la ventanilla.
La ventanilla cambia su comportamiento según el estado en que se encuentre. Por ejemplo, si esta cerrada, no hay atención directamente. Por eso mismo, delega el método de atención a su estado y es este mismo estado quién toma la decisión de atender o no.
Usos conocidos
- Conexión TCP. Clase abstracta “Estado TCP” y derivan los diferentes estados de la conexión.
- Herramientas de dibujo. Clase abstracta “herramienta” y derivan los diferentes tipos de herramientas.
Patrones relacionados
- Flyweight
- Singleton
Referencias
- Design Patterns Elements of Reusable Object-Oriented Software, GoF.
- http://dmi.uib.es/~yuhua/APOO07-08/Presentation/Bridge-State.pdf
- http://kybele.escet.urjc.es/documentos/SI/Patrones/20_State.ppt
- http://www.ldc.usb.ve/~mgoncalves/IS2/sd07/grupo3.pdf
No hay comentarios:
Publicar un comentario