目录

  • 一. 需求
  • 一. 区分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);}}

⏹效果