La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Luis Pereda Calvo1 Comportamiento de Objetos Estrategia (Strategy) *Política (Policy)

Presentaciones similares


Presentación del tema: "Luis Pereda Calvo1 Comportamiento de Objetos Estrategia (Strategy) *Política (Policy)"— Transcripción de la presentación:

1 Luis Pereda Calvo1 Comportamiento de Objetos Estrategia (Strategy) *Política (Policy)

2 Luis Pereda Calvo2 Introducción Los patrones de Comportamiento describen patrones de comunicación entre clases y objetos. El patrón Strategy encapsula un algoritmo en un objeto, facilitando especificar y cambiar el algoritmo que usa un objeto.

3 Luis Pereda Calvo3 Propósito Define una familia de algoritmos, encapsula cada uno de ellos y los hace intercambiables. Permite que un algoritmo varíe independientemente de los clientes que lo usan. Muestra el poder del polimorfismo en la POO.

4 Luis Pereda Calvo4 Motivación Existen multitud de algoritmos para dividir en lineas un flujo de texto. Codificarlos en las clases que los usan es totalmente desaconsejable por varias razones: - los clientes que necesiten estas funcionalidades se vuelven más complejos, más grandes y más difíciles de mantener. - los distintos algoritmos serán apropiados en determinados momentos y por tanto no hay razón para permitir múltiples algoritmos si no se van a utilizar todos. - es difícil añadir nuevos algoritmos o modificarlos cuando la división en líneas es parte integral de un cliente. Esto se puede evitar con clases que encapsulen los diferentes algoritmos de division en lineas. Un algoritmo así encapsulado se denomina una ESTRATEGIA.

5 Luis Pereda Calvo5 Motivación ComponedorSimple implementa una estrategia simple que calcula un salto de línea cada vez. ComponedorTex implementa el algoritmo Tex para buscar saltos de línea. Trata de optimizar los saltos globalmente (un párrafo cada vez). ComponedorMatriz implementa una estrategia que selecciona los saltos de línea. Es útil para dividir unos iconos en filas.

6 Luis Pereda Calvo6 Aplicabilidad Muchas clases relacionadas difieren solo en su comportamiento. Las estrategias permiten configurar una clase con un determinado comportamiento entre varios posibles. Se necesitan distintas variantes de un algoritmo para soluciones de compromiso entre tiempo y espacio. Pueden usarse estrategias cuando las variantes se implementan como una jerarquía de clases. Un algoritmo usa datos que los clientes no deberían conocer y se usa para evitar exponer estructuras de datos dependientes del algoritmo. En vez de tener muchas sentencias condicionales para las operaciones de varios comportamientos.

7 Luis Pereda Calvo7 Estructura y Participantes Estrategia: - Declara una interfaz común a todos los algoritmos permitidos. El Contexto usa esta interfaz para llamar al algoritmo definido por una EstrategiaConcreta. EstrategiaConcreta: - Implementa el algoritmo usando la interfaz Estrategia.

8 Luis Pereda Calvo8 Estructura y Participantes Contexto: - Se configura con un objeto EstrategiaConcreta. - Mantiene una referencia a un objeto Estrategia. - Puede definir una interfaz que permita a la Estrategia acceder a sus datos.

9 Luis Pereda Calvo9 Colaboraciones Estrategia y Contexto interactúan para implementar el algoritmo elegido. Un contexto puede pasar a la Estrategia todos los datos requeridos por el algoritmo cada vez que se le llama, o incluso puede el Contexto pasarse a sí mismo como argumento de las operaciones de Estrategia, lo que permite a Estrategia hacer llamadas al Contexto cuando le sea necesario. El Contexto redirige peticiones de los clientes a su Estrategia. Los clientes interactúan exclusivamente con el Contexto al cual le pasan un objeto EstrategiaConcreta. El cliente elige entre una familia de subclases EstrategiaConcreta.

10 Luis Pereda Calvo10 Consecuencias Familias de algoritmos relacionados: La herencia puede ayudar a sacar factor común de la funcionalidad de los algoritmos. Una alternativa a la herencia: Encapsular el algoritmo en subclases de Estrategia separadas nos permite variar el algoritmo independientemente de su contexto, haciéndolo más fácil de cambiar, comprender y extender. Eliminación de sentencias condicionales: Al juntarse muchos comportamientos en una clase es difícil no usar condiciones para seleccionar el comportamiento correcto. Un codigo que presenta muchas sentencias condicionales suele indicar la necesidad de aplicar el patrón Strategy.

11 Luis Pereda Calvo11 Consecuencias Una elección de implementaciones: Las estrategias pueden proporcionar distintas implementaciones del mismo comportamiento por razones de tiempo y/o espacio. Así, es el cliente el que elige entre las distintas posibilidades. Los clientes deben conocer las estrategias: Este patrón tiene el inconveniente que el cliente debe comprender las diferencias entre las Estrategias, para elegir la mejor. Costes de comunicación Estrategia Contexto: La interfaz de Estrategia es compartida por todos sus hijos. Puede darse el caso de que ciertas subclases no usen toda la información que reciben a través de la interfaz. Por tanto, habrá veces en las que el Contexto inicialice parámetros inútiles.

12 Luis Pereda Calvo12 Consecuencias Mayor número de objetos: Se puede reducir este coste implementando las estrategias como objetos sin estado que puedan ser compartidos por el contexto.

13 Luis Pereda Calvo13 Implementación Definir las interfaces Estrategia y Contexto: Ambas deber permitir a una EstrategiaConcreta acceder eficientemente a cualquier dato que necesiten cualquiera de las dos. Contexto puede pasar los datos como parámetros a Estrategia (esto los mantiene desacoplados) o también puede pasarse a sí mismo como argumento para que Estrategia tome de él explícitamente lo que necesite. También Estrategia puede guardar una referencia a Contexto, eliminando la necesidad de pasar nada. Esta implementación hace que Contexto defina una interfaz más elaborada, acoplando más estrechamente Estrategia y Contexto.

14 Luis Pereda Calvo14 Implementación Estrategias como parámetros de plantillas: En C++ pueden usarse plantillas para configurar una clase como una estrategia. Esta técnica solo se podrá aplicar si: - se puede seleccionar la Estrategia en tiempo de compilación. - no hay que cambiarla en tiempo de ejecución. Hacer opcionales los objetos Estrategia: Contexto puede simplificarse en caso de que tenga sentido no tener un objeto Estrategia. Contexto comprueba si tiene un objeto Estrategia antes de acceder a él. De esta manera los clientes no tienen que tratar con las Estrategias, a menos que no les sirva el comportamiento predeterminado.

15 Luis Pereda Calvo15 Código de Ejemplo class Composicion{ public: Composicion(Componedor*); void Reparar(); private: Componedor* _componedor; Componente* _componentes;//lista de componentes int _contadorComponenetes;//número de componentes int _anchoLinea;//ancho de línea de composición int _saltosLinea;//posición de los saltos de //línea en los componentes int_contadorLineas;//el número de líneas };

16 Luis Pereda Calvo16 Código de Ejemplo class Componedor { public: virtual int Componer( Coord natural[], Coord estirado[], Coord encogido[], int contadorComponentes, int anchoLinea, int saltos ) = 0; protected: Componedor(); };

17 Luis Pereda Calvo17 Código de Ejemplo void Composición::Reparar(){ Coord* natural; Coord* maxima; Coord* minima; int contadorComponentes; int* saltos; // prepara arrays con tamaños deseados de los componentes //... // determina donde van los saltos: int contadorSaltos; contadorSaltos = _componedor->Componer( natural, maxima, minima, contadorComponentes, _anchoLinea, saltos ); // coloca los componentes en función de los saltos //... }

18 Luis Pereda Calvo18 Código de Ejemplo class ComponedorSimple : public Componedor { public: ComponedorSimple(); virtual int Componer(){ Coord natural[], Coord maxima[], Coord minima[], int contadorComponentes, int anchoLinea, int saltos[] ); //.. };

19 Luis Pereda Calvo19 Código de Ejemplo class ComponedorTex : public Componedor { public: ComponedorTex(); virtual int Componer(){ Coord natural[], Coord maxima[], Coord minima[], int contadorComponentes, int anchoLinea, int saltos[] ); //.. };

20 Luis Pereda Calvo20 Código de Ejemplo class ComponedorMatriz : public Componedor { public: ComponedorMatriz(); virtual int Componer(){ Coord natural[], Coord maxima[], Coord minima[], int contadorComponentes, int anchoLinea, int saltos[] ); //.. };

21 Luis Pereda Calvo21 Código de Ejemplo Composicion* rapida = new Composicion(new ComponedorSimple); Composicion* elegante = new Composicion(new ComponedorTex); Composicion* iconos = new Composicion(new ComponedorMatriz);

22 Luis Pereda Calvo22 Patrones relacionados Flyweight (Peso Ligero): Los objetos Estrategia suelen ser buenos pesos ligeros.

23 Luis Pereda Calvo23 Bibliografía Patrones de Diseño, E.Gamma y otros. Ed: Addyson Wesley. http://es.wikipedia.org/wiki/Patrón_de_diseño http://es.wikipedia.org/wiki/Strategy_(patrón_de_diseño) http://es.wikipedia.org/wiki/Strategy_(patrón_de_diseño http://www.javahispano.org/articles.article.action?id=91


Descargar ppt "Luis Pereda Calvo1 Comportamiento de Objetos Estrategia (Strategy) *Política (Policy)"

Presentaciones similares


Anuncios Google