• 使用Spring实现工厂+策略模式


    使用Spring实现工厂+策略模式

    这里使用发短信业务:

    • 不同短信有不同模板
    • 但是发送方法都相同
    • 只是发送内同不同

    1. 定义短信发送策略接口:

    //策略接口
    public interface SmsTemStrategy {
        public void sendSms(Map<String,String> params);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.短信发送策略接口实现类:

    1. 登录短信模板
    //自定义策略名
    @Component(value = "LoginSmsTempwwww")
    public class LoginSmsTemp implements SmsTemStrategy{
    
        @Autowired
        SendServiceSmsImpl sendServiceSms;
    
    	//短信模板场景
        private static final String scene="login";
    
        /**
         *
         */
        @Override
        public void sendSms(Map<String,String> params) {
            String template = sendServiceSms.getTemplate(scene);
            params.put("template",template);
            System.out.println(sendServiceSms.sendSms(params));
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    1. 注册短信模板

      @Component(value = "register")
      public class RegisterSmsTemp implements SmsTemStrategy{
      
          @Autowired
          SendServiceSmsImpl sendServiceSms;
      
      
          private static final String scene="register";
          /**
           *发送短信
           */
          @Override
          public void sendSms(Map<String,String> params) {
              //获取短信模板
              String template = sendServiceSms.getTemplate(scene);
              params.put("template",template);
              //发送短信
              System.out.println(sendServiceSms.sendSms(params));
          }
      }
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21

      3.发送短信服务类(一般调用第三方接口)

      @Component
      public class SendServiceSmsImpl implements SendServiceSms {
          /**
           *通过场景获取短信模板接口
           */
          @Override
          public String getTemplate(String str) {
              return "获取"+str+"模板成功";
          }
      
          /**
           *发送短信接口
           */
          @Override
          public String sendSms(Map<String,String> params) {
              return "发送短信成功"+params;
          }
      
      }
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20

    4.短信发送工厂(核心)

    Spring会自动将Strategy接口的实现类注入到这个Map中(前提是实现类得是交给Spring 容器管理的),这个Map的key为bean的id,这个ID可以用@Component(value = “xxx”)的方式设置,如果直接用默认的方式的话,就是首字母小写。value值则为对应的策略实现类

    @Component
    public class SmsFactory {
    
        //这里Spring会将所有的类都注册到这里
        @Autowired
        Map<String,SmsTemStrategy> smsTemStrategyMap;
    
        //通过bean的name获取
        public SmsTemStrategy getBy(String strategyName) {
            return smsTemStrategyMap.get(strategyName);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    工厂类Map自动注入结果如图:
    在这里插入图片描述

  • 相关阅读:
    Git 分支、提交等基础运用
    春运“火车票难买”,用微信小程序抢到票的用户都笑了
    Android基础第一天 | 字节跳动第四届青训营笔记
    大模型重塑软件研发,从辅助编程到多 Agent 协同还有多远?| 新程序员
    C语言红楼梦人物分析系统
    导数的定义和介绍习题
    Qlik部署动态经营分析,实时帮助企业掌控盈利能力
    Hadoop3 - MapReduce ORC 列式存储
    搭建灾情快速分析系统 | Bigemap助力防灾减灾重点工作
    判断二叉树是否相等
  • 原文地址:https://blog.csdn.net/weixin_43505211/article/details/127974722