聊聊基于数据库的策略模式

孤人 提交于 2020-02-28 13:36:35

策略模式概述:

在我看来最主要的是使用策略的代码是固定的,但策略是可以自由选择的。这就使得对策略的选择和使用进行了解耦。

策略模式: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;

	}

选择好策略之后,就执行策略中的具体实现。

这是基于数据库的配置实现的一种策略模式。在某些时候很管用。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!