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实体类,这里就不贴出来啦。。。