Los consejos y trucos de Zhuge Liang resultaron ser el famoso patrón de diseño de Java: patrón de estrategia

Escenarios de aplicación

JD.com, Tmall Double Eleven, promoción de productos del Día de San Valentín, varios productos tienen diferentes actividades de promoción

  • Reducción total: total 200 menos 50
  • Cada deducción completa: cada 100 completo menos 10
  • Descuento: 20% de descuento para dos artículos, 30% de descuento para tres artículos
  • Cantidad menos: tres piezas completas menos el precio más bajo

Los clientes pueden elegir varios de ellos para cortarse las manos al realizar un pedido. ¿Cómo puede el back-end manejar el cálculo del monto de manera flexible? Puede haber más promociones en diferentes festivales en el futuro. Cómo calcular el monto del pedido ?

Ejemplo de implementación simple

public class OrderService {
    
    
    public Order OrderPrices(Order order, String promotion) {
    
    
        if (promotion.equals("promotion-1")) {
    
    
                //计算金额
        } else if (promotion.equals("promotion-2")) {
    
    
                //计算金额
        }

        switch (promotion) {
    
    
            case "promotion-1" :
                //计算金额
                break;
            case "promotion-2" :
                //计算金额
                break;
        }
        return order;
    }
}

No hay ningún problema con el uso de if else o switch case como se mencionó anteriormente, pero habrá muchos tipos de actividades promocionales. En este caso, habrá mucho contenido en if else o switch case, por lo que la forma de mejorarlo
puede ser pensado, cada uno El método de promoción será mejor si se saca por separado, basado en el principio de diseño de este método: el principio de responsabilidad única

public class OrderService {
    
    
    public Order OrderPrices(Order order, String promotion) {
    
    
        if (promotion.equals("promotion-1")) {
    
    
            calPromotion1(order);
        } else if (promotion.equals("promotion-2")) {
    
    
            calPromotion2(order);
        }

        switch (promotion) {
    
    
            case "promotion-1" :
                calPromotion1(order);
                break;
            case "promotion-2" :
                calPromotion2(order);
                break;
        }
        return order;
    }

    public Order calPromotion1(Order order) {
    
    
        return order;
    }

    public Order calPromotion2(Order order) {
    
    
        return order;
    }
}

Aunque la mejora anterior es mejor, las actividades de promoción cambian constantemente y la clase OrderService debe modificarse tan pronto como se realiza el cambio. La clase OrderService trata sobre pedidos y espera que se cambien menos. Lo que cambia constantemente es el
análisis del algoritmo de promoción . Lo que ha cambiado aquí es un algoritmo diferente para el mismo comportamiento, por lo que debes mejorarlo

Mejora el código

Para implementar diferentes algoritmos para el mismo comportamiento, podemos usar interfaces para definir comportamientos y diferentes algoritmos para implementar interfaces por separado.
Principio de diseño: cerrado para modificación, abierto para extensión

public interface PromotionAlgorithm {
    
    
    Order promotionAlgorithm(Order order);
}
public class PromotionAlgorithm1 implements PromotionAlgorithm {
    
    
    @Override
    public Order promotionAlgorithm(Order order) {
    
    
        System.out.println("满200减50");
        return order;
    }
}
public class PromotionAlgorithm2 implements PromotionAlgorithm {
    
    
    @Override
    public Order promotionAlgorithm(Order order) {
    
    
        System.out.println("满2件打8折");
        return order;
    }
}
public class OrderService {
    
    
    public Order OrderPrices(Order order, String promotion) {
    
    
        if (promotion.equals("promotion-1")) {
    
    
            return new PromotionAlgorithm1().promotionAlgorithm(order);
        } else if (promotion.equals("promotion-2")) {
    
    
            return new PromotionAlgorithm2().promotionAlgorithm(order);
        }

        switch (promotion) {
    
    
            case "promotion-1" :
                return new PromotionAlgorithm1().promotionAlgorithm(order);
            case "promotion-2" :
                return new PromotionAlgorithm2().promotionAlgorithm(order);
        }
        return order;
    }
}

Implemente cada algoritmo de promoción por separado y luego utilícelo. Este es el
diagrama de clases de aplicación del patrón de estrategia :
Inserte la descripción de la imagen aquí

Modo de estrategia

definición

El modo de estrategia define una serie de algoritmos, y encapsula cada algoritmo, y permite que se reemplacen entre sí, de modo que el algoritmo pueda cambiar independientemente de los usuarios que lo utilicen.

intención

Definir una serie de algoritmos, encapsularlos uno por uno y hacerlos intercambiables

Principalmente resuelve el problema

En el caso de múltiples algoritmos similares, el uso de if ... else es complicado y difícil de mantener

Cuándo usar

Un sistema tiene muchas clases y lo que las distingue es su comportamiento directo.

Pros y contras

ventaja:
1: Se pueden cambiar varios algoritmos a voluntad
2: Puede evitar el problema causado por el uso de múltiples juicios
3: Buena escalabilidad

Desventajas:
1: Hay más clases de estrategia.
2: Todas las clases de estrategia deben estar expuestas al mundo exterior.
Veamos el diagrama de clases a continuación:
Inserte la descripción de la imagen aquí
los roles involucrados:

  1. Rol de contexto: tener una referencia a la clase Stratogy
  2. Rol de estrategia abstracta (estrategia): este es un rol abstracto, generalmente implementado por una interfaz o clase abstracta, este rol proporciona todas las interfaces requeridas por la clase de estrategia específica
  3. Rol de estrategia específica (ConcreteStartegy): algoritmos o comportamientos relacionados con el empaque

Clase de contexto:

public class Context {
    
    

    private Strategy strategy;

    /** 策略方法 */
    public void contextInterface() {
    
    
        strategy.strategyInterface();
    }
}

Clase de estrategia:

public interface Strategy {
    
    
    /** 策略方法 */
    void strategyInterface();
}

Clase ConcreteStrategy:

public class ConcreteStrategy implements Strategy{
    
    

    /** 策略方法 */
    @Override
    public void strategyInterface() {
    
    
        //do something
    }
}

Consejos de Zhuge Liang

En ese entonces, cuando Zhao Yun protegió a Liu Bei para que no ingresara al país de Wu para casarse con una mujer hermosa, Zhuge Liang le dio tres consejos con tres trucos y le pidió a Zhao Yun que actuara de acuerdo con la situación. Estos tres consejos y trucos están en consonancia con el modo de estrategia. Parece que Zhuge Liang no es el iniciador del modo de estrategia, sino también el practicante original. El siguiente es un pequeño ejemplo: la
Inserte la descripción de la imagen aquí
interfaz de consejos y trucos:

public interface SeminalVesicle {
    
    

    /** 按计行事 */
    String tricks();
}

Hacer de acuerdo con la clase de implementación del plan:

public class BackDoor implements SeminalVesicle {
    
    
    /** 按计行事 */
    @Override
    public String tricks() {
    
    
        return "走乔国老的后门";
    }
}
public class GoBack implements SeminalVesicle {
    
    
    /** 按计行事 */
    @Override
    public String tricks() {
    
    
        return "骗刘备回去";
    }
}
public class Retreat implements SeminalVesicle {
    
    
    /** 按计行事 */
    @Override
    public String tricks() {
    
    
        return "请孙夫人退兵";
    }
}

Clase de Zhao Yun:

public class ZhaoYun {
    
    

    private SeminalVesicle seminalVesicle;

    public ZhaoYun(SeminalVesicle seminalVesicle) {
    
    
        this.seminalVesicle = seminalVesicle;
    }

    /** 按计行事 */
    public String act() {
    
    
        return seminalVesicle.tricks();
    }
}

Categoría de prueba:

public class Test {
    
    

    public static void main(String[] args) {
    
    
        ZhaoYun zhaoYun = new ZhaoYun(new Retreat());
        System.out.println("赵云按计行事");
        System.out.println(zhaoYun.act());
    }
}

Diagrama de clases:
Inserte la descripción de la imagen aquí
debe tenerse en cuenta que si hay más estrategias, casi más de 4, debe considerar el uso del modo mixto para evitar la expansión de la estrategia

Supongo que te gusta

Origin blog.csdn.net/qq_34365173/article/details/108044954
Recomendado
Clasificación