使用Spring实现工厂+策略模式
这里使用发短信业务:
- 不同短信有不同模板
- 但是发送方法都相同
- 只是发送内同不同
1. 定义短信发送策略接口:
//策略接口
public interface SmsTemStrategy {
public void sendSms(Map<String,String> params);
}
2.短信发送策略接口实现类:
- 登录短信模板
//自定义策略名
@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));
}
}
-
注册短信模板
@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)); } }
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; } }
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);
}
}
工厂类Map自动注入结果如图: