模型类是应该扩展Observable还是应该是扩展Observable Observable的类中的变量

时间:2014-09-27 13:18:02

标签: java swing observable

在一个java swing项目中,我有一个模型类,它保存某个JPanel的状态。我需要将这些数据提供给视图。 我看到它有两个选项。有一个扩展Observable的类,并将模型作为实例变量。请参阅下面的代码示例。或者只是让模型类扩展Observable本身。

public class BoardObservable extends Observable {

private Board board;

public Board getBoardText() {
    return board;
}

public void setBoardText(Board board) {
    this.board = board;
    setChanged();
    notifyObservers(board);
}
}

因此,在实现Observer的视图类中,它将使用Observable参数或Object参数来填充JPanel。

    @Override
public void update(Observable o, Object arg) {
    if(o instanceof BoardObservable) {
        this.board = (Board) arg;
    }
}

哪个是最佳选择?

2 个答案:

答案 0 :(得分:1)

如上所示,使用额外的类似乎是多余的。但是,在实际尝试理解您要执行的操作时,看起来您已经支持Model-View-Controller (MVC)设计。

由于该链接非常好地处理MVC,我将直接解决您的问题。主要目标是将View和交互(控制器)与模型分离,以便您可以将模型重用于其他用户界面。

BoardObserver应成为您的控制器。它也应该是理事会的观察员,但它也直接调用理事会对象。如果影响视图的模型有任何更改(不仅仅是更新信息,而是逻辑状态 - 就像按钮因程序或数据的状态而被禁用),控制器应该处理该信息并进行相应的更新观点。

让视图成为董事会的观察者。视图应通知控制器任何操作,控制器应更新视图的逻辑状态(禁用按钮等)。如果模型中的原始数据发生更改,您可以直接从该更新视图。

最后,将它们全部拉出来。我倾向于将模型传递给Controller的构造函数,让Controller创建(并控制)视图。

Model m = new Model();
Controller c = new Controller(m);

答案 1 :(得分:1)

您的方法取决于observer pattern,已审核here。由于ObservableObserver是互补的,因此您需要两者。通常情况下,模型可以扩展Observable,如BoardObservable所示,但如有必要,您的模型可以delegate加载到Observable。相反,视图只需要实现Observer接口;此example委托更新嵌套的ModelObserver

引用实施观察员模式的替代方法here。另请参阅Swing控制器上的answer