JavaRush /Blog Java /Random-ES /Diferencia entre patrones de estado y estrategia en Java
0xFF
Nivel 9
Донецк

Diferencia entre patrones de estado y estrategia en Java

Publicado en el grupo Random-ES
Para utilizar correctamente los patrones de Estado y Estrategia en aplicaciones Java centrales, es importante que los programadores de Java comprendan claramente la diferencia entre ellos. Aunque ambos patrones, Estado y Estrategia, tienen una estructura similar, y ambos se basan en el principio abierto/cerrado, que representa la "O" en los principios SOLID , tienen una intención completamente diferente . Diferencia entre patrones de Estado y Estrategia en Java - 1El patrón Estrategia en Java se utiliza para encapsular conjuntos de algoritmos relacionados para proporcionar flexibilidad de ejecución al cliente. El cliente puede elegir cualquier algoritmo en tiempo de ejecución sin cambiar el contexto de la clase que utiliza el archivo Strategy. Algunos ejemplos populares del patrón Estrategia son escribir código que utiliza algoritmos, como cifrado, compresión u clasificación. Por otro lado, el patrón Estado permite que un objeto se comporte de manera diferente en diferentes estados. Porque en el mundo real un objeto a menudo tiene estados y se comporta de manera diferente en diferentes estados, por ejemplo, una máquina expendedora solo vende bienes si está en el estado hasCoin, no vende hasta que le pones una moneda. Ahora se puede ver claramente la diferencia entre los patrones de Estrategia y Estado, son intenciones diferentes. El patrón Estado ayuda a un objeto a gestionar el estado, mientras que el patrón Estrategia permite al cliente elegir un comportamiento diferente. Otra diferencia que no es tan fácil de ver es quién impulsa el cambio de comportamiento. En el caso del patrón Estrategia, este es un cliente que proporciona varias estrategias al contexto; en el patrón Estado, la transición está controlada por el contexto o el estado del objeto mismo. Además, si usted mismo administra los cambios de estado en el objeto Estado, debe haber una referencia al contexto; por ejemplo, una máquina expendedora debe poder llamar a un método setState()para cambiar el estado actual del contexto. Por otro lado, el objeto Estrategia nunca contiene una referencia al contexto; el propio cliente pasa la Estrategia de su elección al contexto. La diferencia entre los patrones de Estado y Estrategia es una de las preguntas populares en las entrevistas sobre patrones de Java ; en este artículo sobre patrones de Java la analizaremos más de cerca. Exploraremos algunas similitudes y diferencias entre los patrones Estrategia y Estado en Java que le ayudarán a mejorar su comprensión de estos patrones.

Similitudes entre los patrones Estado y Estrategia

Si observa el diagrama UML de los patrones Estado y Estrategia, notará que ambos se parecen entre sí. Un objeto que usa Estado para cambiar su comportamiento se conoce como Contextobjeto, de manera similar, un objeto que usa Estrategia para cambiar su comportamiento se conoce como Contextobjeto. Recuerde que el cliente interactúa con Contextel objeto. En el caso del patrón State, el contexto delega métodos de llamada a un objeto State, que se mantiene como el objeto actual, y en el caso del patrón Strategy, el contexto usa el objeto Strategy como parámetro o se proporciona durante la creación. del contexto del objeto. Diagrama UML del patrón State en Java Diferencia entre patrones de Estado y Estrategia en Java - 2 Este diagrama UML para el patrón State describe el problema clásico de crear un diseño de máquina expendedora orientada a objetos en Java. Puede ver que el estado de la máquina expendedora se representa mediante una interfaz, que luego tiene una implementación para representar el estado específico. Cada estado también tiene referencias al contexto del objeto para realizar una transición a otro estado como resultado de acciones llamadas en el contexto. Diagrama UML del patrón Estrategia en Java Diferencia entre patrones de Estado y Estrategia en Java - 3 Este diagrama UML para el patrón Estrategia contiene implementaciones funcionales de algún tipo. Dado que existen muchos algoritmos de clasificación, este patrón de diseño permite al cliente elegir un algoritmo al clasificar objetos. De hecho, el marco de la Colección Java utiliza este patrón para implementar un método Collections.sort()que se utiliza para ordenar objetos en Java. La única diferencia es que en lugar de permitir que el cliente elija un algoritmo de clasificación, le permite especificar la estrategia de comparación pasando una instancia de Comparator o Comparable a Java . Veamos algunas similitudes entre estos dos patrones de diseño principales en Java:
  1. Ambos patrones, Estado y Estrategia, facilitan agregar nuevos estados y estrategias sin afectar el contexto del objeto que los utiliza.

  2. Ambos mantienen su código de acuerdo con el principio abierto/cerrado , lo que significa que el diseño estará abierto a extensiones pero cerrado a modificaciones. En el caso de los patrones Estado y Estrategia, el contexto del objeto está cerrado a modificaciones, introducción de nuevos Estados o nuevas Estrategias, o no es necesario modificar el contexto del otro estado, o cambios mínimos.

  3. Así como un contexto de objeto comienza con el estado de inicialización del objeto en el patrón Estado, un contexto de objeto también tiene una estrategia predeterminada en el caso del patrón Estrategia en Java.

  4. El patrón Estado representa diferentes comportamientos en forma de diferentes estados de objeto, mientras que el patrón Estrategia representa diferentes comportamientos en forma de diferentes estrategias de objeto.

  5. Ambos patrones, Estrategia y Estado, dependen de subclases de implementación de comportamiento. Cada estrategia concreta extiende una estrategia abstracta; cada estado es una subclase de una interfaz o clase abstracta que se utiliza para representar el estado.

Diferencias entre patrones de estrategia y estado en Java

Ahora sabemos que los patrones Estado y Estrategia son similares en estructura, pero su intención es diferente. Veamos algunas diferencias clave entre estos patrones de diseño.
  1. El patrón Estrategia encapsula un conjunto de algoritmos relacionados y permite al cliente usar comportamientos intercambiables a pesar de la composición y delegación en tiempo de ejecución; por otro lado, el patrón Estado ayuda a una clase a exhibir diferentes comportamientos en diferentes estados.

  2. La siguiente diferencia entre los patrones Estado y Estrategia es que Estado encapsula el estado de un objeto, mientras que el patrón Estrategia encapsula un algoritmo o estrategia. Dado que el estado está asociado con un objeto, no se puede reutilizar, pero al desacoplar una estrategia o algoritmo de su contexto podemos reutilizarlo.

  3. En el patrón Estado, un estado personal puede contener una referencia al contexto para implementar transiciones entre estados, pero una Estrategia no contiene una referencia al contexto donde se usa.

  4. La implementación de una Estrategia se puede pasar como parámetro al objeto que la usará, por ejemplo Collection.sort() toma un Comparador que es una estrategia. Por otro lado, el estado es parte del contexto mismo del objeto y, con el tiempo, el contexto del objeto pasa de un estado a otro.

  5. Aunque tanto la Estrategia como el Estado siguen el principio abierto/cerrado, la Estrategia también sigue el Principio de Responsabilidad Única ya que cada Estrategia contiene un algoritmo individual, las diferentes estrategias son independientes entre sí. Cambiar una estrategia no requiere cambiar otra estrategia.

  6. Otra diferencia teórica entre los patrones Estrategia y Estado es que el creador define la parte "Cómo" del objeto, por ejemplo, "Cómo" el objeto de clasificación clasifica los datos; por otro lado, el patrón Estado define el "qué" y el "cuándo". partes del objeto, por ejemplo, qué puede hacer un objeto cuando se encuentra en un determinado estado.

  7. El orden de las transiciones de estados está bien definido en el patrón de Estado; no existe tal requisito para el patrón de Estrategia. El Cliente es libre de elegir cualquier implementación de la Estrategia de su elección.

  8. Algunos de los ejemplos comunes del patrón Estrategia son la encapsulación de algoritmos, como algoritmos de clasificación, algoritmos de cifrado o algoritmos de compresión. Si ve que su código debe usar diferentes tipos de algoritmos relacionados, debería considerar usar el patrón Estrategia. Por otro lado, reconocer el uso del patrón State es bastante fácil; si necesita gestionar el estado y las transiciones de estado sin muchas declaraciones condicionales anidadas, el patrón State es el patrón correcto a utilizar.

  9. La última, pero una de las diferencias más importantes entre los patrones Estado y Estrategia es que el Cliente realiza un cambio a la Estrategia, mientras que el contexto o el estado del objeto en sí puede realizar un cambio al Estado.

Se trata de la diferencia entre los patrones Estado y Estrategia en Java . Como dije, ambos se ven similares en sus clases y diagramas UML, ambos proporcionan principios abiertos/cerrados y encapsulan el comportamiento. Utilice el patrón Estrategia para encapsular un algoritmo o estrategia que se expone al contexto en tiempo de ejecución, tal vez como un parámetro u objeto compuesto, y utilice el patrón Estado para controlar las transiciones de estado en Java. Original aquí
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION