策略模式实现短信平台切换

如果你需要更通用的代码,以便在不同的短信平台之间进行切换,你可以使用策略模式来实现。策略模式允许你在运行时选择不同的策略(即短信平台),而无需改变主要的业务逻辑。

首先,创建一个SmsPlatform接口,定义发送短信的方法:

public interface SmsPlatform {
    void sendSms(String phoneNumber, String message);
}

然后,分别创建阿里、腾讯和华为短信平台的实现类:

@Service
public class AliSmsPlatform implements SmsPlatform {
    // 实现发送短信的逻辑
}

@Service
public class TencentSmsPlatform implements SmsPlatform {
    // 实现发送短信的逻辑
}

@Service
public class HuaweiSmsPlatform implements SmsPlatform {
    // 实现发送短信的逻辑
}

接下来,创建一个SmsService类,负责管理短信平台的选择和发送短信的操作:

@Service
public class SmsService {
    private final Map<String, SmsPlatform> platformMap;

    @Autowired
    public SmsService(List<SmsPlatform> smsPlatforms) {
        platformMap = smsPlatforms.stream()
                .collect(Collectors.toMap(platform -> platform.getClass().getSimpleName(), Function.identity()));
    }

    public void sendSms(String phoneNumber, String message) {
        for (SmsPlatform platform : platformMap.values()) {
            try {
                platform.sendSms(phoneNumber, message);
                return; // 发送成功后立即返回
            } catch (Exception e) {
                // 发送失败,继续下一个平台的尝试
            }
        }
        throw new RuntimeException("All SMS platforms are unavailable.");
    }
}

在以上代码中,SmsService的构造函数使用了List来自动注入所有实现了SmsPlatform接口的类,并将它们存储在一个Map中,以便根据平台名称快速获取对应的实现类。

最后,在调用短信发送的地方注入SmsService并使用它来发送短信:

@Service
public class YourService {
    private final SmsService smsService;

    @Autowired
    public YourService(SmsService smsService) {
        this.smsService = smsService;
    }

    public void sendSms(String phoneNumber, String message) {
        smsService.sendSms(phoneNumber, message);
    }
}

这样,你可以根据需要配置不同的短信平台实现类,并在运行时根据可用性进行切换。如果所有平台都不可用,将抛出运行时异常。

posted @ 2024-02-18 10:22  spiderMan1-1  阅读(22)  评论(0编辑  收藏  举报