Modo de estrategia de programación en modo Delphi
Liu Yi
1.1 Explicación del modo
El propósito del patrón Estrategia es definir un conjunto de algoritmos y encapsular cada algoritmo en una clase independiente con una interfaz común para que puedan reemplazarse entre sí. El patrón Estrategia permite cambios de algoritmo independientemente del cliente que lo utilice. Para comprender la motivación y la importancia de utilizar el patrón estratégico, debemos comenzar con un ejemplo interesante. En un sistema de gestión de materiales, los módulos de salida y entrada son las partes centrales del sistema (tomaremos la salida como ejemplo para el análisis a continuación). Para los programadores que no tienen experiencia en programación orientada a objetos, a menudo colocan toda la lógica del pedido de salida en el cliente (interfaz de pedido de salida) y utilizan declaraciones de rama condicionales en el cliente para determinar si el tipo de pedido de salida es selección. pedir prestado materiales o informar pérdidas para elegir diferentes métodos de liquidación saliente, como se muestra en la Figura 1-1. Como resultado, el código del cliente se vuelve complejo y difícil de mantener. Por ejemplo: cuando necesita agregar un nuevo tipo de orden de transferencia fuera del almacén, necesita modificar las condiciones de juicio, recompilar y publicar el cliente. A medida que la situación se vuelve cada vez más compleja, habrá cada vez más ramas condicionales y se agregarán cada vez más códigos de programa. Esto hará que el cliente sea más grande y más difícil de mantener, y aumentará la posibilidad de influencia mutua y errores. . Figura 1-1 El módulo de salida diseñado en base al pensamiento orientado a procesos. Si se analiza utilizando el pensamiento orientado a objetos, la lista de selección, la lista de préstamos y el informe de pérdidas pueden considerarse clases derivadas de la nota de salida, como se muestra en la Figura 1. 2 Mostrar. De esta manera, el documento saliente sirve como clase base de documento para proporcionar una interfaz común para los documentos, y la herencia se utiliza para implementar diferentes comportamientos salientes en subclases. En realidad, esto hace uso de un concepto importante en la orientación a objetos: el polimorfismo. Pero todavía hay un defecto en este diseño, que es que el entorno y el comportamiento están estrechamente relacionados. En otras palabras, el documento y el algoritmo de salida específico están estrechamente relacionados. Un fuerte acoplamiento evita que ambos evolucionen de forma independiente, lo que limita la reutilización y la escalabilidad. La Figura 1-3 es el módulo de salida rediseñado utilizando el patrón de estrategia. El objeto de documento saliente se refiere al objeto de política saliente a través de un objeto de operación saliente (es decir, contexto en el modo de estrategia). Las clases derivadas de la clase de estrategia de salida implementan varias estrategias de salida específicas. El documento de salida puede proporcionar un método de liquidación de salida y una interfaz de visualización de documentos según la operación de salida y el estilo del documento, respectivamente. De esta manera, el modo de estrategia separa el comportamiento de salida del entorno del documento de salida, y el aumento, disminución o modificación del algoritmo de salida no afectará el entorno ni al cliente. Figura 1-2 Módulo de salida diseñado en base al pensamiento orientado a objetos Figura 1-3 Módulo de salida diseñado en base al pensamiento de patrón de diseño La ventaja del patrón de estrategia es la separación del algoritmo y el entorno, y los dos pueden evolucionar de forma independiente. Para ilustrar mejor los beneficios de la separación de algoritmos y entornos, también podríamos observar el diseño de la Figura 1-4. En este diseño, no existe el concepto de módulos entrantes y salientes, porque abstraigo todos los documentos salientes/entrantes y combino dinámicamente la interfaz y el comportamiento de los documentos durante el tiempo de ejecución. A través de la clase de operación saliente/entrante, se pueden mantener, consultar y configurar diferentes clases de comportamiento. El comportamiento de salida/entrada abstraído encapsula su algoritmo correspondiente en forma de una clase de estrategia para completar las operaciones de diferentes tipos de documentos entrantes y salientes. Obviamente, esto mejora la reutilización y escalabilidad del sistema y reduce la dificultad de mantenimiento. Figura 1-4 La ventaja del patrón de estrategia es la separación del algoritmo y el entorno. Los dos pueden evolucionar de forma independiente. Se puede ver que el patrón de estrategia es adecuado para las siguientes situaciones: · Cuando radica la diferencia entre muchas clases relacionadas. sólo en su comportamiento. El patrón Estrategia permite que un objeto elija dinámicamente un comportamiento entre muchos. · Cuando existen múltiples algoritmos alternativos para lograr un objetivo, como aquellos que usted define en función de diferentes compensaciones (es decir, aplicando diferentes estrategias). Estos algoritmos específicos se pueden encapsular en clases derivadas de la clase de algoritmo abstracto y disfrutar de la interfaz unificada de la clase de algoritmo abstracto. Mediante polimorfismo, el cliente puede elegir cualquier algoritmo específico siempre que contenga un objeto de una clase de algoritmo abstracto. · Cuando un algoritmo utiliza datos que no están disponibles para el cliente. El uso del patrón Estrategia evita exponer estructuras de datos complejas relacionadas con algoritmos. De hecho, el cliente no necesita conocer los conocimientos ni los datos relacionados con el algoritmo. · Cuando una definición de clase tiene muchos comportamientos y se utilizan múltiples declaraciones condicionales para determinar la selección de estos comportamientos. El patrón de estrategia puede transferir estos comportamientos a las clases de estrategia específicas correspondientes, evitando así múltiples selecciones condicionales que son difíciles de mantener e incorporando ideas de programación orientada a objetos.
1.2 Estructura y uso
La estructura del patrón de estrategia se muestra en la Figura 1-5, que incluye los siguientes participantes: · Estrategia abstracta (TStrategy): declara una interfaz común para todos los algoritmos admitidos. TContext utiliza esta interfaz para llamar a algoritmos definidos y encapsulados por TConcreteStrategy. · Estrategia concreta (TConcreteStrategy): encapsula algoritmos o comportamientos específicos. Implementar la interfaz TStrategy. · Contexto (TContext): contiene una referencia a TStrategy. Llame a la interfaz TStrategy para configurar dinámicamente algoritmos o comportamientos específicos. Figura 1-5 Estructura del patrón de estrategia En el patrón de estrategia, el algoritmo seleccionado se implementa mediante la interacción de TStrategy y TContext. Cuando se llama al algoritmo, TContext puede pasar todos los datos requeridos por el algoritmo a TStrategy. Alternativamente, TContext puede pasarse a sí mismo como parámetro de la operación TStrategy. Cuando un TContext reenvía una solicitud de cliente a su TStrategy, el cliente normalmente crea y pasa un objeto TConcreteStrategy al TContext de esta manera, el cliente interactúa solo con el TContext; Generalmente hay una serie de clases de TConcreteStrategy entre las que los clientes pueden elegir. -------------------------------------------------- ----------------------------------------
Se pueden descargar más artículos relacionados y códigos fuente de programas de muestra desde el sitio web del autor: http://www.liu-yi.net