2015-11-04 38 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) 
一個新對象