策略模式的灵活运用

1,相信大家都对设计模式比较熟悉,也了解各种设计模式。假如你看看博客、查查资料学了某种设计模式的难度评为1的话,那么你自己试着写一些样例的难度可能就为3啦,而当你在项目中能够灵活运用的难度可能就是10。

废话少说,直接上代码。。。

2,策略模式

          接口:更新配置顶级接口                

/**
 *  更新配置顶级接口
 *  	<p>所有更新配置的类都需要实现这个接口
 * @author reyco
 * @date 2019年6月12日
 *
 */
public interface ConfigStrategy {
	/**
	 *   更新配置
	 * @param data
	 * @throws ConfigRuntimeExecption
	 */
	Boolean updateConfig(String data) throws ConfigRuntimeExecption;

}

      更新配置实现1:       

/**
 * mysql配置更新对象
 * @author reyco
 * @date 2019年6月12日
 *
 */
@Component("mysql")
public class MySqlConifgStrategy implements ConfigStrategy {
	
	private MySqlConfig mysqlConfig;
	
	public MySqlConifgStrategy() {
		this.mysqlConfig = new MySqlConfig();
	}

	@Override
	public Boolean updateConfig(String data) throws ConfigRuntimeExecption {
		Boolean flag= false;
		if(StringUtils.isBlank(data)) {
			return flag;
		}
		MySqlConfig mscf = JsonUtils.jsonToPojo(data, MySqlConfig.class);
		System.out.println("######################MySqlConfig配置更新之前。。。"+this.mysqlConfig);
		System.out.println("######################MySqlConfig配置正在更新。。。");
		this.mysqlConfig.setDriver(mscf.getDriver() == "" ? this.mysqlConfig.getDriver() : mscf.getDriver());
		this.mysqlConfig.setUrl(mscf.getUrl() == "" ? this.mysqlConfig.getUrl() : mscf.getUrl());
		this.mysqlConfig.setUsername(mscf.getUsername() == "" ? this.mysqlConfig.getUsername() : mscf.getUsername());
		this.mysqlConfig.setPassword(mscf.getPassword() == "" ? this.mysqlConfig.getPassword() :  mscf.getPassword());
		System.out.println("######################MySqlConfig配置更新之后。。。"+this.mysqlConfig);
		System.out.println("######################MySqlConfig配置更新结束。。。");
		return flag=true;
	}

}

    更新配置实现2:   

/**
 *   更新redis配置的操作类
 * @author reyco
 * @date 2019年6月13日
 *
 */
@Component("redis")
public class RedisConfigStrategy implements ConfigStrategy {
	
	private RedisConfig redisConfig;
	
	public RedisConfigStrategy() {
		this.redisConfig = new RedisConfig();
	}
	/**
	 * 更新redis配置
	 */
	@Override
	public Boolean updateConfig(String data) throws ConfigRuntimeExecption {
		Boolean flag= false;
		if(StringUtils.isBlank(data)) {
			return flag;
		}
		//  将json格式的data转成RedisConfig对象
		RedisConfig rc = JsonUtils.jsonToPojo(data, RedisConfig.class);
		System.out.println("######################RedisConfig配置更新之前。。。"+this.redisConfig);
		System.out.println("######################RedisConfig配置正在更新。。。");
		this.redisConfig.setHost(rc.getHost() == "" ? this.redisConfig.getHost() : rc.getHost());
		this.redisConfig.setPort(rc.getPort() == "" ? this.redisConfig.getPort() : rc.getPort());
		this.redisConfig.setPassword(rc.getPassword()== "" ? redisConfig.getPassword() : rc.getPassword());
		System.out.println("######################RedisConfig配置更新之后。。。"+this.redisConfig);
		System.out.println("######################RedisConfig配置更新结束。。。");
		return flag=true;
	}

}

  负责和具体的策略类交互:

/**
 * 负责和具体的策略类交互
 * @author reyco
 * @date 2019年6月14日
 *
 */
@Component("configStrategyContext")
public class ConfigStrategyContext{
	
	/**
	 * spring会自动把ConfigStrategy的实现类bean注入到configStrategyMap中
	 */
	@Autowired
	private final Map<String,ConfigStrategy> configStrategyMap = new HashMap<String,ConfigStrategy>(12);
	
	public boolean updateConfig(String type,String data) {
		if(StringUtils.isBlank(type)) {
			return false;
		}
		ConfigStrategy configStrategy = configStrategyMap.get(type);
		return configStrategy.updateConfig(data);
	}
	
}

   测试实现类:

@RequestMapping("test")
@Controller
public class TestController {

	@Autowired
	private ConfigStrategyContext configStrategyContext;

	@ResponseBody
	@RequestMapping("test")
	public String test(String type, String data) throws InterruptedException {
		boolean flag = configStrategyContext.updateConfig(type, data);
		if (flag) {
			return JSONResult.create("成功。。。").toJSON();
		} else {
			return JSONResult.failCreate("失败。。。", "").toJSON();
		}
	}
}

        

MySqlConfig.java、RedisConfig只是一个pojo实体类,这里就不贴出来啦。。。

      

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

java的艺术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值