在Java中我们有一种常用的策略模式
1.行为统一
2.来源分散
3.调用以类型区分
以多方支付,多方短信和多方推送这种都可以以策略模式去设计方便调用
例如短信:
声明一个统一接口,那就必须存在两个函数一个区分类型,一个做实际行为
public interface SmsProvider {
//获取类型
String getProviderName();
//行为操作
Void buildRequest(SmsRequest request);
}
接下来我们有两家短信公司用来实现接口,触发提交短信的发送
public class SendAlibabaSubmit implements SmsProvider {
@Override
public String getProviderName() {
return "阿里短信"; //记得短信类型用枚举或常量最好
}
@Override
public Void buildRequest(SmsRequest smsRequest) {
// 请求阿里短信的发送详细
}
}
public class SendBaiduSubmit implements SmsProvider {
@Override
public String getProviderName() {
return "百度短信";
}
@Override
public Void buildRequest(SmsRequest smsRequest) {
// 请求百度短信的发送详细
}
}
然后我们在Controller调用,这里也是最重要的一步了,需要把注入后的SmsProvider对应实现类进行装载,然后以名称去调用
public class SmsController{
private Map<String, SmsProvider> smsProviders;
@RequestMapping(value = "smsSend")
public void smsSend(){
@RequestParam(required = true, value = "phone") String phone,
@RequestParam(required = true, value = "smsType") String smsType){
// 一般在启动的时候写个工厂类就注入了,这里是方便看到逻辑,获取所有接口实现方的 短信类型
if(smsProviders == null){
// String[] providerNames = context.getBeanNamesForType(SmsProvider.class, true, false);
// SmsProvider provider = context.getBean("百度短信", SmsProvider.class);
// SmsProvider provider = context.getBean("阿里短信", SmsProvider.class);
// smsProviders.put("",provider);
}
SmsProvider smsProvider = smsProviders.get(smsType);
SmsRequest smsRequest = new(smsType, phone);// 参数自己随便传
smsProvider.buildRequest(smsRequest);
}
}