Informática

Patrones de diseño en Java: Patrón Strategy

21 abril, 2014

Tras los patrones Composite y Observer,  en esta ocasión veremos el patrón Strategy. Este patrón está orientado a establecer unas reglas de comportamiento en las clases u objetos que lo implementen. Por tanto, en la JDK será más habitual encontrarnos con interfaces que lo plantean como es el caso de Comparable.

Patrón Strategy

Este patrón facilita la implementación de distintas estrategias o comportamientos específicos en clases hijas a través de una clase común. Así, en tiempo de ejecución y en función de algún parámetro como el tipo de instancia, se ejecutará la estrategia concreta para esa situación.

Se recomendará usar este patrón cuando en un mismo programa debamos proporcionar distintas alternativas de comportamiento, permitiendo a través de clases independientes, encapsular las distintas estrategias.

Los distintos componentes de este patrón son:

  • Interfaz Strategy: será aquella interfaz que define el nombre del método o métodos que conformarán la estrategia.
  • Clases Strategy concretas: todas aquellas clases que implementen la interfaz Strategy dando forma al algoritmo.
  • Contexto: elemento donde se desarrollará la estrategia.

El diagrama UML de la implementación de este patrón será:

strategy-diagram

 

Como podemos observar, la interfaz iArea será la estrategia genérica. En este caso, además, se ha añadido una clase abstracta AbstractArea que implementará dicha interfaz y definirá algunas propiedades que serán comunes o necesarias en las implementaciones concretas (en este caso, el nombre de la figura).

  • iArea: Interfaz en la que definimos un método que nos ayudará a calcular el área de cualquier cuerpo geométrico.

 iarea

  • AbstractArea: Clase abstracta que implementará la interfaz IArea y donde definimos un constructor y alguna propiedad básica o común al resto de estrategias.

abstract-area

A continuación desarrollaremos 3 clases para implementar la forma de calcular el área de un polígono regular, un círculo y un triángulo. Estas serán las estrategias existentes en nuestra aplicación de ejemplo.

  • AreaCircular: Estrategia que define que el cálculo del área de un circulo se lleva a cabo multiplicando el valor del radio al cuadrado por el número PI.

 area-circular

  • AreaTriangulo: Estrategia que define que el cálculo del área de un triángulo se lleva a cabo multiplicando el valor de la base por la altura dividiéndolo entre 2.

area-triangulo

  • AreaPoligonoRegular: Estrategia que define que el cálculo del área de un polígono regular de n lados conocido el radio de la circunferencia que lo contiene se lleva a cabo multiplicando el número de lados, por el radio al cuadrado, por el seno de 2PI dividido entre n y todo ello dividido entre 2.

area-poligono-regular

Para completar el ejemplo, se han creado un par de excepciones específicas de forma que si se pasa un valor incorrecto al constructor de un objeto nuestra aplicación nos comunique cual es el error:

poligono-no-existe-exception poligono-no-soportado-exception

Finalmente, desarrollamos la clase CuerpoGeometrico donde podremos ver las distintas estrategias en acción:

cuerpo-geometricoFinalmente, incluimos la clase con el método main y las pruebas del patrón:

strategy-principal

Como siempre, el proyecto con el código está disponible aquí.


SEAS Estudios Superiores Abiertos. Solicita información.Si te ha gustado este artículo de nuestro profesor Juan José Hernández y te interesa seguir fomándote en programación Java, puedes solicitarnos información de nuestro Curso de JAVA y nuestro Curso de Java EE.

Puedes compartir este artículo en:
  • Reply
    Stanley
    25 agosto, 2014 at 1:19 am

    Muy buen tutorial amigo, me sirvio de mucho.

  • Reply
    kcobuntu
    23 noviembre, 2014 at 4:16 pm

    Gracias por compartir

  • Reply
    Je
    6 abril, 2015 at 10:32 pm

    Gracias! muy bien explicado.

  • Reply
    Jose
    6 diciembre, 2015 at 10:42 am

    Muy buen tutorial, claro y sencillo Gracias, pero tengo una duda la interface ‘iArea’ se podría eliminar dejando la clase abstracta como la strategy, con el método para calcular el área como abstract, el efecto sería el mismo ¿no?

Información básica acerca de cómo protegemos tus datos conforme al Reglamento General de Protección de Datos (Reglamento UE 2016/679) y en la Ley Orgánica 3/2018, de 5 de diciembre, de Protección de Datos Personales y garantía de los derechos digitales

De conformidad con lo establecido en el Reglamento General de Protección de Datos, te informamos de:

- Quien es el responsable del tratamiento: SEAS, Estudios Superiores Abiertos S.A.U con NIF A-50973098, dirección en C/ Violeta Parra nº 9 – 50015 Zaragoza y teléfono 976.700.660.

- Cuál es el fin del tratamiento: Gestión y control de los comentarios del blog de SEAS. 

- En que basamos la legitimación: En tu consentimiento.

- La comunicación de los datos: No se comunicarán tus datos a terceros.

- Los criterios de conservación de los datos: Se conservarán mientras exista interés mutuo para mantener el fin del tratamiento o por obligación legal. Cuando dejen de ser necesarios, procederemos a su destrucción.

- Los derechos que te asisten: (i) Derecho de acceso, rectificación, portabilidad y supresión de sus datos y a la limitación u oposición al tratamiento, (ii) derecho a retirar el consentimiento en cualquier momento y (iii) derecho a presentar una reclamación ante la autoridad de control (AEPD).

- Los datos de contacto para ejercer tus derechos: SEAS, Estudios Superiores Abiertos S.A.U. C/ Violeta Parra nº 9 –
50015 Zaragoza (España) o través de correo electrónico a lopd@estudiosabiertos.com

- También puedes ponerte en contacto con nuestro Delegado de Protección de Datos en dpd@estudiosabiertos.com

Información adicional: Puedes consultar la información adicional y detallada sobre nuestra política de privacidad