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

23
Luis Pereda Calvo 1 Comportamient o de Objetos Estrategia (Strategy) *Política (Policy)

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

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

Luis Pereda Calvo 1

Comportamientode Objetos

Estrategia (Strategy)

*Política (Policy)

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

Luis Pereda Calvo 2

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.

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

Luis Pereda Calvo 3

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.

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

Luis Pereda Calvo 4

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.

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

Luis Pereda Calvo 5

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.

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

Luis Pereda Calvo 6

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.

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

Luis Pereda Calvo 7

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.

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

Luis Pereda Calvo 8

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.

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

Luis Pereda Calvo 9

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.

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

Luis Pereda Calvo 10

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.

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

Luis Pereda Calvo 11

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.

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

Luis Pereda Calvo 12

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.

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

Luis Pereda Calvo 13

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.

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

Luis Pereda Calvo 14

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.

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

Luis Pereda Calvo 15

Código de Ejemplo class Composicion{

public:Composicion(Componedor*);void Reparar();

private:Componedor* _componedor;Componente* _componentes; //lista de componentesint _contadorComponenetes; //número de componentesint _anchoLinea; //ancho de línea de composición

int _saltosLinea; //posición de los saltos de

//línea en los componentesint_contadorLineas; //el número de líneas

};

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

Luis Pereda Calvo 16

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();

};

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

Luis Pereda Calvo 17

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// ... }

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

Luis Pereda Calvo 18

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[]

);

//..

};

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

Luis Pereda Calvo 19

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[]

);

//..

};

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

Luis Pereda Calvo 20

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[]

);

//..

};

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

Luis Pereda Calvo 21

Código de Ejemplo

Composicion* rapida = new Composicion(new ComponedorSimple);

Composicion* elegante = new Composicion(new ComponedorTex);

Composicion* iconos = new Composicion(new ComponedorMatriz);

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

Luis Pereda Calvo 22

Patrones relacionados

Flyweight (Peso Ligero): Los objetos Estrategia suelen ser buenos pesos ligeros.

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

Luis Pereda Calvo 23

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://www.javahispano.org/articles.article.action?id=91