android - 如何使用 RxJava 实现 NullObject 模式

标签 android design-patterns rx-java null-object-pattern

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

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

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

@edit

我决定保留我的解决方案,我认为在将其包装在类里面后,它已经足够好了。我赞成下面的答案,但是它与我的问题不匹配,因为它与 rx-java 实现没有直接关系,但是建议代理模式很有帮助。

最佳答案

我猜你要找的是 proxy pattern .

代理(顾名思义)是一个替代当前不可用的另一个对象的对象。

您可能希望以这种方式使用 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。稍后当“真正的”Observable 可用时,您可以将其设置为 ObservableProxy 的目标。代理将自己注册为目标的 Observer,并将通知转发给它的 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");
        }
    }
}

关于android - 如何使用 RxJava 实现 NullObject 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33628850/

相关文章:

android - Android VideoView 是否缓存流式视频?

用于缓存接受通用参数的操作的 C# 模式

java - 为什么不调用 doOnDispose?

java - RxJava 谓词过滤器

java - RxJava : How to retry on next?

android - 应用程序关闭时运行 android 服务

java - 跨类共享公共(public)代码的最佳实践

打开外部 URL 时出现 "startActivityForResult(Intent,int) in Fragment has been deprecated"的 Java 解决方案?

oop - 何时使用抽象工厂模式?

java - 自定义 Java 查询类 (DSL) : Builder pattern, 静态导入或其他用于复杂查询的东西?