目录
- [一. 需求](#一. 需求)
- [一. 区分entity](#一. 区分entity)
- [二. 接口](#二. 接口)
- [三. 邮件发送类](#三. 邮件发送类)
- [四. 邮件发送的聚合工厂类](#四. 邮件发送的聚合工厂类)
- [五. 模拟邮件发送](#五. 模拟邮件发送)
一. 需求
根据前台传入的code,后台发送不同平台的邮件,发送QQ邮件,163邮件,Gmail邮件等。
一. 区分entity
java
public class MailKbn {
// 各邮箱平台所对应的区分code
public final class MailCategory {
public final static String Mail_163 = "1";
public final static String Mail_QQ = "2";
public final static String Mail_G = "3";
}
// .... 各邮箱平台的其他区分
}
二. 接口
⏹ 邮件发送的接口,各邮箱平台的发送类需要实现此接口
java
public interface MailSend {
void sendMail(Map<String, String> content);
}
三. 邮件发送类
⭕163邮件发送
java
public class Send163Mail implements MailSend {
@Override
public void sendMail(Map<String, String> content) {
System.out.println(content);
System.out.println("Send163Mail...");
}
}
⭕Gmai邮件发送
java
public class SendGoogleMail implements MailSend {
@Override
public void sendMail(Map<String, String> content) {
System.out.println(content);
System.out.println("SendGoogleMail...");
}
}
⭕QQ邮件发送
java
public class SendQQMail implements MailSend {
@Override
public void sendMail(Map<String, String> content) {
System.out.println(content);
System.out.println("SendQQMail...");
}
}
四. 邮件发送的聚合工厂类
- 通过策略模式将邮件code和邮件发送类聚合到mailSendMap这个Map中。
- 通过内部类创建单例对象,进而实现单例模式。
- 仅将getInstance()方法和sendMail()方法设置为public,其他方法为private,确保外部无法调用工厂类的内部方法,且只能通过
MailSendFactory.getInstance()
来创建实例。
java
import java.util.HashMap;
import java.util.Map;
// 该工厂类禁止继承
public final class MailSendFactory {
// code和对应的发送邮件的方法
private final static Map<String, MailSend> mailSendMap = new HashMap<>();
// 将code和对应的发送邮件的方法放到map中聚合
static {
mailSendMap.put(MailKbn.MailCategory.Mail_163, new Send163Mail());
mailSendMap.put(MailKbn.MailCategory.Mail_QQ, new SendQQMail());
mailSendMap.put(MailKbn.MailCategory.Mail_G, new SendGoogleMail());
}
// 禁止通过构造方法创建对象
private MailSendFactory() {
}
// 通过内部类创建工厂对象
private static class SingletonHolder {
private static MailSendFactory mailSendFactory = new MailSendFactory();
}
// 单例模式创建实例
public static MailSendFactory getInstance() {
return SingletonHolder.mailSendFactory;
}
// 发送邮件
public MailSend sendMail(String category) {
return mailSendMap.get(category);
}
}
五. 模拟邮件发送
java
@SpringBootApplication
public class JmwApplication implements CommandLineRunner {
public static void main(String[] args) {
SpringApplication.run(JmwApplication.class, args);
}
@Override
public void run(String... args) {
// 模拟要发送的邮件内容
Map<String, String> mailContent = new HashMap<>(){{
put("name", "贾飞天");
put("title", "中奖通知");
}};
// 模拟前台向后台传入的邮件code
String mailCategory = "1";
// 通过工厂类产生一个邮件发送的实例对象
MailSend mailSend = MailSendFactory.getInstance().sendMail(mailCategory);
if (Objects.isNull(mailSend)) {
// 说明如果mailSend对象为空,说明前台发送的mailCategory有误
// 后台没有对应的邮件发送平台
return;
}
// 发送邮件
mailSend.sendMail(mailContent);
}
}
⏹效果