栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

springboot下使用最常用的【策略设计模式】优雅干掉if else!!!

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

springboot下使用最常用的【策略设计模式】优雅干掉if else!!!

推荐好文:
2.5万字详解23种设计模式

2.5万字讲解DDD领域驱动设计,从理论到实践掌握DDD分层架构设计

微服务springcloud环境下基于Netty搭建websocket集群实现服务器消息推送----netty是yyds

文章目录
  • 一、且看代码中令人头疼的if esle
  • 二、且看我破你
    • 1. 首先定义一个枚举:
    • 2. 定义一个支付接口
    • 3. 定义四个类实现支付接口
    • 4. 定义上下文环境对象
    • 5. 测试
  • 三、总结

一、且看代码中令人头疼的if esle

先举一个例子,淘宝购物支付的时候,我们可以选择多种支付方式,如下

public class PayDemo {

public String pay(String payType) {

    String pay = "";
    if ("1".equals(payType)) {
        pay = "账户余额支付";
    } else if ("2".equals(payType)) {
        pay = "余额宝支付";
    } else if ("3".equals(payType)) {
        pay = "花呗支付";
    } else if ("4".equals(payType)) {
        pay = "银行卡支付";
    } else {
        pay = "其他支付";
    }

    System.out.println(pay);
    return pay;
}

}
像这样的if…else控制语句,代码里滥用会大大降低代码的可读性、可维护性、可扩展性以及灵活性,进而使整个软件系统造成危害。因为在实际的项目中,需求往往是不断变化的,新需求也层出不穷,因此违反了违反单一职责原则和开闭原则,而且有些公司的代码审查会通不过。所以,if else的替代方案是很有必要的,如卫语句,枚举,工厂模式,策略模式,状态模式等等。

二、且看我破你

(1)针对于方法级别的if else,使用枚举,工厂模式,策略模式等方案破解,点击下方的阅读原文可以查看CSDN的原文。

(2)针对于类级别的if else在业务复杂的时候是最常用的,使用策略模式破解如下,牢记四步走战略

1. 首先定义一个枚举:
@Getter
public enum PayTypeEnum {

    BALANCE("1","账户余额支付"),
    YU_E_BAO("2","余额宝支付"),
    HUA_BEI("3","花呗支付"),
    BANK("4","银行卡支付");
    
    private String code;
    private String value;

    PayTypeEnum(String code,String value) {
        this.code = code;
        this.value = value;
    }
}
2. 定义一个支付接口
public interface Pay {

    
    PayTypeEnum getPayType();

    
    void pay();
}
3. 定义四个类实现支付接口

(1)账户余额支付类

@Service
public class BalancePay implements Pay {

    
    @Override
    public PayTypeEnum getPayType() {
        return PayTypeEnum.BALANCE;
    }

    
    @Override
    public void pay() {
        System.out.println(getPayType().getValue());
    }
}

(2)余额宝支付类


@Service
public class YuEBaoPay implements Pay {

    
    @Override
    public PayTypeEnum getPayType() {
        return PayTypeEnum.YU_E_BAO;
    }

    
    @Override
    public void pay() {
        System.out.println(getPayType().getValue());
    }
}

(3)花呗支付类


@Service
public class HuaBeiPay implements Pay {

    
    @Override
    public PayTypeEnum getPayType() {
        return PayTypeEnum.HUA_BEI;
    }

    
    @Override
    public void pay() {
        System.out.println(getPayType().getValue());
    }
}

(4)银行卡支付类

@Service
public class BankPay implements Pay {

    
    @Override
    public PayTypeEnum getPayType() {
        return PayTypeEnum.BANK;
    }

    
    @Override
    public void pay() {
        System.out.println(getPayType().getValue());
    }
}
4. 定义上下文环境对象
@Service
public class PayContext {

    
    private final Map payMap = new ConcurrentHashMap<>();

    
    @Autowired
    private ApplicationContext applicationContext;

    
    @PostConstruct
    private void init() {
        
        Map beanMap = applicationContext.getBeansOfType(Pay.class);
        
        beanMap.forEach((key, value) -> payMap.put(value.getPayType().getCode(), value));
    }

    
    public void pay(String payType){
        payMap.get(payType).pay();
    }
}
5. 测试
@RunWith(value = SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = DemoApplication.class)
public class SpringbootPayTest {

    @Autowired
    private PayContext payContext;

    @Test
    public void test(){
        payContext.pay(PayTypeEnum.BALANCE.getCode());
    }
}

结果如下:


三、总结

如果后续有新的支付方式只需要在枚举加入对应的类型和创建新的支付类实现pay接口,完全不用动其他的类,满足了开闭原则,此方案提高了扩展性,可维护性,还有代码逼格,完全通过了公司的代码检查!
更多优化if else的方式,大家可以看这篇文章!
代码中如何干掉太多的if else即if else的多种替代方案

如果看到这里,说明你喜欢这篇文章,请转发,点赞。关注【微信公众号】微信搜索【老板来一杯java】回复【进群】即可进入无广告交流群!【进群】即可获取【java基础经典面试】一份!和【DDD领域驱动设计实战落地解惑】PDF一份!

好文推荐:
MySQL查询语句执行顺序以及各关键字的详解,并实战分组后每组显示前几条数据
微服务 分布式 集群 负载均衡详述
SpringCloud核心组件概述(五大神兽)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1002781.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号