Spring 微服务中如何消除 switch case?

解决思路

在 Spring 微服务中消除 switch case 的方法主要是通过使用策略模式(Strategy Pattern)或者工厂模式(Factory Pattern)来实现。

下面分别介绍这两种方法:

  1. 策略模式:该模式定义了一系列的算法,并将每个算法封装起来,使它们可以互换。在 Spring 微服务中,可以将每个 case 抽象成一个策略对象,然后使用一个策略工厂来创建和管理这些策略对象。这样,当需要添加新的 case 时,只需要添加一个新的策略对象即可,不需要修改原有代码。
  2. 工厂模式:该模式定义了一个工厂类,用于创建其他对象。在 Spring 微服务中,可以将每个 case 抽象成一个具体的实现类,然后使用一个工厂类来创建这些实现类的实例。当需要添加新的 case 时,只需要添加一个新的实现类即可,不需要修改原有代码。

实现案例

下面用具体的代码演示两种实现方式

策略模式

// 定义一个策略接口
public interface PaymentStrategy {
    void pay(double amount);
}

// 定义具体的策略实现类
public class PaypalPaymentStrategy implements PaymentStrategy {
    public void pay(double amount) {
        // 实现 PayPal 支付逻辑
    }
}

public class CreditCardPaymentStrategy implements PaymentStrategy {
    public void pay(double amount) {
        // 实现信用卡支付逻辑
    }
}

// 定义一个策略工厂类
public class PaymentStrategyFactory {
    public static PaymentStrategy createPaymentStrategy(String paymentMethod) {
        switch (paymentMethod) {
            case "Paypal":
                return new PaypalPaymentStrategy();
            case "CreditCard":
                return new CreditCardPaymentStrategy();
            default:
                throw new IllegalArgumentException("Invalid payment method: " + paymentMethod);
        }
    }
}

// 在业务逻辑中使用策略模式
public class Order {
    private PaymentStrategy paymentStrategy;

    public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
        this.paymentStrategy = paymentStrategy;
    }

    public void processOrder(double amount, String paymentMethod) {
        PaymentStrategy strategy = PaymentStrategyFactory.createPaymentStrategy(paymentMethod);
        strategy.pay(amount);
    }
}

工厂模式

// 定义一个支付接口
public interface Payment {
    void pay(double amount);
}

// 定义具体的支付实现类
public class PaypalPayment implements Payment {
    public void pay(double amount) {
        // 实现 PayPal 支付逻辑
    }
}

public class CreditCardPayment implements Payment {
    public void pay(double amount) {
        // 实现信用卡支付逻辑
    }
}

// 定义一个支付工厂类
public class PaymentFactory {
    public static Payment createPayment(String paymentMethod) {
        switch (paymentMethod) {
            case "Paypal":
                return new PaypalPayment();
            case "CreditCard":
                return new CreditCardPayment();
            default:
                throw new IllegalArgumentException("Invalid payment method: " + paymentMethod);
        }
    }
}

// 在业务逻辑中使用工厂模式
public class Order {
    private Payment payment;

    public void setPayment(Payment payment) {
        this.payment = payment;
    }

    public void processOrder(double amount, String paymentMethod) {
        Payment payment = PaymentFactory.createPayment(paymentMethod);
        payment.pay(amount);
    }
}

以上示例中,使用了策略模式和工厂模式来消除 switch case。

在业务逻辑中,通过调用策略工厂或者支付工厂来创建具体的策略对象或者支付对象。当需要添加新的策略或者支付方式时,

只需要添加一个新的策略实现类或者支付实现类即可,不需要修改原有代码。

设计模式集成Spring

首先,需要定义一个策略接口和多个具体的策略实现类:

public interface PaymentStrategy {
    void pay(double amount);
}

@Component
public class PaypalPaymentStrategy implements PaymentStrategy {
    public void pay(double amount) {
        // 实现 PayPal 支付逻辑
    }
}

@Component
public class CreditCardPaymentStrategy implements PaymentStrategy {
    public void pay(double amount) {
        // 实现信用卡支付逻辑
    }
}

接下来,需要在 Spring 配置文件中配置这些策略实现类:

<bean id="paypalPaymentStrategy" class="com.example.PaypalPaymentStrategy"/>
<bean id="creditCardPaymentStrategy" class="com.example.CreditCardPaymentStrategy"/>

然后,需要定义一个策略工厂类,用于创建和管理这些策略对象:

@Component
public class PaymentStrategyFactory {
    @Autowired
    private PaypalPaymentStrategy paypalPaymentStrategy;

    @Autowired
    private CreditCardPaymentStrategy creditCardPaymentStrategy;

    public PaymentStrategy createPaymentStrategy(String paymentMethod) {
        switch (paymentMethod) {
            case "Paypal":
                return paypalPaymentStrategy;
            case "CreditCard":
                return creditCardPaymentStrategy;
            default:
                throw new IllegalArgumentException("Invalid payment method: " + paymentMethod);
        }
    }
}

在业务逻辑中,需要使用这个策略工厂来创建具体的策略对象:

@Service
public class OrderService {
    @Autowired
    private PaymentStrategyFactory paymentStrategyFactory;

    public void processOrder(double amount, String paymentMethod) {
        PaymentStrategy strategy = paymentStrategyFactory.createPaymentStrategy(paymentMethod);
        strategy.pay(amount);
    }
}

这样就完成了在 Spring 中实现策略模式的代码。

使用 Spring 框架可以更加方便地管理和调用策略对象,同时也提高了代码的可维护性和可扩展性。

集成Spring实现方式

  1. 使用注解

可以使用 Spring 的注解功能,通过在具体策略实现类上添加注解来指定具体的策略实现类。例如:

@Component
@Qualifier("paypal")
public class PaypalPaymentStrategy implements PaymentStrategy {
    public void pay(double amount) {
        // 实现 PayPal 支付逻辑
    }
}

@Component
@Qualifier("creditCard")
public class CreditCardPaymentStrategy implements PaymentStrategy {
    public void pay(double amount) {
        // 实现信用卡支付逻辑
    }
}

在策略工厂类中,则可以使用 @Qualifier 注解来指定具体的策略实现类。例如:

@Component
public class PaymentStrategyFactory {
    @Autowired
    @Qualifier("paypal")
    private PaymentStrategy paypalPaymentStrategy;

    @Autowired
    @Qualifier("creditCard")
    private PaymentStrategy creditCardPaymentStrategy;

    public PaymentStrategy createPaymentStrategy(String paymentMethod) {
        switch (paymentMethod) {
            case "Paypal":
                return paypalPaymentStrategy;
            case "CreditCard":
                return creditCardPaymentStrategy;
            default:
                throw new IllegalArgumentException("Invalid payment method: " + paymentMethod);
        }
    }
}

2. 使用 lambda 表达式

如果项目使用的是 Java 8 及以上版本,则可以使用 lambda 表达式来替代传统的策略模式。例如:

@Component
public class PaymentStrategyFactory {
    public PaymentStrategy createPaymentStrategy(String paymentMethod) {
        Map<String, Consumer<Double>> strategies = new HashMap<>();
        strategies.put("Paypal", amount -> {
            // 实现 PayPal 支付逻辑
        });
        strategies.put("CreditCard", amount -> {
            // 实现信用卡支付逻辑
        });
        Consumer<Double> strategy = strategies.get(paymentMethod);
        if (strategy == null) {
            throw new IllegalArgumentException("Invalid payment method: " + paymentMethod);
        }
        return strategy::accept;
    }
}

在业务逻辑中,调用策略对象的方式也会有所不同。例如:

@Service
public class OrderService {
    @Autowired
    private PaymentStrategyFactory paymentStrategyFactory;

    public void processOrder(double amount, String paymentMethod) {
        PaymentStrategy strategy = paymentStrategyFactory.createPaymentStrategy(paymentMethod);
        strategy.pay(amount);
    }
}

这样,就使用 lambda 表达式实现了策略模式,并且代码更加简洁和易于理解。

原文链接:,转发请注明来源!