2010-12-07 7 views
1

In Java füttere ich sehr verwirrt auf Beobachtermuster oder JMS. Ich möchte die Ereignisbenachrichtigung wie unten verwenden. Lassen Sie uns diese JMS oder Observer vergessen, denken Sie, dass es möglich oder machbar ist? Wenn ja, wie vervollständige ich es?Ereignisbenachrichtigung in 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

Sie haben nicht wirklich beschrieben, was Sie richtig wollen. Sie haben gerade einige Methodensignaturen angegeben, aber keine wirklichen Hinweise darauf, welches Verhalten von ihnen gewünscht wird (oder sogar wo Ihre "Ereignisse" herkommen) ... –

+0

Und warum die scheinbar willkürliche Einschränkung, das Observer Pattern nicht zuzulassen ? –

Antwort

2

Sie müssen (Bind) Objekte nicht Klassen registrieren. Sie können die Registrierungsliste bei EventRegister statisch halten, aber ich denke, es ist besser, sie als Instanz bei SalesOrder zu behalten. Es wäre also:

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

Wenn Sie es ausführen wird es so etwas wie Druck:

Ereignis veröffentlicht werden: Event @ 190d11

Salesorder @ a90653 ist goint Ereignis zu veröffentlichen @ 190d11 an [Warehouse @ de6ced, Delivery @ c17164] Listener.

Ereignis @ 190d11 bei Warehouse @ erhielt de6ced

Event @ 190d11 bei Lieferung @ c17164 erhielt

Dies ist eine triviale Probe, im wirklichen Leben Anwendungsfälle können Sie erwägen eine Thread-sichere Implementierung mit und Refactoring Registrierung aus SalesOrder mit Zusammensetzung oder Vererbung.