2010-12-07 8 views
1

Javaでは、私はオブザーバパターンまたはJMSで非常に混乱しています。私は以下のようなイベント通知を使用したいと思います。 これらのJMSまたはObserverを忘れてしまいましたか、それは可能か実行可能だと思いますか?はい、それを完了する方法は?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

あなたは本当にあなたが欲しいものを本当に記述していません。あなたはちょうどいくつかのメソッドシグネチャを与えただけですが、あなたがそれらから(またはあなたの "イベント"がどこから来たのか)あなたが望む振る舞いの実際の表示はありません... –

+0

そして、どうして見た目には、Observer Pattern ? –

答えて

2

クラスではなくオブジェクトを登録(バインド)する必要があります。 EventRegisterでは登録リストを静的に保つことができますが、SalesOrderでインスタンスを保持する方が良いと思います。だから、次のようになります。

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

あなたがそれを実行した場合、それはのようなものに印刷されます:

に公開するイベントを:190d11

@イベントSalesOrderは、@ a90653 190d11 @イベントを公開することgointです[Warehouse @ de6ced、Delivery @ c17164]リスナーに送信します。 190d11 @

イベントは、倉庫@で受信190d11 @

イベントは、これは些細なサンプルで配信する@ c17164

で受信し、実際のユースケースであなたはスレッドセーフな実装を使用して検討することde6ced SalesOrderの登録またはリファクタリングを構成または継承を使用して行います。

関連する問題