枚举+反射 解耦业务多流程,实现模块化

1.枚举

  枚举是一个被命名的整型常数的集合,用于声明一组带标识符的常数.

声明枚举
/**
 * @author yangYang
 * @version 1.0
 * @date 2020/9/30 9:11
 * @describe 支付枚举
 */
@Data
@ToString
public enum PayServiceEnum {
    ALIPAY("ALIPAY","AliPayServiceImpl"),
    WECHAT("WECHAT","WechatPayServiceImpl");

    /**
     * 编码
     */
    private String code ;
    /**
     * 实现方式
     */
    private String serviceImpl ;

    /**
     * 根据编码获取实现方式
     * @param code
     * @return
     */
    public static String getServiceImpl(String code) {
        for (PayServiceEnum c : PayServiceEnum.values()) {
            if (c.getCode().equals(code) ) {
                return c.serviceImpl;
            }
        }
        return null;
    }

    /**
     * 构造
     * @param code
     * @param serviceImpl
     */
    PayServiceEnum(String code, String serviceImpl){
        this.code = code;
        this.serviceImpl = serviceImpl;
    }
}

2.枚举业务类
设计模式是为了让代码开发更优雅,代码更加简洁或者实现某一种特定代码
破坏单例模式的设计模式
  • 利用枚举记录相应KEY(定义某一个方法或者是业务的名称)
    ,VALUE(放入相应方法或业务所在类名或全包名+类名)
  • 相应业务通过枚举类KEY获取业务所在报名、方法搜在包下
  • 利用反射调用实例化对象,调用方法,实现业务
3.定义枚举业务类
package com.hsource.doctorcenter.util.enums;

/**
 * @author yangYang
 * @version 1.0
 * @date 2020/9/30 9:11
 * @describe 各种业务实现类
 */
public enum  OrderServiceEnum {
    /**
     * 快捷提问
     */
    QuickQuestions("QuickQuestions","QuickQuestionServiceImpl"),
    /**
     * 快捷电话
     */
    QuickCall("QuickCall","QuickCallServiceImpl"),
    /**
     * 定向图文提问
     */
    DirectedQuestions("DirectedQuestions","DirectedQuestionsServiceImpl"),
    /**
     * 定向电话
     */
    DirectedPhone("DirectedPhone","DirectedPhoneServiceImpl"),
    /**
     * 图文急诊
     */
    ImageText("ImageText","ImageTextServiceImpl");

    /**
     * 编码
     */
    private String code ;
    /**
     * 实现方式
     */
    private String serviceImpl ;

    /**
     * 根据编码获取实现方式
     * @param code
     * @return
     */
    public static String getServiceImpl(String code) {
        for (OrderServiceEnum c : OrderServiceEnum.values()) {
            if (c.getCode().equals(code) ) {
                return c.serviceImpl;
            }
        }
        return null;
    }

    /**
     * 构造
     * @param code
     * @param serviceImpl
     */
    OrderServiceEnum(String code, String serviceImpl){
        this.code = code;
        this.serviceImpl = serviceImpl;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getServiceImpl() {
        return serviceImpl;
    }

    public void setServiceImpl(String serviceImpl) {
        this.serviceImpl = serviceImpl;
    }
}

通过不同服务进入枚举查询出相应业务 对应的实现类进行创建

/**
     * 调取服务模块并开通
     * @param order 订单参数
     */
    public static void openingServiceReverberate(Order order){
        try {
            Class<?> clazz = Class.forName("com.hsource.doctorcenter.service.order.impl." + OrderServiceEnum.getServiceImpl(order.getOrderType()));
            Method openingService = clazz.getMethod("openingService", Order.class);
            openingService.invoke(clazz.newInstance(), order);
        }catch (ClassNotFoundException | NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException e) {
            e.printStackTrace();
            log.error("为查询到改服务的实现方式,即当前服务为:"+order.getOrderType());
        }
    }

  小弟不才,为了能把所有的服务剥离出业务层里,所以使用这种方法 如果需要添加新业务或删除老业务直接操作枚举变可以实现,不需要更改业务流程中的代码,个人觉得这种方式可以把某一块业务代码剥离实现模块化,一下步优化方向动态生成枚举,实现业务流程彻底自动化。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值