2010-12-07 74 views
1

在java中,我对观察者模式或JMS非常困惑。我想要使​​用下面的事件通知。 让我们忘记那些JMS或观察者,你认为这是可能的或可行的吗?如果是,如何完成它?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

你还没有真正描述你想要的东西。你刚刚给出了一些方法签名,但没有真正表明你想要从他们那里得到的行为(甚至是你的“事件”来自哪里)...... – 2010-12-07 17:29:33

回答

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是goint发布活动@ 190d11到[Warehouse @ de6ced,Delivery @ c17164]听众。

活动@在仓库@收到190d11 de6ced

活动@分娩@ c17164收到190d11

这是一个简单的示例,在现实生活中使用的情况下,您可以考虑使用一个线程安全的实现并使用组合或继承重构注销SalesOrder。