English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Este artículo proporciona un ejemplo de diseño de patrones de programación Android: el patrón de estrategia. Lo compartimos para que pueda ser referenciado, como se muestra a continuación:
1. Introducción
También se enfrentan a tal situación en el desarrollo de software: la implementación de una función puede tener varios algoritmos o estrategias, y se eligen diferentes algoritmos o estrategias según la situación real para completar la función. Por ejemplo, los algoritmos de ordenamiento, que pueden utilizar inserción, ordenamiento por mezcla, burbuja, etc.
Para este tipo de situación, un método convencional es escribir varios algoritmos en una clase. Por ejemplo, si se necesitan proporcionar varios algoritmos de ordenamiento, estos algoritmos se pueden escribir en una clase, cada método correspondiendo a un algoritmo de ordenamiento específico: también se puede encapsular estos algoritmos de ordenamiento en un método unificado, utilizando instrucciones de condición como if...else... o case para seleccionar el algoritmo específico. Ambos métodos de implementación se pueden denominar hardcodeados. Sin embargo, cuando muchos algoritmos se concentran en una clase, esta clase se vuelve voluminoso, el costo de mantenimiento de esta clase aumenta y es más fácil que se produzcan errores en el mantenimiento. Si se necesita agregar un nuevo algoritmo de ordenamiento, se debe modificar el código fuente de la clase que encapsula los algoritmos. Esto claramente viola los principios OCP y de responsabilidad única.
Si se abstractan estos algoritmos o estrategias y se proporciona una interfaz unificada, diferentes algoritmos o estrategias tendrán diferentes clases de implementación. De esta manera, en el cliente del programa se puede lograr la sustitución dinámica de algoritmos o estrategias mediante la inyección de diferentes objetos de implementación. Este modelo tiene una mayor expansibilidad y mantenibilidad, es decir, lo que se menciona en esta sección: el patrón de estrategia.
En términos simples, es que, generalmente, si un problema tiene múltiples soluciones, lo más simple es utilizar if-else o switch-La forma case selecciona diferentes soluciones según diferentes situaciones, pero tiene una alta耦合idad, código voluminoso y difícil de mantener. En este caso, se puede utilizar el patrón de estrategia para resolverlo.
II. Definición
El patrón de estrategia define una serie de algoritmos, encapsulándolos y permitiéndoles ser intercambiables. El patrón de estrategia hace que los algoritmos sean independientes de los clientes que los utilizan y que puedan cambiar independientemente.
III. Escenarios de uso
para múltiples formas de manejar el mismo tipo de problema, cuando solo hay diferencias en las conductas específicas
cuando se necesita encapsular de manera segura múltiples operaciones del mismo tipo
aparece la misma clase abstracta con múltiples subclases y se necesita usar if-else o switch-case para seleccionar subclases específicas
IV. Diagrama de clase UML del patrón de estrategia
Diagrama de clase UML:
Context: utilizado para operar el entorno de contexto de la estrategia.
Stragety: abstracción de la estrategia.
ConcreteStrategyA, ConcreteStrategyB: implementaciones específicas de la estrategia.
V. Implementación simple
Requisito: calcular el precio de los libros, el miembro principiante no tiene descuento, el miembro intermedio aplica9descuento, el miembro avanzado aplica8descuento. Si se escribe de manera general, debería ser if-else determinar qué nivel de miembro es, y calcular el descuento correspondiente. A continuación, se utiliza el patrón de estrategia para la implementación.
Clase de descuento abstracta:
public interface MemberStrategy { /** * Calcular el precio del libro * @param booksPrice Precio original del libro * @return Calcular el precio después de descuento */ public double calcPrice(double booksPrice); }
Clase de descuento de miembro principiante:
public class PrimaryMemberStrategy implements MemberStrategy{ /** * Descuento de miembro principiante */ @Override public double calcPrice(double booksPrice) { System.out.println("No hay descuento para el miembro principiante"); return booksPrice; } }
Clase de descuento de miembro intermedio:
public class IntermediateMemberStrategy implements MemberStrategy{ /** * Descuento de miembro intermedio */ @Override public double calcPrice(double booksPrice) { System.out.println("Para el descuento del miembro intermedio es de ",10%); return booksPrice * 0.9; } }
Clase de descuento de miembro avanzado:
public class AdvancedMemberStrategy implements MemberStrategy{ /** * Descuento de miembro avanzado */ @Override public double calcPrice(double booksPrice) { System.out.println("El descuento para los miembros premium es"}}20%")); return booksPrice * 0.8; } }
Clase de precio:
public class Price { //Mantener un objeto de estrategia específico private MemberStrategy strategy; /** * Constructor, ingrese un objeto de estrategia específico * @param strategy Objeto de estrategia específico */ public Price(MemberStrategy strategy){ this.strategy = strategy; } /** * Calcular el precio del libro * @param booksPrice Precio original del libro * @return Calcular el precio después de descuento */ public double quote(double booksPrice){ return this.strategy.calcPrice(booksPrice); } }
Cliente:
public class Client { public static void main(String[] args) { //Elegir y crear el objeto de estrategia necesario MemberStrategy strategy1 = new AdvancedMemberStrategy(); //Crear entorno Price price = new Price(strategy1); //calcular precio double quote = price.quote(300); System.out.println("El precio final del libro es:") + quote); } }
Resultados:
El descuento para los miembros premium es20% El precio final del libro es:240.0
Seis, la diferencia entre el patrón de estrategia y el patrón de fábrica
Patrón de fábrica | Patrón de estrategia |
---|---|
Diseño de patrones de creación | Diseño de patrones de comportamiento |
Concentrarse en la creación de objetos | Concentrarse en la elección de comportamientos |
Caja negra (no es necesario saber el proceso de implementación específico) | Caja blanca (sabe el proceso de implementación específico) |
Siete, la implementación del patrón de estrategia en el código fuente de Android
Con el desarrollo de la tecnología, los ingenieros están cada vez más enfocados en la experiencia del usuario y la interacción del usuario. Por lo tanto, la animación se ha convertido en una parte indispensable de muchas aplicaciones, incluso una página de guía simple también debe tener efectos de animación, y para ocultar un botón también es necesario agregar efectos de animación de entrada y salida suaves. El principio de la implementación de la animación es cambiar rápidamente las imágenes en un corto período de tiempo, y la frecuencia de este cambio debe alcanzar un nivel que el ojo humano no pueda notar, por ejemplo, el estándar de la película es24cuadros por segundo/Segundo. Cuando es fluido, la animación en Android puede alcanzar60 cuadros/Segundos, el ojo humano prácticamente no puede ver el intervalo, por lo que, cuando vemos esta animación, es muy fluida.
La animación por sí sola no es suficiente para satisfacer nuestras necesidades, durante la ejecución de la animación, también necesitamos algunos efectos dinámicos, que son un poco como los planos lentos de una película, a veces necesitamos que sea más lento, a veces más rápido, de modo que la animación también se vuelve más vivaz. Estos efectos dinámicos se implementan a través de interpoladores (TimeInterpolator), solo necesitamos configurar diferentes interpoladores en el objeto Animation para lograr diferentes efectos dinámicos.
LinearInterpolator, AccelerateInterpolator, CycleInterpolator y otros implementan Interpolator, se obtiene el porcentaje de tiempo actual a través de getInterpolator (float input) para calcular el valor de las propiedades de la animación.
Ocho, resumen
El patrón de estrategia se utiliza principalmente para separar algoritmos, donde hay diferentes estrategias de implementación específicas bajo la abstracción de comportamiento similar. Este patrón demuestra muy bien el principio de cerrado, es decir, definir la abstracción, inyectar diferentes implementaciones, y lograr una excelente expansibilidad.
Ventajas:
La estructura es clara y明了,使用简单直观。
La耦合度相对较低,扩展 es más conveniente.
La encapsulación de operaciones también se vuelve más exhaustiva, y los datos son más seguros.
Desventajas:
Con el aumento de las estrategias, las subclases también se vuelven más numerosas.
Los lectores interesados en más contenido relacionado con Android pueden ver la sección especial de este sitio: 'Tutorial de inicio y avanzado de desarrollo de Android', 'Técnicas de depuración y resumen de métodos de solución de problemas comunes de Android', 'Resumen de uso de componentes básicos de Android', 'Resumen de técnicas de View de Android', 'Resumen de técnicas de layout de Android' y 'Resumen de uso de controles de Android'.
Espero que lo descrito en este artículo pueda ayudar a todos en el diseño de programas Android.
Declaración: el contenido de este artículo se obtiene de la red, es propiedad del autor original, el contenido se contribuye y carga de manera autónoma por los usuarios de Internet, este sitio no posee los derechos de propiedad, no se ha realizado una edición humana y no asume ninguna responsabilidad legal relacionada. Si encuentra contenido sospechoso de copyright, le invitamos a enviar un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, reemplace # con @) para denunciar y proporcionar evidencia relevante. Una vez verificada, este sitio eliminará inmediatamente el contenido sospechoso de infracción.