コードを書くためのエレガントなデザインモード

戦略モード

ifelse内部には

Template Methodパターン

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;
    }
}
公開された172元の記事 ウォンの賞賛0 ビュー5694

おすすめ

転載: blog.csdn.net/weixin_44635157/article/details/104631829