-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathSolution.java
More file actions
81 lines (47 loc) · 4.12 KB
/
Solution.java
File metadata and controls
81 lines (47 loc) · 4.12 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
//And there were set there six waterpots of stone, after the manner of the purifying of the Jews, containing two or three firkins apiece (John 2:6)
package com.javarush.task.task37.task3708;
import com.javarush.task.task37.task3708.retrievers.CachingProxyRetriever;
import com.javarush.task.task37.task3708.retrievers.OriginalRetriever;
import com.javarush.task.task37.task3708.retrievers.Retriever;
import com.javarush.task.task37.task3708.storage.FarAwayStorage;
import com.javarush.task.task37.task3708.storage.Storage;
/*
Кеширующий Proxy
*/
public class Solution {
private static final int n = 10;
public static void main(String[] args) {
Storage storage = new FarAwayStorage();
fillStorage(storage);
System.out.println("Testing OriginalRetriever: ");
testRetriever(new OriginalRetriever(storage));
System.out.println("\n\n\n\n\n\n\n\n\n\nTesting CachingProxyRetriever: ");
testRetriever(new CachingProxyRetriever(storage));
}
private static void fillStorage(Storage storage) {
for (int i = 0; i < n; i++) {
storage.add("Resource #" + i);
}
}
private static void testRetriever(Retriever retriever) {
for (int i = 0; i < n * 4; i++) {
System.out.println("Loaded value : " + retriever.retrieve((long) (Math.random() * n)));
}
}
}
/*
Кеширующий Proxy
Реализация паттерна Proxy предоставляет объект, который контролирует доступ к другому объекту.
Тебе необходимо создать класс CachingProxyRetriever в пакете retrievers, который будет обеспечивать ту же функциональность что и класс OriginalRetriever, но с одним важным дополнением. Необходимо всегда пробовать сначала получить объект из кеша, и только если его там нет - выполнять дорогостоящую операцию загрузки из storage. После получения необходимого объекта из хранилища storage, его необходимо кешировать с помощью объекта типа LRUCache.
Для клиента (в данном случае класс Solution) использование CachingProxyRetriever ничем не должно отличаться от использования класса OriginalRetriever.
P.S. Тебе понадобятся поля типов LRUCache и OriginalRetriever в классе CachingProxyRetriever.
Требования:
1. В классе CachingProxyRetriever должно быть создано поле типа OriginalRetriever.
2. В классе CachingProxyRetriever должно быть создано поле типа LRUCache.
3. Конструктор класса CachingProxyRetriever должен принимать один параметр типа Storage и инициализировать поле типа OriginalRetriever.
4. Метод retrieve класса CachingProxyRetriever должен выполнять поиск подходящего объекта в кеше с помощью метода find.
5. Метод retrieve класса CachingProxyRetriever должен получать объект из хранилища с помощью метода retrieve объекта типа OriginalRetriever и добавлять в кеш, если он не был там найден.
6. Метод retrieve класса CachingProxyRetriever не должен вызывать метод retrieve класса OriginalRetriever, если объект был найден в кеше.
7. Метод retrieve класса CachingProxyRetriever должен возвращать объект, которому в хранилище соответствует id, полученный в качестве параметра.
8. Класс CachingProxyRetriever должен поддерживать интерфейс Retriever.
*/