PDF de programación - Estudio de caso: El patrón de diseño State

Estudio de caso: El patrón de diseño Stategráfica de visualizaciones

Publicado el 14 de Enero del 2017
607 visualizaciones desde el 14 de Enero del 2017
241,0 KB
15 paginas
Creado hace 13a (06/07/2010)
estudio de caso: el patrón de diseño State

par Rodrigo Pons (home)

Date de publication : 24/09/2009

Dernière mise à jour : 05/07/2010

El design pattern State, o patrón de diseño Estado, es uno de los más utilizados.
En su definición inicial, es muy sencillo, pero su implementación concreta puede variar
mucho según el contexto. Les propongo, en este artículo, analizar varias implementaciones
posibles.

estudio de caso: el patrón de diseño State par Rodrigo Pons (home)

......................................................................................................................................................................................3
I - Introducción............................................................................................................................................................. 3
I-A - Generalidades................................................................................................................................................ 3
I-B - Definición del patrón Estado..........................................................................................................................3
I-C - El diagrama de estados.................................................................................................................................3
II - Modelo inicial......................................................................................................................................................... 5
III - Implementaciones en c++.....................................................................................................................................7
III-A - Implementación "YaTuS"..............................................................................................................................7
III-B - FSM State.................................................................................................................................................... 9
III-C - Dejar el control a los estados concretos...................................................................................................10
III-D - Los estados en forma de singleton........................................................................................................... 12
III-E - La máquina de estado según Qt...............................................................................................................13
IV - Enlaces............................................................................................................................................................... 15

Copyright © 2010 - pons rodrigue. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E
de dommages et intérêts.

http://r0d.developpez.com/articles/dp-state-es/

- 2 -

estudio de caso: el patrón de diseño State par Rodrigo Pons (home)

volver a la página inicial

I - Introducción

I-A - Generalidades

El pattern State (patrón Estado) es un behavioural design pattern (patrón de comportamiento).
Design patterns proportionan modelos teóricos que permiten resolver problemas recurrentes. Han sido pensados
para responder a numerosos problemas, de manera que puedan ser aplicados con éxito en los contextos más
diferentes posible. De hecho, son utilizados regularmente por los desarrolladores que les gusta el paradigma objeto,
y los encontramos en numerosos programas.
En lo que concirene a los design pattern, pienso que es inútil aprenderlos de memoria. Ya que a fuerza de utilizarlos
acabamos por conocerlos sin tener que hacer el esfuerzo de aprenderlos. En cambio, creo que es importante
conocerlos, justo para saber que existan y saber donde encontrar informaciones sobre ellos cuando queremos
utilizarlos concretamente. Ádemas, la comprensión de estos diseño pattern es un ejercicio excelente que permite
comprender un cierto número de problemáticas relativas al paradigma objeto y aprehender soluciones eficaces,
generales y elegantes.
EL UML define varios tipos diagramas, que permiten representar diferentes etapas de la realización de un software,
y de diferentes maneras. Para comprender este artículo, solo necesitará saber leer un diagrama de clase, y saber
lo que es un diagrama de estado.
Aquí utilizaré sólo diagramas muy simplificados, limpiados de todo lo que no esta directamente relacionado con el
sujeto.

I-B - Definición del patrón Estado

La idea de este patrón es de obtener una clase, que llamare contexto (context), que tendrá un comportamiento
circunstanciado al estado corriente, es decir un comportamiento diferente según su estado. . Vamos a crear una
clase abstracta que define la interfaz pública de los estados. En resumen, vamos a poner en ella las funciones del
contexto cuyo comportamiento puede variar. Es el estado abstracto (abstract state). . Luego hay que implementar
los estados concretos, que heredarán del estado abstracto
. . Después creamos un puntero sobre el estado corriente, en una variable miembro del contexto. . Cuando se desea
que el contexto cambie de estado, solo hay que modificar el estado corriente.

Una implementación de un patrón estado está considerada como mejor si respeta los criterios siguientes: . El LSP[en]
es respetado (entre él estado abstracto y los estados concretos). Esto facilita la manipulación de los estados y puede
evitar situaciones complejas y\o ambiguas.
. Los estados concretos no poseen datos. Los datos deben estar en el contexto o en él estado abstracto.

I-C - El diagrama de estados

El diagrama de estados es generalmente menos conocido que el diagrama de clases, entonces voy a hablar un
poco de esto. Este diagrama sirve para representar un autómata de estado terminado (o grafo). Es extremadamente
sencillo: hay unos estados - los nudos del grafo - y eventos (o transiciones) - los arcos del grafo - que permiten irse
de un estado a un otro.

Copyright © 2010 - pons rodrigue. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E
de dommages et intérêts.

http://r0d.developpez.com/articles/dp-state-es/

- 3 -

estudio de caso: el patrón de diseño State par Rodrigo Pons (home)

diagrama de estados

Vamos a tomar un ejemplo didáctico sencillo y sin relación con el desarrollo software (UML es concebido para
representar todo tipo de problemas, no únicamente de programación). Tomemos pues el ejemplo de un grabador de
CD. Podrá encontrarse en tres estados diferentes: stand-by (no hace nada), lectura, y grabación. Para pasar de
uno a otro de estos estados, tenemos 3 eventos: play, stop, y record, que corresponden por ejemplo a la activación
por el usuario de la tecla correspondiente del telemando.

diagrama de estados

Copyright © 2010 - pons rodrigue. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E
de dommages et intérêts.

http://r0d.developpez.com/articles/dp-state-es/

- 4 -

estudio de caso: el patrón de diseño State par Rodrigo Pons (home)

II - Modelo inicial

El patrón Estado el más sencillo es el de la página wikipedia sobre el pattern State[en].

Diagrama que puede dar el código que sigue por ejemplo:

patrón Estado el más sencillo

#include <iostream>
#include <boost/shared_ptr.hpp> // por boost::shared_ptr
using namespace std;
class State
{
public:
virtual ~State() {}
void Action() { DoSomething(); }
private:
virtual void DoSomething() = 0;
};
class ConcreteStateA : public State
{
private:
void DoSomething() { cout << "ConcreteStateA: DoSomething" << endl; }
};
class ConcreteStateB : public State
{
private:
void DoSomething() { cout << "ConcreteStateB: DoSomething" << endl; }

Copyright © 2010 - pons rodrigue. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E
de dommages et intérêts.

http://r0d.developpez.com/articles/dp-state-es/

- 5 -

estudio de caso: el patrón de diseño State par Rodrigo Pons (home)

};

class Context
{
public:
Context():currentState( new ConcreteStateA ) {}

void SetState( State * newState )
{
currentState.reset( newState );
}

void DoSomething() { currentState->Action(); }

private:
boost::shared_ptr<State> currentState;
};
int main()
{
Context context;
context.SetState( new ConcreteStateA );
context.DoSomething();
context.SetState( new ConcreteStateB );
context.DoSomething();
// ...
cin.get();
}

En el código más arriba, hay una utilización de un puntero inteligente (boost::shared_ptr). Los paradigmas del C++
moderno aconsejan la utilización sistemática de los punteros inteligentes. Para saber más sobre eso, ver:
- La página de Zator sobre los apuntadores inteligentes
- La página de boost sobre los punteros inteligentes
El del GoF[en] (GoF=Gang Of Four) no es fundamentalmente distinto, solo añade el pasaje del contexto a la acción
efectuada por el estado.

Copyright © 2010 - pons rodrigue. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E
de dommages et intérêts.

http://r0d.developpez.com/articles/dp-state-es/

- 6 -

estudio de caso: el patrón de diseño State par Rodrigo
  • Links de descarga
http://lwp-l.com/pdf1591

Comentarios de: Estudio de caso: El patrón de diseño State (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad