Допустим, у вас есть класс NetworkImageService
, который извлекает изображение удаленно:
class NetworkImageService {
public Image getImage(name) { ... }
}
Тогда вы можете создать подкласс для этого CachedNetworkImageService
, например:
class CachedNetworkImageService extends NetworkImageService {
Cache cache = new Cache();
public Image getImage(name) { ...
Image img = cache.get(name);
if( img == null ) {
img = super.getImage(name);
cache.put( name, img );
}
return img.
}
}
Это основная идея, как я обычно делаю (но это псевдокод). Вы, конечно, можете улучшить его и использовать, например, cache.contains()
вместо того, чтобы сверять с null
.
В самом простом случае вы можете заменить Cache
на Hashmap
. В противном случае вы можете улучшить это и реализовать различные стратегии в кеше. У вас может быть политика выселения, которая удаляет изображение через некоторое время или по схеме LIFO.
Приведенный выше код не поддерживает одновременный доступ, поэтому вам также следует учесть это. Самый простой способ сделать его поточно-ориентированным - это синхронизировать метод getImage()
.