import java.util.HashMap;
import java.util.Optional;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Consumer;
class Storage<T> {
T value;
T getValue() {
return value;
}
void setValue(Mediator<T> mediator, String storageName, T value) {
this.value = value;
mediator.notifyObservers(storageName);
}
}
class Mediator<T> {
private final HashMap<String, Storage<T>> storageMap = new HashMap<>();
private final CopyOnWriteArrayList<Consumer<String>> observers = new CopyOnWriteArrayList<>();
public void setValue(String storageName, T value) {
Storage storage = storageMap.computeIfAbsent(storageName, name -> new Storage<>());
storage.setValue(this, storageName, value);
}
public Optional<T> getValue(String storageName) {
return Optional.ofNullable(storageMap.get(storageName)).map(Storage::getValue);
}
public void addObserver(String storageName, Runnable observer) {
observers.add(eventName -> {
if (eventName.equals(storageName)) {
observer.run();
}
});
}
void notifyObservers(String eventName) {
observers.forEach(observer -> observer.accept(eventName));
}
}
public class MediatorDemo {
public static void main(String[] args) {
Mediator<Integer> mediator = new Mediator<>();
mediator.setValue("Bob", 20);
mediator.setValue("Alice", 24);
mediator.getValue("Alice").ifPresent(age -> System.out.printf("Age for Alice: %d\n", age));
mediator.addObserver("Bob", () -> {
System.out.printf("New age for Bob: %s\n", mediator.getValue("Bob").orElseThrow(RuntimeException::new));
});
mediator.setValue("Bob", 21);
}
}