2011-07-07 134 views
3

我试图解决在解释update()调用的observable时要涉及的丑陋的条件转换,该observable将要通知其观察者多种类型的事件。另外,我宁愿不将标志传递给notifyObservers()/ update()方法。一个可观察事件的多个可观察事件

我不想让观察员有轮询观察的对象,找出有什么变化,我想这个新的数据通过update()方法被赋予观察员(或类似)。

我有一个解决方案的想法。我为每种类型的通知创建一个可观察对象。例如:可观察到的是代表一个硬件设备的对象,它将包含代表其状态观测:

public final Observable connectionState = new Observable(); 
public final Observable dataState = new Observable(); 

这样,观察员并不需要做任何形式的查询或有条件的铸造,作为一个观察者,即每个通知类型都可以使用一个重写的update()方法。

太多的无奈后,这是最完美的解决方案,我能想到的,但我有我已经错过了关于如何正确使用观察员/观测量点这个可怕的感觉。

我与解决方案的主要问题是:

  1. 它仍然涉及铸造(至少是没有条件)
  2. 由于观测需要可观察到,它们必须是public成员。虽然这允许观察者调用addObservable(),但它也允许它们调用notifyObservers()。

我做对了吗?

谢谢

回答

3

您正在为观察者模式的Java 1.0实现的局限性而苦苦挣扎。看看this answer的问题java.util.Observable是否在任何地方使用?

他们都没有用,因为他们的 设计是有缺陷的:他们是不是类型 安全。这 实现观察员任何可观察到, 这可能会导致微妙的错误下来 线可以连接任何对象。

包装纸他们类型安全 接口内是大约相同的量 工作作为实施从 划痕图案的,所以我想后者是 在大多数情况下优选的。

与其试图将您的需求强加给java.util.Observer,或许您应该实现自己的更适合您需求的模式版本。

3

你可以尝试使用可观察与访问者模式配对在一起:

class MyObserver implements Observer, EventVisitor { 
    public void update(Observable o, Object arg) { 
     ((EventAcceptor) arg).accept(this); 
    } 

    public void visit(SomeEvent v) { 
     System.out.println("SomeEvent: " + v.s); 
    } 

    public void visit(AnotherEvent v) { 
     System.out.println("AnotherEvent: " + v.info); 
    } 
} 

interface EventVisitor { 
    void visit(SomeEvent v); 
    void visit(AnotherEvent v); 
} 

interface EventAcceptor { 
    void accept(EventVisitor v); 
} 

class SomeEvent implements EventAcceptor { 
    public final String s; 

    public SomeEvent(String s) { 
     this.s = s; 
    } 

    public void accept(EventVisitor v) { 
     v.visit(this); 
    } 
} 

class AnotherEvent implements EventAcceptor { 
    public final String info; 

    public AnotherEvent(String info) { 
     this.info = info; 
    } 

    public void accept(EventVisitor v) { 
     v.visit(this); 
    } 
} 

class MyObservable extends Observable { 
    void handleSomeEvent() { 
     setChanged(); 
     notifyObservers(new SomeEvent("some event")); 
    } 

    void handleAnotherEvent() { 
     setChanged(); 
     notifyObservers(new AnotherEvent("some event")); 
    } 
} 

class Sample { 
     public static void main(String[] args) { 
      MyObservable observable = new MyObservable(); 
      observable.addObserver(new MyObserver()); 
      observable.handleSomeEvent(); 
      observable.handleAnotherEvent(); 
     } 
} 
0

有很多你的问题可能的解决方案。如果您觉得Observable类不适合您的问题,则可以维护您自己的侦听器集合。

interface Listener { 
    void onEvent1(Type1 arg); 
    void onEvent2(Type2 t2, Type3 t3); 
    void onEvent3(); 
} 

List<Listener> listeners = new CopyOnWriteArray<Listener>(); 

public void addListener(Listener l) { listeners.add(l); } 

public void onEvent1(Type1 arg) { 
    for(Listener l: listeners) l.onEvent1(arg); 
}