0
点赞
收藏
分享

微信扫一扫

【设计模式】享元模式——OkHttp里的享元模式

OkHttp 还实现了一个缓存机制,用于存储 HTTP 响应。缓存中的每个条目都是一个 CacheEntry 对象。这些缓存条目会被多个请求共享,这也是享元模式的一个应用。

public final class Cache {
    private final Map<String, CacheEntry> cacheMap = new LinkedHashMap<>();
    private final long maxSize;
    private final long maxAgeSeconds;

    // 省略其他代码

    synchronized CacheEntry get(Request request) {
        String key = request.url().toString();
        return cacheMap.get(key);
    }

    synchronized void put(Request request, Response response) {
        String key = request.url().toString();
        cacheMap.put(key, new CacheEntry(response));
        if (cacheMap.size() > maxSize) {
            evict();
        }
    }

    private void evict() {
        Iterator<Map.Entry<String, CacheEntry>> iterator = cacheMap.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, CacheEntry> entry = iterator.next();
            if (entry.getValue().isExpired()) {
                iterator.remove();
            } else {
                break;
            }
        }
    }
}

在上述代码中,Cache 类使用一个 LinkedHashMap 来存储缓存条目。当需要获取或存储缓存时,都会检查或更新相应的缓存条目。这种共享缓存条目的方式减少了内存的使用,并提高了缓存命中率。

举报

相关推荐

0 条评论