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