Pregunta

Hace poco corrió a través de varios objetos implementados a eventos mango con un mapeo codificado usando este patrón:

public void handleEvent(Event event)
{
    if(event.getCode() == SOME_STATIC_EVENT)
        doSomething(event);
    if(event.getCode() == ANOTHER_STATIC_EVENT)
        doSomethingElse(event);
}

donde las funciones doSomething se implementan como métodos de la misma clase.

Con la esperanza de luchar por acoplamiento flojo, ¿Cómo sugieren abstraer a cabo este patrón? Además, ¿cuál es el mejor enfoque para la asignación de funciones a un 0..n dispararon evento?

¿Fue útil?

Solución

Sí, básicamente lo que quiere hacer es crear una estructura de datos que se asigna un tipo de evento a una interfaz. He aquí una simple implementado como un mapa.

EventHandlerInterface h;
// eventMap contains a mapping of event codes to
// implementations of EventHandlerInterface
h = eventMap.get(event.getCode());
if(h != null)
{
    h.handle(event);
}

Esto le da la capacidad de manejar eficientemente un gran número de eventos y dinámicamente agregar, quitar y eventos de reasignación a diferentes manipuladores.

Otros consejos

Recientemente se produjo un puesto SOF que era bastante parecido y cercano que mi respuesta aquí puede responder a su pregunta bastante bien.

En lugar de un ejecutable, que haría su propia interfaz:

public abstract interface EventHandler
{
    public void run(Event event);
}

Se puede empezar por hacer el código un poco más limpio. Utilizar una variable local para sacar la event.getCode() repetida. Cambiar a enumeraciones para que pueda utilizar switch.

Si hay un patrón repetido puede decodificar a una interfaz de múltiples método de devolución de llamada, al igual que lo hace AWT.

Yo sugeriría que el registro de la incluso se vuelve más específico. Registrar una devolución de llamada diferente para cada tipo de evento. Incluso por lo que teniendo el código de evento fuera del evento, y tal vez eliminar el evento. Bajo las sábanas es posible mantener el código de evento para un mapeo a los manipuladores, pero esto debe ser opaco. La desventaja de este enfoque es que las clases internas anónimas Actualmente (JDK6) altamente detallado y control de clases es ineficiente (tiempos de carga y perm gen huella).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top