7

Tengo varias clases de Java que implementan el patrón de estrategia. Cada clase tiene parámetros de número variable de diferentes tipos:Patrón de estrategia parametrizado

interface Strategy { 
    public data execute(data); 
} 

class StrategyA implements Strategy { 
    public data execute(data); 
} 

class StrategyB implements Strategy { 
     public StrategyB(int paramA, int paramB); 
     public data execute(data); 
} 

class StrategyC implements Strategy { 
     public StrategyC(int paramA, String paramB, double paramC); 
     public data execute(data); 
} 

Ahora quiero que el usuario puede introducir los parámetros en algún tipo de interfaz de usuario. La IU debe elegirse en tiempo de ejecución, es decir, las estrategias deben ser independientes de ella. El diálogo de parámetros no debe ser monolítico y debe existir la posibilidad de que se comporte y se vea diferente para cada estrategia y UI (por ejemplo, consola o Swing).

¿Cómo resolvería este problema?

Respuesta

4

Una posibilidad de hacerlo es con algo similar al patrón de diseño Constructor:

Para cada tipo de estrategia que debe tener un constructor correspondiente (uno o más). El constructor no funciona como un generador normal que recibe todos los params init como argumentos de método; En su lugar, debe bloquear hasta que se reciba la entrada correspondiente. Algunos constructores mostrarán un cuadro de diálogo Swing y esperarán, otros imprimirán en la consola y esperarán las entradas, otros podrán leer de un archivo, etc. Después de que un constructor reciba todas las entradas, puede crear la instancia de estrategia y devolverla.

De esta manera desacoplará la lógica de recuperación de datos de la propia estrategia. Otra ventaja es que puede tener una interfaz genérica de todos los constructores, por lo que una vez que elija un constructor específico, puede manipularlo con el mismo código.

+0

+1 En otras palabras, los propios constructores serían estrategias. Bonito. –

1

La solución de este problema depende principalmente de qué determina qué estrategia es la actual. Para simplificar, asumo que la interfaz de usuario es la misma para todas las estrategias.

Prácticamente harás una clase de generador o un método de fábrica. Algo a lo largo de esta línea:

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 { 
    // ... 
} 

Si quieres ser realmente sofisticado, se crea una clase de fábrica sencillo para eliminar el acto de crear en su propia clase:

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

Si desea mantener la interfaz de usuario no monolítico, luego divide las responsabilidades en sus propios objetos. Espero que esto ayude.

0

Si sus clases de parámetros contienen un objeto simple (Números, Booleanos, Fecha, Cadena) puede intentar generar su interfaz en tiempo de ejecución.

Será más difícil para generar una interfaz de usuario para objetos compuestos y colección de parámetros

un vistazo a Metawidget es un generador de interfaz de usuario de gran alcance.

Cuestiones relacionadas