基于 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");
}
}