NINATANTA GARCIA, JHON CURSO: TECNOLOGIA DE LA PROGRAMACION II DOCENTE: YANET VIDAL MELGAREJO TEMA: PATRON DE DISEO STRATEGY GUADALUPE - 2014 PATRN DE DISEO STRATEGY CONCEPTO. Se clasifica como patrn de comportamiento porque determina como se debe realizar el intercambio de mensajes entre diferentes objetos para resolver una tarea.
Permite mantener un conjunto de algoritmos de entre los cuales el objeto cliente puede elegir aquel que le conviene e intercambiarlo dinmicamente segn sus necesidades.
Facilita la implementacin de distintas estrategias o comportamientos especficos en clases hijas a travs de una clase comn.
En tiempo de ejecucin y en funcin de algn parmetro como el tipo de instancia, se ejecutar la estrategia concreta para esa situacin. COMPONENTES DE PATRN DE DISEO STRATEGY. VENTAJAS Permite definir familias de algoritmos relacionados, agrupar funciones y facilitar la reutilizacin del cdigo.
Este patrn permite que el comportamiento cambie dinmicamente, en tiempo de ejecucin.
Elimina el uso de sentencias condicionales, cuyo abuso hace difcil de leer el cdigo. DESVENTAJAS. Los clientes deben conocer la existencia de las distintas estrategias.
Si los clientes ignoran las estrategias o les resultan indiferentes, el uso del patrn resulta inapropiado.
Incrementa el nmero de objetos que pueden ejecutarse en una aplicacin.
CLASIFICACIN DEL PATRON Propsito
Define una familia de algoritmos, encapsula cada uno de ellos y los hace intercambiables. Permite que un algoritmo vari independientemente de los clientes que lo usan.
Motivacin
Codificar algoritmos en las clases que las usan. Dividir lneas en un flujo de texto
APLICABILIDAD:
Use el patn Strategy para evitar exponer estructuras de datos complejas y dependientes del algoritmo
ESTRUCTURA Usa el patrn Strategy cuando:
Varias clases relacionadas slo difieren en su comportamiento. Strategy permite configurar a una clase con uno de entre varios comportamientos
Se necesiten variantes del mismo algoritmo, que se implementan como una jerarqua de clases Una clase define muchos comportamientos que aparecen en sentencias condicionales mover los relacionados a un strategy.
PARTICIPANTES Estrategia (Componedor) Declara la interfaz comn a todos los algoritmos permitidos.
El *contexto* usa esa interfaz para llamar al algoritmo definido por una estrategia
Estrategia Concreta Implementa el algoritmo concreto.
Contexto Instancia un objeto Estrategia Concreta Mantiene una referencia la un objeto estrategia (concreta). Puede definir una interfaz que permita a la Estrategia (concreta) acceder a sus datos.
COLABORACIONES
Mediante parmetros en los mtodos de la estrategia. Mandndose, el contexto, a s mismo a la estrategia. Los clientes del contexto lo configuran con una estrategia concreta. A partir de ah, solo se interacta con el contexto.
CONSECUENCIAS Ayuda a eliminar sentencias condicionales Facilita la comprensin, mantenimiento y extensin. Adems permite cambiar el algoritmo dinmicamente
Familias de algoritmos relacionados: Las jerarquas de clases Estrategia definen una familia de algoritmos o comportamientos
Una alternativa a la herencia: La herencia ofrece otra forma de permitir una variedad de algoritmos o comportamientos.
Las estrategias eliminan las sentencias condicionales: El patrn estrategia ofrece una alternativa a las sentencias condicionales para seleccionar el comportamiento deseado.
Los clientes deben conocer las diferentes estrategias: el patrn tiene el inconveniente potencial de que un cliente debe comprender como difieren las Estrategias antes de seleccionar la adecuada.
Costes de comunicacin entre Estrategia y Contexto: La interfaz de Estrategia es compartida por todas las clases Estrategia Concreta
Mayor numero de objetos: Las estrategias aumentan el nmero de objetos de una aplicacin.
IMPLEMENTACION Definicin de la comunicacin entre Contexty Strategy, el contexto pasa sus datos como argumentos de las operaciones de la estrategia: bajo acoplamiento, posible paso de parmetros innecesarios El contexto se pasa asimismo como argumentos: alto acoplamiento
Configurar el contexto con una estrategia si la estrategia se puede usar un tiempo de compilacin . Si la estrategia no va a cambiar en tiempo de ejecucin.
Comportamiento por defecto en el contexto, creo y utilizo un objeto estrategia solo es necesario. Pasar como parmetro la informacin necesaria para la estrategia implica un bajo acoplamiento y la posibilidad de envo de datos innecesarios. Pasar como parmetro el contexto y dejar que la estrategia solicite la informacin que necesita supone un alto acoplamiento entre ellos. Mantener en la estrategia una referencia al contexto. EJERCICIO DEL PATRON PATRN DE DISEO STRATEGY public abstract class EstrategiaDibujo extends JFrame { private float[] _x,_y; private Color _c; private int _ancho,_alto; public EstrategiaDibujo() { } public abstract void dibujar(float[] px, float[] py); } public class EstrategiaDibujoConcreta1 extends EstrategiaDibujo{ public void dibujar(float[] px, float[] py){ ... } } public class EstrategiaDibujoConcreta2 extends EstrategiaDibujo{ public void dibujar(float[] px, float[] py){ ... } } Lo importante de esta clase es que cada una de las estrategias que diseemos tendr que sobrescribir el mtodo dibujar() y proveer un algoritmo concreto para dicha estrategia: public class CreadorDibujos { private EstrategiaDibujo _estrategia; private float[] _x,_y; public CreadorDibujos() { // Establecer estrategia por defecto. } public void establecerDibujoBarras() { _estrategia = new EstrategiaDibujoConcreta1(); } public void establecerDibujoLineas() { _estrategia = new EstrategiaDibujoConcreta2(); } public void dibuja() { _estrategia.dibujar(_x,_y); } }
public class Main { public static void main(String args[]) { //Usamos la estrategia A Strategy estrategia_inicial = new StrategyA(); Context context = new Context(estrategia_inicial); context.some_method(); //Decidimos usar la estrategia B Strategy estrategia2 = new StrategyB(); context.setStrategy(estrategia2); context.some_method(); //Finalmente,usamos de nuevo la estrategia A context.setStrategy(estrategia_inicial); context.some_method(); /** Salida: * Estrategia A * Estrategia B * Estrategia A **/ } } CONCLUCIONES