一、场景
场景:有个给不同类型的数据打上标签的功能。不同数据类型生成的标签规则不一样。
二、编码实现
1、首先定义一个抽象类(统一需要实现的方法)
/**
* FileName: AbstractMakeTagHandler
* Author: pengyd
* Date: 2020/3/13
* function:
*/
public abstract class AbstractMakeTagHandler {
/**
* 生成标签
*
* @param request ProcessApproveRequest
* @param info SubmitInfo
* @param objectType 数据类型
*/
public abstract void makeTag(ProcessApproveRequest request, SubmitInfo info, String objectType);
}
2、工厂类(目的是用来映射不同的实现类)
/**
* FileName: MateTagFactory
* Author: pengyd
* Date: 2020/3/13
* function: 对应标签映射类
*/
public class MateTagFactory {
private static Map<String, String> mapping = Maps.newHashMap();
static {
mapping.put(TemplateTypeEnum.CONTRACT.getDesc(), MakeTagHandlerTag.contract);
mapping.put(TemplateTypeEnum.SEAL.getDesc(), MakeTagHandlerTag.seal);
mapping.put(TemplateTypeEnum.STANDARD.getDesc(), MakeTagHandlerTag.standard);
mapping.put(TemplateTypeEnum.INVOICE.getDesc(), MakeTagHandlerTag.invoice);
}
public static AbstractMakeTagHandler getHandler(String objectType) {
String tag = mapping.get(objectType);
Assert.isNotNull(tag, ResultCode.MAKETAG_HANDLER_NOT_MAPPING);
AbstractMakeTagHandler makeTagHandler = SpringContextUtil.getBean(tag, AbstractMakeTagHandler.class);
Assert.isNotNull(makeTagHandler, ResultCode.MAKETAG_HANDLER_NOT_UNREGISTERED);
return makeTagHandler;
}
}
3、Bean名称定义
/**
* FileName: MakeTagHandlerTag
* Author: pengyd
* Date: 2020/3/13
* function: 标签相关 - Bean名称
*/
public interface MakeTagHandlerTag {
String contract = "makeTag_contract";
String seal = "makeTag_seal";
String invoice = "makeTag_invoice";
String standard = "makeTag_standard";
}
4、具体逻辑实现类
/**
* FileName: ContractMakeTagHandler
* Author: pengyd
* Date: 2020/3/13
* function: 处理类
*/
@Component(MakeTagHandlerTag.contract)
public class ContractMakeTagHandler extends AbstractMakeTagHandler {
@Autowired
private DataTagHandler dataTagHandler;
@Override
public void makeTag(ProcessApproveRequest request, SubmitInfo info, String objectType) {
//TODO 具体的业务逻辑内容
}
}
三、使用(这里的objectType就是用于MateTagFactory中映射好的关系,拿到对应的处理类)
MateTagFactory.getHandler(objectType).makeTag(processApproveRequest, info, objectType);
四、优点
后面如果需要新增类似功能,只需要新增一个具体的Handler就行。易扩展,可读性高。