导读

  最近在做公司一个消息网关的服务,包括:短信、微信、邮件等,所有请求通过一个入口,方便接口的管理(记录日志、接口限流白名单啥的)。如何写这个接口呢,还有为了以后扩展,对接过短信、微信、公众号的童鞋大概都了解,首先定义一个模板,然后后台传入json,替换模板中的值,然后发送。设计框架大概思路是这样的

  1. 第一层:通过策略模式,选择出具体的发送类型,比如:短信、微信、邮件。。。。。
  2. 第二层:再次通过策略模式,选择出具体的第三方平台,比如短信平台:阿里云、腾讯云、华为云。。。。。。
  3. 第三层:通过一个简单的工厂,选择出具体的模板,然后发送出去

  第一二层,以后可能会扩展出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 关于策略模式+简单工厂模式下的思考的更多相关文章

  1. Java设计模式2:简单工厂模式

    简单工厂模式 简单工厂模式是类的创建模式,又叫做静态工厂方法模式.简单工厂模式由一个工厂对象决定生产出哪一种产品类的实例. 为什么要使用简单工厂模式 原因很简单:解耦. A对象如果要调用B对象,最简单 ...

  2. Java设计模式之工厂模式(简单工厂模式+工厂方法模式)

    摘自http://blog.csdn.net/jason0539/article/details/23020989 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是 ...

  3. java设计模式-----1、简单工厂模式

    简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例,简单来说 ...

  4. Java模式—简单工厂模式

    简单工厂模式:是由一个工厂对象决定创建出哪一种产品类的实例,简单工厂模式是工厂模式家族中最简单实用的模式. 目的:为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. ...

  5. Java设计模式学习记录-简单工厂模式、工厂方法模式

    前言 之前介绍了设计模式的原则和分类等概述.今天开启设计模式的学习,首先要介绍的就是工厂模式,在介绍工厂模式前会先介绍一下简单工厂模式,这样由浅入深来介绍. 简单工厂模式 做法:创建一个工厂(方法或类 ...

  6. JAVA基础——设计模式之简单工厂模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式.简单工厂模式是由一个工厂 ...

  7. (转)java反射机制及简单工厂模式

    第一步,定义一个接口类 package factory.face; /** * 接口,为了保证返回的对象可以统一用 Product接受 * @author Administrator */ publi ...

  8. js原生设计模式——3简单工厂模式\简单工厂模式封装简单对象

    1.Factory基本写法 <!DOCTYPE html><html lang="en"><head>    <meta charset= ...

  9. 创建型模式(过渡模式) 简单工厂模式(Simple Factory)

    简单工厂模式(Simple Factory Pattern)属于类的创建型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern) 是通过专门定义一个类来负责创建其他类的 ...

  10. 抽象工厂模式&简单工厂模式

    抽象工厂模式 优点: 如IFactory factory=new AccessFactory(),在一个应用中只需要初始化一次,这就使得改变应用的时候变得非常容易:其次它让具体的创建实例过程与客户端分 ...

随机推荐

  1. Java学习的第三十三天

    1.今天复习了第十二章的12.1的文件和12.2一直到12.2.4 2.没有问题 3.明天继续复习

  2. scrapy反反爬虫

    反反爬虫相关机制 Some websites implement certain measures to prevent bots from crawling them, with varying d ...

  3. Java中的微信支付(3):API V3对微信服务器响应进行签名验证

    1. 前言 牢记一句话:公钥加密,私钥解密:私钥加签,公钥验签. 微信支付V3版本前两篇分别讲了如何对请求做签名和如何获取并刷新微信平台公钥,本篇将继续展开如何对微信支付响应结果的验签. 2. 为什么 ...

  4. 微信小程序获取高宽uniapp

    代码片段 <template> <view> <view class="text" id="w">补充文字</view ...

  5. 不断要求用户输入学生姓名,输入q结束.

    while (true) { Console.WriteLine("请输入学生姓名"); string a = Console.ReadLine(); if (a == " ...

  6. leetcode133:3sum-closest

    题目描述 给出含有n个整数的数组s,找出s中和加起来的和最接近给定的目标值的三个整数.返回这三个整数的和.你可以假设每个输入都只有唯一解. 例如,给定的整数 S = {-1 2 1 -4}, 目标值 ...

  7. EVM 2.0 预览版,跃见非凡,源于鸿蒙,开启物联网小程序新时代

    1. 基于EVUE的物联网小程序 EVM诞生以来,一直致力于让物联网开发变得简单,自鸿蒙OS 1.0 发布后,最引人注目的莫过于华为在应用程序开发框架层面面向应用开发者提供了一种全新的开发方式: 框架 ...

  8. C# out参数的学习

    out参数一直不是很会用,学习下记录下来 . 先来看一下out参数的使用场景 如果你在一个方法中 ,返回多个相同类型的值的时候,可以考虑返回一个数组.(举例:写一个方法,传入一个数组,返回数组的最大值 ...

  9. 什么是麒麟(kylin)?查数据贼快的哟

    前言 微信搜[Java3y]关注这个有梦想的男人,点赞关注是对我最大的支持! 文本已收录至我的GitHub:https://github.com/ZhongFuCheng3y/3y,有300多篇原创文 ...

  10. python_计算器

    import re from functools import reduce # 定义一个只计算两个数的乘法或除法的函数: def multiply_division(exp): if "* ...