你还在使用if-else写代码吗,今天带你领略下策略模式的魅力!

文章介绍了策略模式的概念,它用于解耦策略的定义、创建和使用。通过示例展示了如何用策略模式替换传统的if-else结构,以处理不同会员类型的权益计算,从而避免了大量的条件分支。文章还提供了代码实现,包括策略接口、策略类和策略工厂,以及如何通过工厂获取并执行相应的策略。最后,总结了策略模式的优点,如遵循开闭原则,但也指出可能产生的额外类导致的复杂性增加。
摘要由CSDN通过智能技术生成

1、什么是策略模式

策略模式其实也是在解耦,把策略的定义、创建、使用这三个部分解耦开来,因为本身策略模式也是基于接口编程,这样其实可以简单的理解客户端调用使用接口进行编程,可以通过工厂方法创建对应的策略模式,进而完成对应的程序功能。

2、代码实现

如果我们通过会员类型来判断会员权益的话,通常通过if-else来实现,但是如果会员类型很多的话,就会产生很多的if-else,这会显得不太雅观。所以这个时候策略模式出现了。

普通if-else实现:

public class DemoTest {
    public Object cal(String type){
        if (type.equals("L1")){
            return "L1 10";
        }else if (type.equals("L2")){
            return "L2 20";
        }
        return "0";
    }
}

使用策略模式:
主要的思路是创建一个策略接口,以及多个实现该接口的类。同时还要创建一个工厂,内聚所有的策略类。

//策略接口
public interface MemberStrategy {
	//计算会员权益
    Object cal();
    //会员类型值
    String getSupportType();
}
//策略类1
@Component
public class CommonMemberStrategy implements MemberStrategy{
    @Override
    public Object cal() {
        return "L1 10";
    }

    @Override
    public String getSupportType() {
        return "L1";
    }
}

//策略类2
@Component
public class UpperMemberStrategy implements MemberStrategy{
    @Override
    public Object cal() {
        return "L2 20";
    }

    @Override
    public String getSupportType() {
        return "L2";
    }
}

//策略工厂
@Component
@Slf4j
public class MemberStrategyFactory {
	//注入所有的策略接口类
    @Autowired
    List<MemberStrategy> memberStrategies;

    public MemberStrategy getStrategyByType(String type){
        for (MemberStrategy memberStrategy : memberStrategies) {
            if (type.equals(memberStrategy.getSupportType())){
                return memberStrategy;
            }
        }
        return null;

    }
  
}
//接口测试类
@RestController
@RequestMapping
public class StrategyRest {
    @Autowired
    MemberStrategyFactory memberStrategyFactory;

    @RequestMapping("/strategy")
    public Object strategy(@RequestParam String type){
        MemberStrategy memberStrategy = memberStrategyFactory.getStrategyByType(type);
        return memberStrategy.cal();
    }
}

测试

如果我们调用接口/strategy,并且参数tyoe="L1"的话,预期返回L1 10。

下面用postman测试下,结果和预期是一样的
在这里插入图片描述

3、总结

1、策略模式提供了对“开闭原则”的完美支持,用户可以在不修改原有系统的基础上选择算法或行为,也可以灵活地增加新的算法或行为。
2、但是策略模式将造成产生很多策略类,增加代码的复杂度

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值