Patrón de estrategia del patrón de diseño de java (Patrón de estrategia)

concepto

Patrón de estrategia: defina una serie de algoritmos, encapsule cada algoritmo y hágalos intercambiables. El patrón de estrategia permite variar el algoritmo independientemente de los clientes que lo utilicen, también conocido como patrón de política (Policy).

usar

Combinado con el concepto de modo de estrategia, encontremos una escena práctica para entender.

Supongamos que somos una librería recién abierta. Para atraer clientes, lanzamos servicios de membresía. Dividimos a los miembros en la tienda en tres tipos, a saber, miembros junior, miembros intermedios y miembros senior. Ofrecemos diferentes descuentos para diferentes niveles de miembros. No hacemos descuento en libros para socios junior, 10% para socios intermedios y 20% para socios senior.

Esperamos que cuando el usuario pague, solo necesite deslizar el código de barras del libro, y el socio deslizar su tarjeta de membresía nuevamente, para que el personal de la caja pueda saber directamente cuánto se le debe cobrar al cliente.

En el caso de no usar patrones, podemos usar declaraciones en el método de liquidación if/elsepara distinguir diferentes miembros para calcular el precio.

Pero, ¿qué pasa si queremos cambiar el descuento de miembro junior a un 12 % de descuento algún día? ¿Qué pasa si quiero lanzar una súper membresía algún día? ¿Qué pasa si un día quiero limitar la cantidad de libros que se pueden descontar para los miembros intermedios?

Usando if\elseel sistema diseñado, todos los algoritmos se escriben juntos, siempre que haya un cambio, tengo que modificar toda la clase. Todos sabemos que mientras se modifica el código, es posible introducir problemas. Para evitar este problema, podemos usar el patrón de estrategia. . .

Para el sistema de caja registradora, al calcular las cuentas por cobrar, un cliente solo puede ser uno de los miembros principales, intermedios y senior. Diferentes afiliados utilizan diferentes algoritmos para calcular los precios. El sistema de caja registradora en realidad no se preocupa por la relación entre los tipos de membresía específicos y los descuentos. Tampoco desea que los cambios entre membresías y descuentos afecten el sistema de pago.

Antes de presentar la implementación específica del patrón de estrategia, consolidemos algunos principios de diseño orientado a objetos: 封装变化, 多用组合,少用继承, 针对接口编程,不针对实现编程. Piense en cómo se puede aplicar al patrón de estrategia y cuáles son los beneficios.

Método para realizar

El patrón de estrategia incluye los siguientes roles:

Contexto: clase de entorno

Estrategia: clase de estrategia abstracta

ConcreteStrategy: clase de estrategia concreta

[ estrategia][4]

Usamos el patrón de estrategia para realizar el sistema de caja registradora de la librería. Podemos abstraer miembros en una clase de estrategia, y diferentes tipos de miembros son clases de estrategia específicas. El algoritmo para calcular precios se implementa en diferentes clases de estrategia. Luego integre los miembros en la caja registradora mediante combinación.

Primero defina una interfaz, esta interfaz es una clase de estrategia abstracta, esta interfaz define el método de cálculo del precio y el método de implementación específico está definido por la clase de estrategia específica.

/**
 * Created by hollis on 16/9/19. 会员接口
 */
public interface Member {

    /**
     * 计算应付价格
     * @param bookPrice 书籍原价(针对金额,建议使用BigDecimal,double会损失精度)
     * @return 应付金额
     */
    public double calPrice(double bookPrice);
}

Para diferentes miembros, defina tres clases de estrategia específicas, y cada clase implementa el método de cálculo de precios respectivamente.

/**
 * Created by hollis on 16/9/19. 初级会员
 */
public class PrimaryMember implements Member {

    @Override
    public double calPrice(double bookPrice) {
        System.out.println("对于初级会员的没有折扣");
        return bookPrice;
    }
}

/**
 * Created by hollis on 16/9/19. 中级会员,买书打九折
 */
public class IntermediateMember implements Member {

    @Override
    public double calPrice(double bookPrice) {
        System.out.println("对于中级会员的折扣为10%");
        return bookPrice * 0.9;
    }
}

/**
 * Created by hollis on 16/9/19. 高级会员,买书打八折
 */
public class AdvancedMember implements Member {

    @Override
    public double calPrice(double bookPrice) {
        System.out.println("对于高级会员的折扣为20%");
        return bookPrice * 0.8;
    }
}

Las definiciones de las categorías anteriores incorporan 封装变化los principios de diseño, y los cambios en los métodos de descuento específicos de diferentes miembros no afectarán a otros miembros.

Después de definir la clase de estrategia abstracta y la clase de estrategia específica, definamos la clase de entorno.La llamada clase de entorno es la clase del algoritmo integrado. En este ejemplo, el sistema de caja registradora. Los miembros se integran de forma combinada.

/**
 * Created by hollis on 16/9/19. 书籍价格类
 */
public class Cashier {

    /**
     * 会员,策略对象
     */
    private Member member;

    public Cashier(Member member){
        this.member = member;
    }

    /**
     * 计算应付价格
     * @param booksPrice
     * @return
     */
    public double quote(double booksPrice) {
        return this.member.calPrice(booksPrice);
    }
}

Esta clase Cajero es una clase de entorno, y la definición de esta clase incorpora 多用组合,少用继承dos 针对接口编程,不针对实现编程principios de diseño. Dado que aquí se adopta el método de combinación + interfaz, no necesitamos modificar la clase Cajero cuando lancemos supermiembros más adelante. Sólo define uno SuperMember implements Membermás.

Definamos un cliente para probarlo:

/**
 * Created by hollis on 16/9/19.
 */
public class BookStore {

    public static void main(String[] args) {

        //选择并创建需要使用的策略对象
        Member strategy = new AdvancedMember();
        //创建环境
        Cashier cashier = new Cashier(strategy);
        //计算价格
        double quote = cashier.quote(300);
        System.out.println("高级会员图书的最终价格为:" + quote);

        strategy = new IntermediateMember();
        cashier = new Cashier(strategy);
        quote = cashier.quote(300);
        System.out.println("中级会员图书的最终价格为:" + quote);
    }
}

//对于高级会员的折扣为20%
//高级会员图书的最终价格为:240.0
//对于中级会员的折扣为10%
//中级会员图书的最终价格为:270.0

Como se puede ver en el ejemplo anterior, el patrón de estrategia solo encapsula el algoritmo y proporciona nuevos algoritmos para insertar en el sistema existente.El patrón de estrategia no decide cuándo usar qué algoritmo. Depende del cliente decidir qué algoritmo usar bajo qué circunstancias.

  • El enfoque del patrón de estrategia.

    • El enfoque del patrón de estrategia no es cómo implementar algoritmos, sino cómo organizar y llamar a estos algoritmos, para que la estructura del programa sea más flexible, con mejor mantenibilidad y escalabilidad.
  • Igualdad algorítmica

    • Una gran característica del patrón de estrategia es la igualdad de cada algoritmo de estrategia. Para una serie de algoritmos de estrategia específicos, el estado de todos es exactamente el mismo. Es debido a esta igualdad que los algoritmos pueden reemplazarse entre sí. Todos los algoritmos de políticas también son independientes entre sí en términos de implementación y no dependen entre sí.

    • Entonces, esta serie de algoritmos de políticas se puede describir así: Los algoritmos de políticas son diferentes implementaciones del mismo comportamiento.

  • Exclusividad de la política de tiempo de ejecución

    • Durante la operación, el modo de estrategia solo puede usar un objeto de implementación de estrategia específico en cada momento. Aunque puede cambiar dinámicamente entre diferentes implementaciones de estrategia, solo se puede usar uno al mismo tiempo.
  • comportamiento publico

    • Es común ver que todas las clases de estrategias concretas comparten algún comportamiento común. En este momento, estos comportamientos públicos deben colocarse en la clase de estrategia de rol de estrategia abstracta común. Por supuesto, en este momento, el rol de estrategia abstracta debe implementarse con una clase abstracta de Java en lugar de una interfaz. ([Modo de estrategia de "JAVA y modo"][5])

Ventajas y desventajas del patrón de estrategia.

ventaja

  • El modo de estrategia proporciona un soporte perfecto para el "principio de abrir-cerrar". Los usuarios pueden elegir algoritmos o comportamientos sin modificar el sistema original, y también pueden agregar de manera flexible nuevos algoritmos o comportamientos.
  • El patrón de estrategia proporciona una forma de administrar familias de algoritmos relacionados. Una jerarquía de clases de estrategia define un algoritmo o familia de comportamientos. El uso adecuado de la herencia puede mover el código común a la clase principal, evitando así la duplicación de código.
  • Utilice el patrón de estrategia para evitar el uso de múltiples sentencias condicionales (if-else). Las declaraciones condicionales múltiples no son fáciles de mantener. Mezcla la lógica de qué algoritmo o comportamiento adoptar con la lógica del algoritmo o comportamiento, y las enumera todas en una declaración condicional múltiple, que es más primitiva y retrógrada que el método de herencia. .

defecto

  • Los clientes deben conocer todas las clases de pólizas y decidir por sí mismos cuál utilizar. Esto significa que el cliente debe comprender la diferencia entre estos algoritmos para seleccionar la clase de algoritmo adecuada en el momento adecuado.
  • Debido a que el patrón de estrategia encapsula cada implementación de estrategia específica por separado en una clase, si hay muchas estrategias alternativas, la cantidad de objetos será considerable. El número de objetos se puede reducir hasta cierto punto utilizando el patrón de peso ligero.

Supongo que te gusta

Origin blog.csdn.net/zy_dreamer/article/details/132364399
Recomendado
Clasificación