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