2010-12-07 3 views
1

En Java, je nourris très confus sur le modèle d'observateur ou JMS. Je veux utiliser la notification d'événement comme ci-dessous. Oublions les JMS ou Observateur, penses-tu que c'est possible ou faisable? Si oui, comment le compléter?notification d'événement en Java

newSalesOrder = new SalesOrder(); 
newSalesOrder.notified("new SalesOrder order ID="+orderId); 

EventRegister.bindEvent(SalesOrder.class, Delivery.class); 
EventRegister.bindEvent(SalesOrder.class, Warehouse.class); 

//////////// 
Delivery delivery = new Delivery(); 
delivery.listerning(new Event(source){ 
    if(source == SalesOrder.class){ 

    } 
}); 

////////// 
Warehouse warehouse = new Warehouse(); 
warehouse.listerning(new Event(source){ 
    if(source == SalesOrder.class){ 

    } 
}); 

/////////// 
EventRegister{ 
    static bindEvent(Class source, Class destination){ 
     //??? 
    } 
} 
+2

Vous n'avez pas vraiment décrit ce que vous voulez correctement. Vous venez de donner des signatures de méthodes, mais pas de réelle indication du comportement que vous voulez d'elles (ou même d'où viennent vos "événements") ... –

+0

Et pourquoi la restriction apparemment arbitraire ne permet pas l'utilisation du Motif Observateur ? –

Répondre

2

Vous devez enregistrer (lier) des objets et non des classes. Vous pouvez garder la liste d'enregistrement statique à EventRegister mais je pense qu'il est préférable de les garder comme instance à SalesOrder. Il serait donc:

import java.util.ArrayList; 
import java.util.List; 

public class Test { 
    public static void main(String[] args) { 
     SalesOrder mySalesOrder = new SalesOrder(); 

     Warehouse myWarehouse = new Warehouse(); 
     mySalesOrder.addListener(myWarehouse); 

     Delivery myDelivery = new Delivery(); 
     mySalesOrder.addListener(myDelivery); 

     Event myEvent = new Event(); 
     // Now 'myDelivery' and 'myWarehouse' objects will receive 'myEvent' 
     // object on their 'onEvent(Event event)' method 
     System.out.println("Event to be published: " + myEvent); 
     mySalesOrder.publishEvent(myEvent); 
    } 
} 

interface Listener { 
    public void onEvent(Event event); 
} 

class Event { 
    // Add reqired detail here! 
} 

class SalesOrder { 
    private List<Listener> listeners = new ArrayList<Listener>(); 

    public void addListener(Listener listener) { 
     listeners.add(listener); 
    } 

    public void removeListener(Listener listener) { 
     listeners.remove(listener); 
    } 

    // Use proper access modifier 
    public void publishEvent(Event event) { 
     System.out.println(this + " is goint to publish " + event 
       + " to " + listeners + " listeners."); 
     for (Listener listener : listeners) { 
      listener.onEvent(event); 
     } 
    } 

    // ... 
} 

class Warehouse implements Listener { 
    public void onEvent(Event event) { 
     // Do something when event received 
     System.out.println(event + " received at " + this); 
    } 
    // ... 
} 

class Delivery implements Listener { 
    public void onEvent(Event event) { 
     // Do something when event received 
     System.out.println(event + " received at " + this); 
    } 
    // ... 
} 

Si vous exécutez il imprimera quelque chose comme:

événement à publier: Event @ 190d11

SalesOrder @ a90653 est goint de publier l'événement @ 190d11 à [Warehouse @ de6ced, Delivery @ c17164] auditeurs.

événement @ 190d11 reçu à @ Warehouse de6ced

événement @ 190d11 reçu à la livraison @ c17164

Ceci est un exemple trivial, en cas d'utilisation de la vie réelle, vous pouvez envisager d'utiliser une implémentation thread-safe et refactoring d'enregistrement de SalesOrder en utilisant la composition ou l'héritage.

Questions connexes