首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java中的事件通知

Java中的事件通知
EN

Stack Overflow用户
提问于 2010-12-07 17:26:48
回答 1查看 6.9K关注 0票数 1

在java中,我对观察者模式或JMS感到非常困惑。我希望像下面这样使用事件通知。让我们忘记那些JMS或观察者,您认为这是可能的还是可行的?如果是,如何完成?

代码语言:javascript
复制
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){
      //???
    }
}
EN

回答 1

Stack Overflow用户

发布于 2010-12-07 18:14:47

您需要注册(绑定)对象,而不是类。您可以在EventRegister中保持注册列表的静态,但我认为最好将它们作为SalesOrder的实例。所以应该是:

代码语言:javascript
复制
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);
    }
    // ...
}

如果您运行它,它将打印如下内容:

即将发布的

事件: Event@190d11

SalesOrder@a 90653将发布事件@190d11到Warehouse@de6ched,传递@c 17164侦听器。

事件@190d 11在仓库收到

事件@190d 11送货处收到@c 17164

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4379623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档