如何使用 RxJava 实现 NullObject 模式



是的,这听起来可能有点雄心勃勃,但这是我想要实现的目标:

我有保存我的热Observable的类,类需要一些时间才能正确准备它(在另一个地方创建它并获得引用(,因此当另一个类要求它时,引用可能仍然是空的(导致空指针(。我试图实现的类似于 NullObject 模式:返回可以安全订阅的空可观察(而不是空(,并在正确创建可观察时开始发出项目。

解决该问题的一种方法是创建充当客户端类和 ObservableHolder 类之间的桥梁的PublishSubject。 发布主题引用始终返回到客户端,当Observable准备就绪时,它将把所有事件转发到主题。这是一个很好的解决方案吗?或者可以做得更好?

@edit

我决定继续使用我的解决方案,我认为在课堂上包装后,它已经足够好了。我对以下答案投了赞成票,但是它与我的问题不匹配,因为它与rx-java实现没有直接关系,但是建议代理模式很有帮助。

我想

你正在寻找的叫做代理模式。

代理是(顾名思义(一个对象,它取代了当前不可用的另一个对象。

您可能希望以这种方式使用 java.util.Observable 实现它

public class ObservableProxy extends Observable {

    private ObservableProxyAdapter observableProxyAdapter = new ObservableProxyAdapter();
    private Observable target;
    public void setTarget(Observable target) {
        if(this.target != null){
            // if this proxy was connected to an observer... disconnect
            this.target.deleteObserver(observableProxyAdapter);
        }
        this.target = target;
        if(this.target != null){
            // If a new target is set... connect to it
            this.target.addObserver(observableProxyAdapter);
        }
    }

    private class ObservableProxyAdapter implements Observer {
        public void update(Observable o, Object arg) {
            // forward notifications from the target
            setChanged();
            notifyObservers(arg);
        }
    }
}

您将ObservableProxy分发给客户。客户可以自行注册ObservableProxy。稍后,当"真实"可观察量可用时,您可以将其设置为ObservableProxy的目标。代理将自身注册为目标的Observer,并将通知转发给其观察者。

+-----------------+  notify  +---------------+   notify   +--------------+
| real observable |  ------> | proxy adapter |   ------>  | observables  |
+-----------------+          +---------------+            |  of proxy    |
                                                          +--------------+

下面是一个示例应用程序

public class ObservableProxyTest {
    public static void main(String[] args) {
        ObservableProxy observableProxy = new ObservableProxy();
        Observer someObserver = new Observer() {
            public void update(Observable o, Object arg) {
                System.out.println(arg);
            }
        };
        observableProxy.addObserver(someObserver);

        // Later the real observer becomes available
        RealObservable realProxy = new RealObservable();
        observableProxy.setTarget(realProxy);

        // notifications will be forwarded
        realProxy.notifyHello();
    }
    private static class RealObservable extends Observable {
        public void notifyHello(){
            setChanged();
            super.notifyObservers("Hello World");
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新