策略模式
在ifelse里面
模板方法模式
getUserById,每次查询之前都要先查询缓存,把查询缓存这部分代码模板化,实现类只要查询数据库
//1.模板
@Component
public class ModuleTemplate {
@Autowired
private RedisTemplate redisTemplate;
public <T> T getObjectById(Integer key, BaseService<T> baseService){
T result = (T) redisTemplate.opsForValue().get(key);
if (null == result){
synchronized (this){
//查询缓存
result = (T) redisTemplate.opsForValue().get(key);
if (null == result){
//查询数据库
result = baseService.getObjectById();
redisTemplate.opsForValue().set(key,result);
}
}
}
return result;
}
}
//2.base接口,用作实现类查询数据库
@FunctionalInterface
public interface BaseService<T> {
public T getObjectById();
}
//3.UseService接口和实现类
public interface UserService {
public User getUserByIdTemplate(Integer userId);
}
@Service
public class UserServiceImpl implements UserService {
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private ModuleTemplate moduleTemplate;
@Override
public User getUserByIdTemplate(Integer userId) {
User user = moduleTemplate.getObjectById(userId,() ->{
//查询数据库
return getUserById(userId);
});
return user;
}
}