[英]Java generics software engineering design
我有一個RabbitQueue類,它基本上像一個隊列,並實現了我的Pollable接口。
我還有一個類SaveToDatabaseStrategy ,它實現了我的DataProcessingStrategy接口。 這是根據策略模式設計的。
現在,實現我的接口InputListener的類InputHandler包含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());
}
}
您可以將類型參數添加到InputHandler類。
public class InputHandler<T> implements InputListener<T> {
private Pollable<T> queue;
private DataProcessingStrategy<T> 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().toString());
}
}
然后創建一個新的對象,如
new InputHandler<String>(host, queueName)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.