Решение этой проблемы зависит главным образом от того, какая стратегия является текущей. Для простоты я предполагаю, что пользовательский интерфейс одинаков для всех стратегий.
Практически вы будете создавать класс конструктора или метод фабрики. Что-то вроде этого:
interface StrategyPicker {
public Strategy getStrategy();
}
// Most likely used in the JFrame it is added to
class StrategyPickerUI extends JPanel implements StrategyPicker {
// initialize the panel with all the widgets
// and implement the getStrategy method. the getStrategy
// method should be called after the input is done in this
// panel (such as clicking an Ok or Apply button)
}
// You can also make one for the console app
class StrategyPickerSimple implements StrategyPicker {
// ...
}
Если вы хотите быть по-настоящему модным, вы создаете простой фабричный класс, чтобы удалить акт создания в своем собственном классе:
public class StrategyFactory() {
public static Strategy createStrategyFromParameters(StrategyParams sp) {
// creates the Strategy object... doesn't need to be public static
// and if it isn't, it will help making unit tests easier
}
// This nested class could be split up to StrategyAParams,
// StrategyBParams, StrategyCParams
public class StrategyParams {
data paramA;
int paramB_A;
int paramB_B;
int paramC_A;
String paramC_B;
float paramC_C;
}
}
// in StrategyPickerUI class
public getStrategy() {
StrategyParams sp = new StrategyParams();
sp.paramB_A = myJTextFieldParamB_A.getText();
// and so on...
return StrategyFactory.createStrategyFromParameters(sp);
}
Если вы хотите, чтобы пользовательский интерфейс был не монолитным, то разделите обязанности на свои собственные объекты. Надеюсь, это поможет.