在java中,我对观察者模式或JMS感到非常困惑。我希望像下面这样使用事件通知。让我们忘记那些JMS或观察者,您认为这是可能的还是可行的?如果是,如何完成?
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){
//???
}
}发布于 2010-12-07 18:14:47
您需要注册(绑定)对象,而不是类。您可以在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);
}
// ...
}如果您运行它,它将打印如下内容:
即将发布的
事件: Event@190d11
SalesOrder@a 90653将发布事件@190d11到Warehouse@de6ched,传递@c 17164侦听器。
事件@190d 11在仓库收到
事件@190d 11送货处收到@c 17164
这是一个简单的示例,在现实生活中,您可以考虑使用线程安全的实现,并使用组合或继承从SalesOrder中重构注册。
https://stackoverflow.com/questions/4379623
复制相似问题