Luis Pereda Calvo1 Comportamiento de Objetos Estrategia (Strategy) *Política (Policy)
-
Upload
ciriaco-soto -
Category
Documents
-
view
227 -
download
0
Transcript of Luis Pereda Calvo1 Comportamiento de Objetos Estrategia (Strategy) *Política (Policy)
Luis Pereda Calvo 1
Comportamientode 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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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
};
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();
};
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// ... }
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[]
);
//..
};
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[]
);
//..
};
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[]
);
//..
};
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);
Luis Pereda Calvo 22
Patrones relacionados
Flyweight (Peso Ligero): Los objetos Estrategia suelen ser buenos pesos ligeros.
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