2011-06-21 29 views
6

Estoy tratando de comprender el patrón de diseño más adecuado (Java) para procesar una serie de mensajes. Cada mensaje incluye un "tipo" que determina cómo deben procesarse los datos contenidos en el mensaje.Patrón de diseño para procesar eventos

He estado considerando el patrón Command, pero me cuesta entender las funciones/relevancia de las clases de comando específicas. Hasta ahora, he determinado que el receptor contendrá el código que implementa los métodos de procesamiento de mensajes. Los comandos concretos se instanciarían en función del tipo de mensaje. Sin embargo, no tengo idea de cómo se deben pasar los datos reales del mensaje. ¿Debería pasarse al constructor del receptor con los métodos de receptor apropiados que son invocados por el método de ejecución de comando concreto? ¿Quizás los datos del mensaje se deben pasar en las invocaciones del método de acción del receptor?

Soy bastante nuevo en todo esto por lo que cualquier orientación sería apreciada.

Esto puede ayudar:

public interface Command { 
    public void execute(String msg); 
} 

public class AO1Command implements Command { 

    Receiver rec = new Receiver(); 

    public void execute(String msg) { 
     rec.admit(msg); 
    } 
} 

public class CommandFactory { 

    public protected CommandFactory() { } 

    public static Command getInstance(String type) { 

     if (type.equals("A01")) return new A01Command(); 
     else if (type.equals("A02")) return new A02Command(); 
     else { 
      return null; 
     } 
} 
+0

Solo una pequeña nota al margen. Nunca use el operador para igualdad (==) para comparar cadenas. Dependiendo de la implementación de jvm, "hello" == "hello" podría ser falso. Esto se debe a que == operador usa identidad de objeto, lo que significa que solo es verdadero si ambos objetos son idénticos. "hola" == "hola" en realidad podría construir dos objetos de cadena -> no idénticos.Use el método equals() en su lugar – bennidi

+0

@bennidi: Gracias por esto. He editado el ejemplo y he comprobado el código original :) – skyman

Respuesta

3

Ok, su título lo dice un patrón para el manejo de eventos. Si está hablando de un marco de eventos real, entonces el patrón Observer/Observable viene a la mente. Esto funcionaría cuando quieras disparar un evento de algún tipo, luego haz que los manejadores de eventos recojan el procesamiento de los eventos.

Parece que su problema está en los detalles de implementación del patrón de comando. ¿Puedes publicar algún código que muestre dónde estás atrapado?

Tenga en cuenta que los patrones no son mutuamente excluyentes, puede usar el patrón de comando en el contexto del patrón Observable.

EDITAR - basado en el código, debe

1) hacer que el CommandFactory estática.
2) pase el tipo al método getCommand, que también debe ser estático.
3) No es necesario para esta reflexión, puede simplemente hacer

if (type == "type1") return new Command1(); 
else if (type == "type2") return new Command2(); 
... 

No estoy diciendo que no se puede utilizar la reflexión, estoy diciendo que su complicar lo que está tratando de hacer. Además, la forma en que lo está haciendo vincula el String que representa el tipo de mensaje a los detalles de implementación de los nombres de clase de comando, lo que parece innecesario.

+0

¿Puedes ampliar esto? Un observador podría usarse para recopilar mensajes para su procesamiento, p. si se generan haciendo clic en los componentes de la GUI de Swing, pero el patrón de comando parece más relevante para procesar realmente los mensajes. – Ben

+0

@Ben sí más viene – hvgotcodes

+0

Gracias por todos los comentarios. He estado trabajando más en esto: explicar los mensajes con los que estoy tratando son HL7 (Lenguaje de salud 7). No es que eso importe, pero las estructuras son similares, solo las acciones requeridas son diferentes. Entonces, un A01 es un "paciente admitido" y un A02 es una "transferencia de paciente". La clave es que cada mensaje tiene un tipo (A01, A02, etc.). Así que trabaja a través del consejo: – skyman

1

Estás en el camino correcto. Un patrón de comando es la solución adecuada al problema delineado.

Para responder a su pregunta, su CommandFactory instanciaría una instancia de comando adecuada basada en el diferenciador de datos (en este caso, algunos datos en su mensaje). A continuación, invocaría un método en la instancia de Command, pasando su mensaje. Es práctica (la mejor) común llamar a este método Ejecutar (...), pero puede llamarlo como lo desee.

+0

He intentado hacer esto con el código de ejemplo que cargué arriba. En algunos de los ejemplos que he analizado, el código real que implementa los comandos está encapsulado en los métodos del receptor de comandos, de modo que el comando ejecutar el método simplemente llama a decir receiver.admit(). Esto significaría (creo) que el mensaje sería retenido por el receptor en lugar del comando. Disculpas si confundo cosas aquí ... – skyman

0

Es posible que desee echar un vistazo al proyecto Jakarta Digester (para procesar XML), tiene una implementación SAX, que es una API basada en eventos como se explica aquí http://www.saxproject.org/event.html, es una breve explicación pero podría servir como punto de partida para ti.

Cuestiones relacionadas