У меня есть класс RabbitQueue, который в основном действует как очередь и реализует мой интерфейс Pollable.
У меня также есть класс SaveToDatabaseStrategy, который реализует мой интерфейс DataProcessingStrategy. Это разработано по образцу стратегии.
Теперь мой класс InputHandler, который реализует мой интерфейс InputListener, содержит экземпляр интерфейса Pollable и один из интерфейсов DataProcessingStrategy.
Однако я не хочу устанавливать универсальный тип (String) при объявлении этих двух полей, поскольку универсальный тип зависит от реализации этого интерфейса, который будет описан позже.
Как бы вы спроектировали это?
public interface Pollable<T> {
T poll();
}
public class RabbitQueue implements Pollable<String> {
// code..
}
public interface DataProcessingStrategy<T> {
void processData(T t);
}
public class SaveToDatabaseStrategy<T> implements DataProcessingStrategy<T> {
private Repository<T, ?> repo;
public SaveToDatabaseStrategy(Repository<T, ?> repo) {
this.repo = repo;
}
@Override
public void processData(T data) {
repo.create(data);
System.out.printf("Received data of type %s: %s\n", data.getClass().getSimpleName(), data);
}
}
public interface InputListener<T> {
void inputReceived();
void inputReceived(T t);
}
public class InputHandler implements InputListener<String> {
private Pollable<String> queue;
private DataProcessingStrategy<String> strategy;
public InputHandler(String host, String queueName) throws IOException, TimeoutException {
queue = new RabbitQueue(host, queueName, this);
}
public void setStrategy(DataProcessingStrategy strategy) {
this.strategy = strategy;
}
@Override
public void inputReceived() {
System.out.println("Input received!");
strategy.processData(queue.poll());
}
@Override
public void inputReceived(String s) {
System.out.println("Input received: " + s + "!");
System.out.println("> " + queue.poll());
}
}