策略模式代替IfElse和SwitchCase

使用策略模式的原因

在项目的起始阶段通常需求还是很明确的,但是到了后期因为各种需求的叠加,会导致业务逻辑中存在一长串的if else或者switch case,长达10几个的if else容易让人看着眼花,不利于代码阅读。所以用策略模式去改善是非常有必要的。

策略模式使用demo

这里就拿订单状态来改造一波,原始代码如下

switch (orderInfoDO.getOrderStatus().toString()){
    case "UNPAID":
        vo.setOrderStatusDescription("未支付");
        break;
    case "GRABBING":
        vo.setOrderStatusDescription("抢单中");
        break;
    case "DOING":
        vo.setOrderStatusDescription("进行中");
        break;
        。
        。
        。
}

使用策略模式

先设计一个接口

package com.xx.xx..strategy;

import com.xx.xx.enums.OrderStatus;

public interface OrderStatusStrategy {

    //获取订单状态枚举
    OrderStatus getOrderStatusEnum();

    //获取订单状态描述
    String getOrderStatusDescription();

    //解析参数,todo
    void reSolve(Object param);

}

未支付状态

package com.xx.xx.strategy;

import com.xx.xx.enums.OrderStatus;
import org.springframework.stereotype.Component;

@Component
public class UnpaidStatusStrategy implements OrderStatusStrategy{

    @Override
    public OrderStatus getOrderStatusEnum() {
        return OrderStatus.UNPAID;
    }

    @Override
    public String getOrderStatusDescription() {
        return "未支付";
    }

    @Override
    public void reSolve(Object param) {

    }
}

抢单中状态

package com.xx.xx.strategy;

import com.xx.xx.enums.OrderStatus;
import org.springframework.stereotype.Component;

@Component
public class GrabbingStatusStrategy implements OrderStatusStrategy{

    @Override
    public OrderStatus getOrderStatusEnum() {
        return OrderStatus.GRABBING;
    }

    @Override
    public String getOrderStatusDescription() {
        return "抢单中";
    }

    @Override
    public void reSolve(Object param) {

    }
}

以此类推
.
.
.

策略对外使用service

package com.xx.xx.strategy;

import com.xx.xx.enums.OrderStatus;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;

@Slf4j
@Component
public class OrderStatusStrategyService implements ApplicationContextAware {

    private ApplicationContext applicationContext;

    private ConcurrentHashMap<OrderStatus, OrderStatusStrategy> orderStatusStrategyMap = new ConcurrentHashMap<>();


    public String getOrderStatusDescription(OrderStatus orderStatus){
        OrderStatusStrategy orderStatusStrategy = orderStatusStrategyMap.get(orderStatus);
        if(Objects.isNull(orderStatusStrategy)){
            log.error("未获取到对应策略 orderStatus:{}, orderStatusStrategyMap.values:{}", orderStatus, orderStatusStrategyMap.keySet());
            return "";
        }
        return orderStatusStrategy.getOrderStatusDescription();
    }



    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
        Map<String, OrderStatusStrategy> strategyMap = this.applicationContext.getBeansOfType(OrderStatusStrategy.class);
        strategyMap.values().forEach(el -> orderStatusStrategyMap.put(el.getOrderStatusEnum(), el));
    }
}

switchcase改成策略模式之后

可以看到代码清晰多了,扩展性也强了

vo.setOrderStatusDescription(orderStatusStrategyService.getOrderStatusDescription(orderInfoDO.getOrderStatus()));
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
策略模式是一种行为设计模式,用于将不同的算法或策略封装成独立的类,并使它们可以互相替换,以实现更灵活的代码结构。相比于使用大量的 if-else 语句,策略模式可以提高代码的可读性、可维护性和可扩展性。 在使用策略模式时,您可以创建一个抽象策略类,定义一个共同的接口或抽象方法。然后,针对不同的算法或策略,创建具体的策略类,实现这个共同的接口或抽象方法。最后,在使用时,通过依赖注入或其他方式将具体策略类传递给使用它的对象。 下面是一个示例代码,演示了如何使用策略模式代替 if-else: ```python # 定义抽象策略类 class Strategy: def do_operation(self): pass # 定义具体策略类 class StrategyA(Strategy): def do_operation(self): print("执行策略A") class StrategyB(Strategy): def do_operation(self): print("执行策略B") class Context: def __init__(self, strategy): self.strategy = strategy def execute_strategy(self): self.strategy.do_operation() # 使用 strategy_a = StrategyA() strategy_b = StrategyB() context = Context(strategy_a) context.execute_strategy() # 输出:执行策略A context.strategy = strategy_b context.execute_strategy() # 输出:执行策略B ``` 在上述示例中,我们定义了一个抽象策略类 `Strategy`,其中包含了一个抽象方法 `do_operation`。然后,我们创建了两个具体策略类 `StrategyA` 和 `StrategyB`,它们分别实现了 `do_operation` 方法。 最后,我们创建了一个 `Context` 类,它接受一个具体策略类作为参数,并在 `execute_strategy` 方法中调用策略类的 `do_operation` 方法来执行具体的策略。 通过这种方式,我们可以根据需要动态地切换和使用不同的策略,而不需要使用大量的 if-else 来处理不同的情况。这提高了代码的可读性和可维护性,并且使得新的策略可以更方便地添加进来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值