Skip to content

基于 Spring Boot 优雅使用策略模式

上一篇基于 spring-plugin 插件开发实际上也是一种策略模式,本文基于 springboot bean 注入来完成策略模式

定义接口

java
public interface SmsService {

    /**
     * 业务方法
     */
    void send();

    /**
     * 表示短信平台
     */
    String platform();
}

定义实现类

java
@Component
@Slf4j
public class AliSmsService implements SmsService{
    @Override
    public void send() {
        log.info("阿里短信平台");
    }

    @Override
    public String platform() {
        return "ali";
    }
}

@Component
@Slf4j
public class TxSmsService implements SmsService{
    @Override
    public void send() {
      log.info("腾讯云平台");
    }

    @Override
    public String platform() {
        return "tx";
    }
}

定义策略模式工厂类

利用 spring 构造器注入,自动收集相关的实现类

java
@Component
public class SmsServiceFactory {

    private Map<String,SmsService> SMS_MAP = new HashMap<>();


    public SmsServiceFactory(List<SmsService>  list) {
        list.stream().forEach(smsService -> {
            SMS_MAP.put(smsService.platform(),smsService);
        });
    }


    public void send(String strategy) {
        SmsService smsService = this.SMS_MAP.get(strategy);
        if (smsService == null) {
            throw new IllegalArgumentException("不支持的短信平台");
        }
        smsService.send();
    }
}

编写测试用例

java
@SpringBootTest
public class SmsServiceTest {


    @Autowired
    private SmsServiceFactory smsServiceFactory;



    @Test
    public void test() {
        smsServiceFactory.send("ali");
        smsServiceFactory.send("tx");
    }

}

Released under the MIT License.