2015-11-04 32 views
0

我有一个类RabbitQueue它基本上就像一个队列,并实现我的Polbly接口。Java泛型软件工程设计

我也有一类SaveToDatabaseStrategy它实现了我的DataProcessingStrategy接口。这是根据战略模式设计的。

现在,我的InputHandler类实现了我的接口InputListener,它包含一个Pollable接口实例和一个DataProcessingStrategy接口。

但是,我不想在声明这两个字段时设置泛型类型(字符串),因为泛型类型取决于稍后给出的此接口的实现。

您会如何设计?

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()); 
    } 
} 

回答

0

您可以将类型参数添加到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) 
一个新对象