Hay demasiadas declaraciones if-else en el sistema de la empresa. Eliminé if-else con patrones de diseño

Usé la enumeración para eliminar la declaración if-else en el artículo anterior. Si estás interesado, puedes leer este artículo mío:

"

¿Cómo usar la enumeración para eliminar if / else? -Enumeración uso avanzado

"

Esta vez utilicé otros métodos para eliminar if-else.

antecedentes

Debe utilizar declaraciones if-else en su desarrollo habitual, sin embargo, una gran cantidad de declaraciones if-else no favorecen la lectura del código y afectan la complejidad del código. De todos modos, tuve dolor de cabeza mientras eliminaba el olor de Sonar.

Había demasiados problemas if-else en el código del sistema de la empresa anterior, lo que hacía que el código no fuera elegante. Para explicarlo aquí, simplifico la lógica empresarial.

Supongamos que tengo un método para calcular el precio real, que requiere la entrada del nivel del usuario y el precio real del producto, y devuelve el precio real del producto, el código es el siguiente:

Aquí levelestá el nivel del usuario, que originalPricees el precio original del producto. Si el nivel de usuario es "normal", el precio real devuelto es el precio original multiplicado por 1.0. Si el nivel de usuario es "vip", el precio real devuelto es el precio original multiplicado por 0,9. De lo contrario, se devuelve el precio original.

Como resultado, el precio de "vip" es:

getActualPrice()测试的真实价格为:90.0

El código anterior puede verse bien, pero el nivel del usuario también puede tener super vip (svip) y también puede tener ssvip. Puede haber más, entonces este método if-else serán muchos. Y a menudo modificará este método, que viola el principio de apertura y cierre en el principio de diseño. Por esta razón, pensé si es posible lograr la levelexpansión de nivel sin modificar este método .

Utilice patrones de diseño para eliminar if-else

Después de mucha deliberación, decidí usar patrones de diseño para eliminar if-else.

Calcular estrategia

public interface CalculateStrategy {
    String userLevel();
    BigDecimal discount(BigDecimal originalPrice);
}

Aquí primero escriba una interfaz de cálculo, que define dos métodos: obtener el nivel de usuario y el método de cálculo del precio correspondiente.

NormalStrategy

@Component
public class NormalStrategy implements CalculateStrategy {
    @Override
    public String userLevel() {
        return "normal";
    }

    @Override
    public BigDecimal discount(BigDecimal originalPrice) {
        return originalPrice.multiply(new BigDecimal("1.0"));
    }
}

Clase de implementación de nivel normal.

@Component
public class VipStrategy implements CalculateStrategy {
    @Override
    public String userLevel() {
        return "vip";
    }

    @Override
    public BigDecimal discount(BigDecimal originalPrice) {
        return originalPrice.multiply(new BigDecimal("0.9"));
    }
}

Clase de implementación a nivel vip.

Nuestro código para calcular el precio real es el siguiente:

Aquí creé un mapa, la clave del mapa almacena el nivel de usuario levely el valor almacena CalculateStrategyel objeto. Cuando se inicia el sistema, el contenedor de IoC SaleServicecreará objetos y luego el mapa se almacenará en todos los CalculateStrategyobjetos implementados .

Luego, escriba un getActualPriceWithStrategy()método para calcular el precio real del producto según el nivel de usuario. Si el usuario aumenta el nivel, sólo se necesita añadir la clase apropiada, como por ejemplo: SvipStrategy, SSvipStrategyy similares. De esta forma, no es necesario modificar getActualPriceWithStrategy()el contenido y se garantiza la seguridad de este método.

El código de prueba es el siguiente:

Resultados de la prueba:

getActualPriceWithStrategy()测试的真实价格为:90.0

De hecho, he usado el patrón de estrategia en el patrón de diseño anterior. Extraje el algoritmo en if-else y lo encapsulé por separado en una clase, de modo que el algoritmo sea independiente del llamador. Si cambia el algoritmo, solo necesita cambiar la clase de algoritmo, sin cambiar Llamador.

Por supuesto, if-else no se puede eliminar simplemente usando el modo de estrategia, puedes pensar en ello:

"

¿Se utilizan otros patrones de diseño en el código anterior?

"

Recomendado en el pasado

Escanee el código QR para ser más emocionante. O busque Lvshen_9 en WeChat , puede responder para obtener información en segundo plano

1.回复"java" 获取java电子书;

2.回复"python"获取python电子书;

3.回复"算法"获取算法电子书;

4.回复"大数据"获取大数据电子书;

5.回复"spring"获取SpringBoot的学习视频。

6.回复"面试"获取一线大厂面试资料

7.回复"进阶之路"获取Java进阶之路的思维导图

8.回复"手册"获取阿里巴巴Java开发手册(嵩山终极版)

9.回复"总结"获取Java后端面试经验总结PDF版

10.回复"Redis"获取Redis命令手册,和Redis专项面试习题(PDF)

11.回复"并发导图"获取Java并发编程思维导图(xmind终极版)

Otro: haga clic en [ Mis beneficios ] para tener más sorpresas.

 

Supongo que te gusta

Origin blog.csdn.net/wujialv/article/details/109109402
Recomendado
Clasificación