在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);
   }
}

最后修改:2024 年 06 月 07 日
如果觉得我的文章对你有用,请随意赞赏