if-else
假設現(xiàn)在要開發(fā)一個郵件服務萍诱,要對接所有的郵件服務提供廠商,那么代碼可能是這樣的:
public class MailHandle {
public void send(String providerName, String msg) {
// 如果要發(fā)到 qq郵箱
if ("qq".equals(providerName)) {
sendMsgToQQ(msg);
}
// 如果要發(fā)到網(wǎng)易郵箱
else if ("ntes".equals(providerName)) {
sendMsgToNtes(msg);
}
// 如果要發(fā)到阿里云郵箱
else if ("alibaba".equals(providerName)) {
sendMsgToAlibaba(msg);
}
}
}
Oh,My God!這簡直是災難,讓我們用策略模式讓代碼更加具備擴展性吧霸褒。
設計思想
Context: 對策略進行封裝司顿,對外暴露統(tǒng)一的方法send()芒粹。
Strategy: 策略接口,定義抽象方法。
implStrategy: 圖中的QQ,NTES,Alibaba都是Strategy的實現(xiàn)類大溜。實現(xiàn)具體的業(yè)務方法化漆。
代碼實現(xiàn)
- MailStrategyService
public interface MailStrategyService {
/**
* 服務提供商名稱
*
* @return
*/
public String getServiceProviderName();
/**
* 發(fā)送郵件
*
* @param message
*/
public void send(String message);
}
- NASDAQMailStrategyServiceImpl
@Service
@Slf4j
public class NASDAQMailStrategyServiceImpl implements MailStrategyService {
@Override
public String getServiceProviderName() {
return "ntes";
}
@Override
public void send(String message) {
log.info("現(xiàn)在向網(wǎng)易郵箱發(fā)送郵件:{}",message);
}
}
- QQMailStrategyServiceImpl
@Service
@Slf4j
public class QQMailStrategyServiceImpl implements MailStrategyService {
@Override
public String getServiceProviderName() {
return "qq";
}
@Override
public void send(String message) {
log.info("向QQ郵箱發(fā)送郵件:{}",message);
}
}
- MailStrategyContext
@Component
@Slf4j
@Getter
public class MailStrategyContext {
/**
* 策略
* KEY為業(yè)務編碼
* VALUE為具體實現(xiàn)類
*/
private final ConcurrentHashMap<String, MailStrategyService> strategy = new ConcurrentHashMap<>();
/**
* 注入所有實現(xiàn) MailStrategyService 接口的類
* 這里使用的是構造注入的方式將Bean注入進來
*
* @param mailServiceList
*/
public MailStrategyContext(List<MailStrategyService> mailServiceList) {
log.info("開始注入策略");
mailServiceList.forEach(mailServiceImpl -> {
log.info("當前策略類:{}", mailServiceImpl.getClass().getName());
strategy.put(mailServiceImpl.getServiceProviderName(), mailServiceImpl);
});
log.info("注入策略完畢");
}
/**
* 發(fā)送郵件
*
* @param strategyName 策略名稱
* @param message 發(fā)送郵件信息
*/
public void send(String strategyName, String message) {
MailStrategyService mailStrategyService = strategy.get(strategyName);
mailStrategyService.send(message);
}
}
- StrategyController
@RestController
@RequestMapping("/mail")
public class StrategyController {
@Autowired
private MailStrategyContext mailStrategy;
@PostMapping("/{bussinessCode}/send")
public void sendMail(@PathVariable(value = "bussinessCode") String bussinessCode,
@RequestParam(value = "message") String message) {
mailStrategy.send(bussinessCode, message);
}
}
- 使用PostMan測試
-
發(fā)到QQ郵箱
-
發(fā)到網(wǎng)易郵箱
if-else,Goodbye!