Java 关于策略模式+简单工厂模式下的思考
导读
最近在做公司一个消息网关的服务,包括:短信、微信、邮件等,所有请求通过一个入口,方便接口的管理(记录日志、接口限流白名单啥的)。如何写这个接口呢,还有为了以后扩展,对接过短信、微信、公众号的童鞋大概都了解,首先定义一个模板,然后后台传入json,替换模板中的值,然后发送。设计框架大概思路是这样的
- 第一层:通过策略模式,选择出具体的发送类型,比如:短信、微信、邮件。。。。。
 - 第二层:再次通过策略模式,选择出具体的第三方平台,比如短信平台:阿里云、腾讯云、华为云。。。。。。
 - 第三层:通过一个简单的工厂,选择出具体的模板,然后发送出去
 

第一二层,以后可能会扩展出2、3家第三方平台,使用策略模式还是可以接受的,但是到了第三层的话,可能会出现一二十个模板,这样子的话,会出现一大堆if else等等(写过简单工厂的都清楚),然后自己手动封装一个工具类,获取一个类下的所有子类,然后通过一个字段创建对象,这里我做了一个优化,找到的值,我会先放到一个Map中,第二次请求来的时候,先去Map中查询下,是否有值,有值的话,直接调用,没有值的话,才会去重新找一遍,这样子性能也得到了提高

项目结构

工具类
package com.ybchen.messagegateway; import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.List; /**
* @ClassName:TestMain
* @Description:TODO
* @Author:chenyb
* @Date:2020/12/1 9:19 上午
* @Versiion:1.0
*/
public class TestMain {
public static void main(String[] args) throws Exception {
System.out.println("接口实现类:");
for (Class<?> c : getAllAssignedClass(AbsClassA.class)) {
if (c.getName().contains("D")){
AbsClassA obj =(AbsClassA) c.newInstance();
obj.speak();
}
System.out.println(c.getName());
}
System.out.println("子类:");
for (Class<?> c : getAllAssignedClass(AbsClassA.class)) {
System.out.println(c.getName());
}
} /**
* 获取同一路径下所有子类或接口实现类
*
* @param intf
* @return
* @throws IOException
* @throws ClassNotFoundException
*/
public static List<Class<?>> getAllAssignedClass(Class<?> cls) throws Exception {
List<Class<?>> classes = new ArrayList<>();
for (Class<?> c : getClasses(cls)) {
if (cls.isAssignableFrom(c) && !cls.equals(c)) {
classes.add(c);
}
}
return classes;
} /**
* 取得当前类路径下的所有类
*
* @param cls
* @return
* @throws IOException
* @throws ClassNotFoundException
*/
public static List<Class<?>> getClasses(Class<?> cls) throws Exception {
String pk = cls.getPackage().getName();
String path = pk.replace('.', '/');
ClassLoader classloader = Thread.currentThread().getContextClassLoader();
URL url = classloader.getResource(path);
return getClasses(new File(url.getFile()), pk);
} /**
* 迭代查找类
*
* @param dir
* @param pk
* @return
* @throws ClassNotFoundException
*/
private static List<Class<?>> getClasses(File dir, String pk) throws ClassNotFoundException {
List<Class<?>> classes = new ArrayList<>();
if (!dir.exists()) {
return classes;
}
for (File f : dir.listFiles()) {
if (f.isDirectory()) {
classes.addAll(getClasses(f, pk + "." + f.getName()));
}
String name = f.getName();
if (name.endsWith(".class")) {
classes.add(Class.forName(pk + "." + name.substring(0, name.length() - 6)));
}
}
return classes;
}
}

package com.ybchen.messagegateway; /**
* @ClassName:AbsClassA
* @Description:TODO
* @Author:chenyb
* @Date:2020/12/1 9:16 上午
* @Versiion:1.0
*/
public abstract class AbsClassA {
public abstract void speak();
}
AbsClassA

package com.ybchen.messagegateway; /**
* @ClassName:ClassB
* @Description:TODO
* @Author:chenyb
* @Date:2020/12/1 9:16 上午
* @Versiion:1.0
*/
public class ClassB extends AbsClassA {
@Override
public void speak() {
System.out.println("BBBBBBB");
}
}
ClassB

package com.ybchen.messagegateway; /**
* @ClassName:ClassC
* @Description:TODO
* @Author:chenyb
* @Date:2020/12/1 9:16 上午
* @Versiion:1.0
*/
public class ClassC extends AbsClassA{
@Override
public void speak() {
System.out.println("CCC");
}
}
ClassC

package com.ybchen.messagegateway.de; import com.ybchen.messagegateway.AbsClassA; /**
* @ClassName:ClassD
* @Description:TODO
* @Author:chenyb
* @Date:2020/12/1 9:17 上午
* @Versiion:1.0
*/
public class ClassD extends AbsClassA {
@Override
public void speak() {
System.out.println("ddd");
}
}
ClassD
Java 关于策略模式+简单工厂模式下的思考的更多相关文章
- Java设计模式2:简单工厂模式
		
简单工厂模式 简单工厂模式是类的创建模式,又叫做静态工厂方法模式.简单工厂模式由一个工厂对象决定生产出哪一种产品类的实例. 为什么要使用简单工厂模式 原因很简单:解耦. A对象如果要调用B对象,最简单 ...
 - Java设计模式之工厂模式(简单工厂模式+工厂方法模式)
		
摘自http://blog.csdn.net/jason0539/article/details/23020989 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是 ...
 - java设计模式-----1、简单工厂模式
		
简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例,简单来说 ...
 - Java模式—简单工厂模式
		
简单工厂模式:是由一个工厂对象决定创建出哪一种产品类的实例,简单工厂模式是工厂模式家族中最简单实用的模式. 目的:为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. ...
 - Java设计模式学习记录-简单工厂模式、工厂方法模式
		
前言 之前介绍了设计模式的原则和分类等概述.今天开启设计模式的学习,首先要介绍的就是工厂模式,在介绍工厂模式前会先介绍一下简单工厂模式,这样由浅入深来介绍. 简单工厂模式 做法:创建一个工厂(方法或类 ...
 - JAVA基础——设计模式之简单工厂模式
		
在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式.简单工厂模式是由一个工厂 ...
 - (转)java反射机制及简单工厂模式
		
第一步,定义一个接口类 package factory.face; /** * 接口,为了保证返回的对象可以统一用 Product接受 * @author Administrator */ publi ...
 - js原生设计模式——3简单工厂模式\简单工厂模式封装简单对象
		
1.Factory基本写法 <!DOCTYPE html><html lang="en"><head> <meta charset= ...
 - 创建型模式(过渡模式) 简单工厂模式(Simple Factory)
		
简单工厂模式(Simple Factory Pattern)属于类的创建型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern) 是通过专门定义一个类来负责创建其他类的 ...
 - 抽象工厂模式&简单工厂模式
		
抽象工厂模式 优点: 如IFactory factory=new AccessFactory(),在一个应用中只需要初始化一次,这就使得改变应用的时候变得非常容易:其次它让具体的创建实例过程与客户端分 ...
 
随机推荐
- Java学习的第十三天
			
1.object类及其方法 Java类的浅层克隆,深层克隆 2.克隆很难 3.明天学习java的继承,关键字
 - Java实现评论回复功能
			
目录 一.分类方式 1.单一型 2.嵌套型 3.两层型 二.实现原理 1.单一型 2.嵌套型 3.两层型 使用递归循环开发评论回复功能,适用于大部分的简单单体应用 评论功能或许是大多数的单体应用之中会 ...
 - 浅析I/O模型-select、poll、epoll
			
I/O流 概念 (1)c++中将数据的输入输出称之为流(stream),在c++中,流被定义为类,成为流类(stream class),其定义的对象为流对象. (2)文件,套接字(socket),管道 ...
 - Linux 系统编程 学习:09-线程:线程的创建、回收与取消
			
Linux 系统编程 学习:09-线程:线程的创建.回收与取消 背景 我们在此之前完成了 有关进程的学习.从这一讲开始我们学习线程. 完全的开发可以参考:<多线程编程指南> 在Linux ...
 - html+canvas实现很真实的下雨雨落
			
原素材地址:http://www.htmlsucai.com/demo-9782.html <!DOCTYPE html> <html> <head> <me ...
 - python开发基础(二)运算符以及数据类型之bool(布尔值))
			
# encoding: utf-8 # module builtins # from (built-in) # by generator 1.147 """ Built- ...
 - iptables从入门到掌握
			
防火墙简述 防火墙(firewall)一词本是建筑用于,本意是为了保护建筑物不受火灾侵害的.被借鉴到了在网络通信领域中,表示保护局域网或主机不受网络攻击的侵害. 防火墙: 工作在主机或者网络边缘,对于 ...
 - NOIP 2012 P1081 开车旅行
			
倍增 这道题最难的应该是预处理... 首先用$set$从后往前预处理出每一个点海拔差绝对值得最大值和次大值 因为当前城市的下标只能变大,对于点$i$,在$set$中二分找出与其值最接近的下标 然后再$ ...
 - win10免费通用永久激活秘钥分享 win1020H2正式版序列号推荐
			
win10最新永久激活密钥神key如下: win10免费密钥 NW06D-722C0-5X6A1-MQ83B-2ER3D win10免费密钥 NP3KM-NQZD6-X406E-1QPKR-4VRZD ...
 - 利用命令行将本地代码上传至GitHub仓库
			
p.p1 { margin: 0 0 0 60px; font: 16px "PingFang SC"; color: rgba(88, 110, 117, 1) } p.p2 { ...