可观察的更新传递多个args

时间:2018-01-14 17:02:57

标签: java observable

我正在构建一个包含以下类的程序:
DataModel - 扩展Observable并在我们的GUi中存储标签的字符串
显示 - 实施Observer并拥有我们的更新方法&标签

当控制器对DataModel中的String statusText进行更改时,我调用setChanged()& notifyObservers(this.statusText)然后在Display类中调用update(Observable o,Object arg)。

我的问题是,当我为不同的标签设置多个字符串时,我该如何处理?我的第一个想法是将所有字符串放入一个列表中,然后更新方法如下所示(这种耦合太多了吗?):

    if (arg != null && arg instanceof String[]) {
        Platform.runLater(new Runnable() {
            @Override
            public void run() {
                String[] strings = (String[]) arg;
                status.setText(strings[0]);
            }
        });
    }

1 个答案:

答案 0 :(得分:2)

考虑重构一下设计。而不是 DataModel 只是简单地推送字符串,创建另一种类型来表示可能与下游视图相关的模型状态,例如:

class State {
    public String lastModifiedBy;
    public String lastModifiedAt;
}

...然后让 DataModel 公开一个方法,该方法返回视图可以订阅的Observable<State>,例如:

dataModel.bind().subscribe(
    state -> {
        status.setText(state.lastModifiedBy)

        someOtherTextView.setText(state. lastModifiedAt)
    },
    error -> {
        Log.e(getClass().getName(), error)
    }
)

提出“正确”抽象将需要一些思考,但在视图和模型之间引入中介类型可以让您有一定的能力将它们彼此独立地进化。

阅读Model-View-ViewModel(MVVM)设计模式,如果你还没有。