策略模式概述:
在我看来最主要的是使用策略的代码是固定的,但策略是可以自由选择的。这就使得对策略的选择和使用进行了解耦。
策略模式:https://blog.csdn.net/weixin_37968613/article/details/103068487
基于数据库进行对策略进行选择:
举个例子:
我们现在有一个场景,业务中需要用到很多配置码表信息(上百张配置表),诸如:goodsCode,商品名称goodsName,大部分配置表都是code,name的形式,但也会有bussinessId,XXId等其他更多字段。在这种情况下,如果我们要自由获取到每张配置表的信息,我们会怎么做?
为每一张写一个查询吗?显然是太难以扩展了,那样增加删除配置表都需要修改代码。
这里有一种思路,采用一张全局配置表存储着每张配置表的信息,如码表类型Type,表名,code字段名称(goodsCode),name字段名称(goodsName)等,首先根据我们要查的码表类型codeType,到全局配置表查出我们要查的表名,字段名称,采用策略等,然后再去相应码表查出我们需要的值。一般的码表我们采用默认策略,另外针对一些特殊的,字段很多或不规则的码表,我们可以自己再实现一套策略去解决。全局配置表中的策略字段,可以存策略具体实现类(ConcreteStrategy)的Id,通过SpringContextUtil.getBean("beanid")去获取策略。(SpringContextUtil是实现了ApplicationContextAware接口的实现类)
我们看一下具体代码:
这是一个通用的获取码表列表的实现。
public List<?> getCodeList(String codeType) {
List result = null;
try {
//根据codeType获取配置信息,包含策略
BaseCodeDefDTO defDto = codeDefService.getCodeDefByCodeType(codeType);
if (defDto != null)
//this.getProvider是根据查出来的配置寻找合适的策略
result = this.getProvider(defDto).getCodeList(defDto);
} catch (Exception ex) {
throw new RuntimeException(ex);
}
return result;
}
首先根据codeType查询全局配置表,获取策略。
/**
* 根据code类型取得单个BaseCode的定义
* @param codeType
* @return
*/
@Cacheable(value = "basecode-def", key = "#codeType")
public BaseCodeDefDTO getCodeDefByCodeType(String codeType){
BaseCodeDefCMP cmp = baseCodeRepository.findOne(codeType);
return ConverterUtil.convert(cmp, new BaseCodeDefDTO());
}
根据全局配置表的策略配置,选择合适的策略,如果策略为空,则选择默认策略。
/**
* 根据CodeType取得指定的处理方式
*
* @param codeType
* @return
*/
private UnifiedCodeProvider getProvider(BaseCodeDefDTO defDto) {
String providerDef = StringUtils.isNotEmpty(defDto.getCodeProvider()) ? defDto.getCodeProvider()
: "defaultCodeProvider";
Object provider = SpringContextUtil.getBean(providerDef);
if (provider instanceof UnifiedCodeProvider) {
provider = (UnifiedCodeProvider) provider;
} else {
provider = (UnifiedCodeProvider) SpringContextUtil.getBean("defaultCodeProvider");
}
if (provider == null) {
// TODO:异常抛出修改
throw new RuntimeException("basecode provider:" + defDto.getProvider() + " is not exist! ");
}
return (UnifiedCodeProvider) provider;
}
选择好策略之后,就执行策略中的具体实现。
这是基于数据库的配置实现的一种策略模式。在某些时候很管用。
来源:CSDN
作者:c&0xff00
链接:https://blog.csdn.net/weixin_37968613/article/details/104553037