设计模式-策略模式+单例模式+工厂模式 减少 if else

目录

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

⏹效果

相关推荐
幂简集成explinks1 小时前
e签宝签署API更新实战:新增 signType 与 FDA 合规参数配置
后端·设计模式·开源
大飞pkz5 小时前
【设计模式】C#反射实现抽象工厂模式
设计模式·c#·抽象工厂模式·c#反射·c#反射实现抽象工厂模式
努力也学不会java5 小时前
【设计模式】抽象工厂模式
java·设计模式·oracle·抽象工厂模式
青草地溪水旁5 小时前
设计模式(C++)详解—抽象工厂模式 (Abstract Factory)(2)
c++·设计模式·抽象工厂模式
青草地溪水旁5 小时前
设计模式(C++)详解—抽象工厂模式 (Abstract Factory)(1)
c++·设计模式·抽象工厂模式
Magnetic_h15 小时前
【iOS】设计模式复习
笔记·学习·ios·设计模式·objective-c·cocoa
A阳俊yi16 小时前
设计模式——结构型模式
设计模式
Ronin30516 小时前
【Linux系统】日志与策略模式
linux·策略模式·日志
Wadli21 小时前
C++语法 | static静态|单例模式
开发语言·c++·单例模式
努力也学不会java1 天前
【设计模式】状态模式
java·设计模式·状态模式