首页 > 其他分享 >策略模式进行发送短信

策略模式进行发送短信

时间:2023-12-24 21:35:23浏览次数:27  
标签:短信 String SmsStrategyKey sendSms 模式 发送 public strategyName 策略

业务场景

​ 查询数据库的配置表,看配置进行选择不同公司的短信服务

代码

策略代码
// 策略接口
public interface SmsSendStrategy {
    void sendSms(String phone, String template, Map<String,String> map);
}
// 腾讯短信实现策略
@Component
public class TencentSms implements SmsSendStrategy {
    @Override
    public void sendSms(String phone, String template, Map<String, String> map) {
        System.out.println("腾讯发送短信");
    }
}

// 阿里云短信实现策略
@Component
public class AliyunSms implements SmsSendStrategy {

    @Override
    public void sendSms(String phone, String template, Map<String, String> map) {
        System.out.println("阿里云发送短信");
    }
}
调用代码
//接口
public interface SmsService {
    void sendSms(String strategy);
}
//实现层
@Service
public class SmsServiceImpl implements SmsService {
    /**
     * 这个Map的key可以是字符串,这个地方用的枚举就是方便配置的时候知道可以配置哪些值
     *
     * @see StrategyKey
     */
    private final Map<SmsStrategyKey, SmsSendStrategy> sendStrategyMap = new HashMap<>();

    @Autowired
    public SmsServiceImpl(AliyunSms aliyunSms, TencentSms tencentSms) {
        sendStrategyMap.put(SmsStrategyKey.ALIYUN, aliyunSms);
        sendStrategyMap.put(SmsStrategyKey.TENCENT, tencentSms);
    }
//    /**
//     * 引入bean的另一种方式
//     *      这样引入的bean,sendStrategyMap的key是bean的名称
//     */
//    @Autowired
//    private Map<String, SmsSendStrategy> sendStrategyMap;


    /**
     * 根据策略进行短信发送
     *
     * @param strategyName 策略名称,用于找到对应的策略KEY
     */
    @Override
    public void sendSms(String strategyName) {
        //1、查询数据库
        //查询数据库获取strategyName,这个地方是传进来的
        //2、根据策略的名称查询出对应的KEY
        SmsStrategyKey type = SmsStrategyKey.getStrategyKey(strategyName);
        //3、根据key进行查询使用哪个策略
        SmsSendStrategy sendStrategy = sendStrategyMap.get(type);
        if (sendStrategy != null) {
            sendStrategy.sendSms("", "", new HashMap<>());
        } else {
            throw new IllegalArgumentException("未找到对应的策略");
        }
    }
}
其他代码
/**
 * 这个枚举的作用不是特别大
 *      感觉最大的作用就是在数据库知道该配置那些值
 */
public enum SmsStrategyKey {

    ALIYUN("aliyun"),
    TENCENT("tencent");
    private final String name;

    SmsStrategyKey(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public static SmsStrategyKey getStrategyKey(String strategyName) {
        for (SmsStrategyKey strategyKey : SmsStrategyKey.values()) {
            if (strategyKey.getName().equalsIgnoreCase(strategyName)) {
                return strategyKey;
            }
        }
       throw new RuntimeException("根据策略名称没有找到对应的KEY");
    }
}
controller
@RestController
public class SmsController {

    @Autowired
    private SmsService smsService;

    @GetMapping("send")
    public String send(String strategyName) {
        smsService.sendSms(strategyName);
        return "success";
    }
}

标签:短信,String,SmsStrategyKey,sendSms,模式,发送,public,strategyName,策略
From: https://www.cnblogs.com/9zhe/p/17924891.html

相关文章

  • 软件架构设计与模式之:数据库设计与数据访问模式
    1.背景介绍数据库设计和数据访问模式是软件架构和设计的核心领域之一。在现代软件系统中,数据库通常是系统的核心组件,负责存储和管理数据。数据访问模式则是一种设计模式,用于实现数据库操作的高效、可靠和可扩展的方式。在本文中,我们将讨论以下主题:背景介绍核心概念与联系核心算法原......
  • 设计模式<c++> (3)观察者模式
     /***ObserverDesignPattern**Intent:Letsyoudefineasubscriptionmechanismtonotifymultipleobjects*aboutanyeventsthathappentotheobjectthey'reobserving.**Notethatthere'salotofdifferenttermswithsimilarme......
  • 设计模式<c++> (2)单例模式
    #include<iostream>#include<thread>#include<mutex>classSingleton{private:staticSingleton*pinstance_;staticstd::mutexmutex_;protected:Singleton(conststd::stringvalue):value_(value){}~Single......
  • 基于Feigh发送Http请求,替代RestTemplate
    下载依赖<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>需要在启动类上开启配置,Feigh默认自带负载均衡配置@SpringBootApplication@EnableFeignClientspublic......
  • 观察者模式揭秘:实现松耦合的事件通知机制
    推荐语本篇文章深度剖析了观察者模式的核心原理及其在软件开发中的重要应用,通过清晰而深入的讲解,读者小伙伴可以深入理解观察者模式如何实现松耦合的事件通知机制,从而构建更灵活、可扩展的软件系统。本文既适合希望深入了解设计模式的专业人士,也适合希望提升代码质量和可维护性的开......
  • Java涉及模式有几种,以及什么时候使用
    Java涉及的设计模式一共有23种,按照功能分为三类:创建型模式:包括工厂模式、抽象工厂模式、单例模式、建造者模式和原型模式。当需要对对象的创建进行更好的抽象和封装时,可以考虑使用创建型模式。比如,当系统中的对象创建过程较为复杂,希望封装这些复杂的创建过程,或者需要对对象的创......
  • 提高代码复用性与可维护性:深入剖析模板方法模式
    什么是模板方法模式模板方法模式是一种行为型设计模式,它定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。在模板方法模式中,抽象类负责给出算法的轮廓和骨架(由一个或多个模板方法组成),而实现类......
  • 策略模式(Strategy Pattern) .Net Core实现
    在策略模式(StrategyPattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的context对象。策略对象改变context对象的执行算法。意图:定义一系列的算法,把它们一个个......
  • 设计模式<c++> (1)策略模式
    一、定义策略模式定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。二、使用场景客户需要很多种鸭子。要求:1.每种鸭子都要会游泳。2.每种鸭子有叫和飞的行为。3.鸭子的叫和飞的行为可以在使用......
  • 设计模式之单例模式
    单例模式(单例模式)定义==单例模式==确保一个类只有一个实例,并提供一个全局访问点。单例模式实现的方式1.饿汉式publicclassHungry{//构造器私有privateHungry(){}//类加载时就初始化,主动创建privatestaticHungryhungry=newHungry();......