首页 > 其他分享 >策略模式实现短信平台切换

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

时间:2024-02-18 10:36:33浏览次数:24  
标签:短信 SmsPlatform 平台 SmsService 发送 切换 public String

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

首先,创建一个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);
    }
}

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

标签:短信,SmsPlatform,平台,SmsService,发送,切换,public,String
From: https://www.cnblogs.com/cgy1995/p/18018868

相关文章

  • Spring Boot + MyBatis-Plus 实现 MySQL 主从复制动态数据源切换
    MySQL主从复制是一种常见的数据库架构,它可以提高数据库的性能和可用性。动态数据源切换则可以根据业务需求,在不同场景下使用不同的数据源,比如在读多写少的场景下,可以通过切换到从库来分担主库的压力。在本文中,我们将介绍如何在SpringBoot中实现MySQL动态数据源切换,使用My......
  • ASCII编码的诞生:解决字符标准化与跨平台通信的需求
    在计算机的发展过程中,字符的表示和传输一直是一个重要的问题。为了实现字符的标准化和跨平台通信,ASCII(AmericanStandardCodeforInformationInterchange)编码应运而生。Ascii编码解码|一个覆盖广泛主题工具的高效在线平台(amd794.com)https://amd794.com/asciiencordec......
  • 华为云GES助力九洲平台:探索确定性运维的新实践
    本文分享自华为云社区《基于华为云GES的九洲平台确定性运维实践》,作者:华为云GES团队华为云SRE九洲团队。1制约运维自动化的三大挑战传统的云资源运维存在诸多问题:对风险的管控仍然依赖人工而不是工具系统,风火水电基础设施在遇到问题时因无法定位影响只能全局管控,使影响面无故......
  • 漏洞信息管理平台
    漏洞信息管理平台是用于收集、管理、分析和报告安全漏洞信息的工具。这些平台帮助组织识别、优先级排序和修复软件漏洞,以提高网络安全态势。它们可以是商业产品,也可以是开源项目。以下是一些著名的漏洞信息管理平台的例子:TenableNessus:TenableNessus是一个广泛使用的漏洞扫......
  • Cocos2dx中应用内部横竖屏切换
    {未实践https://blog.csdn.net/ByAlick/article/details/83009941}{语言环境:Cocos2dx3.6Lua5.1AndroidStudio3.0.1问题:如何在应用内部进行横竖屏切换?解决思路:         由于产品需求,必须在应用内部进行横竖屏切换(苦比〜_〜),没办法,网上教程一大把,大多数是在一......
  • 团购平台
     团购平台团购平台是指通过互联网平台,以团购形式为用户提供商品或服务的一种电子商务模式。根据搜索结果,当前社区团购赛道的主要平台可以分为以下几类:老牌社区团购头部选手:兴盛优选:成立于较早,覆盖区域广泛,已经完成多轮融资。  芙蓉兴盛十荟团:成立......
  • C++ Builder使用FMX多平台框架
    C++Builder使用FMX多平台框架C++Builder使用FMX多平台框架C++Builder使用FMX多平台框架......
  • 国产AI训练卡,对标美国NVIDIA公司的A100,华为昇腾Atlas 300T A2(Ascend 910B4)高性能GPU/N
    ChinahassuccessfullyachievedthelocalizationofAIchips,breakingthroughthetechnologicalrestrictionsimposedbytheU.S.governmentandrealizingindependentdesignandproductionofdomesticAIchips.Huawei'sAscend910modelAIchiphass......
  • 发送短信验证码
    1.发送验证码importrequestsimportreimportthreadingimportosimportrandomimportsocketimportstructimporttime#API接口初始化,按照手机号生成不同的网址definitAPI(phone):#短信接口API请求间隔时间备注请求方式请求参数需要SESSION的先决请求URL......
  • 【踩坑】Unity Android(安卓)平台 Render texture 有残留,即使调用 DiscardContents 还
    在编辑器环境下OK,打包成PC客户端也OK,但是打包成apk,在安卓手机上运行的时候就会有残留。 我的代码如下。主要是在LateUpdate()中,修改特定摄像机的cullmask,在捕捉到制定的rendertexture上(即此处的m_levelUnitRT)。 voidLateUpdate(){if(m_levelU......