应用架构问题

时间:2010-07-04 00:45:07

标签: java model-view-controller design-patterns architecture oop

我是设计OO系统的新手。我有一个简单的Flash Cards应用程序,我无法找到构建系统的正确方法。该应用程序有一个简单的GUI,带有问题,答案和几个按钮。问答数据集存储在Derby嵌入式数据库中。

快速设置:
数据库类 - 处理连接,断开连接并根据选定的过滤器(当前由CardSet对象调用)返回ArrayList(DB类设置为静态)
CardSet Class-保存当前使用的ArrayList,保存当前的卡 卡类 - 保存闪存卡的数据(问答,耦合其他东西)
App Class - 创建GUI并处理动作事件

所以这是我的问题:我想分离GUI和应用程序逻辑。我认为它可能是MVC的一个好例子,但我不确定如何将它全部分开(从未使用它)。是否在main中创建了一个控制器类,然后启动GUI,然后创建其他类(在我的例子中,是CardSet)。访问怎么样?某些事情需要保持不变吗?

另一个问题 - 为了处理GUI事件,您是否只是将其设置为在控制器类中调用泛型方法?例如,单击“下一张卡片”按钮,它是否只是调用controller.nextCardAction()之类的东西?我是否应该尝试使用Observer模式让GUI提取数据?

对不起初学者的问题,但这是我第一次在Java应用程序中使用。任何帮助都会很棒。欢迎良好的链接。我有Head First Design Patterns一书,但它没有足够的实例让我完全掌握它的应用程序。

2 个答案:

答案 0 :(得分:1)

调查听众模式。

重写GUI的一部分以收听“当前的闪卡”。 GUI的代码应如下所示:

public interface ModelListener {
   public void modelChanged();
}

public class FlashCardView implements ModelListener {

   private FlashCard model;

   public FlashCardView(FlashCard card) {
     setModel(card);
   }

   public void setModel(FlashCard card) {
     if (model != null) {
       model.removeListener(this);
     }
     model = card;
     model.addListener(this);
   }

   public void modelChanged() {
     (read out model values and update the screen displayed values)
   }

}

public interface Model {
    public void addListener(ModelListener listener);
    public void removeListener(ModelListener listener);
}

public class FlashCard() {

   private String answer;

   private String question;

   private Vector<ModelListener> listeners;

   public FlashCard(String question, String answer) {
     this.question = question;
     this.answer = answer;
     this.listeners = new Vector<ModelListener>();
   }

   public void setAnswer(String newAnswer) {
     this.answer = newAnswer;
   }

   public void setQuestion(String newQuestion) {
     this.question = newQuestion
   }

   public void addListener(ModelListener listener) {
     listeners.add(listener);
   }

   public void removeListener(ModelListener listener) {
     listeners.remove(listener);
   }

   private void notifyListeners() {
     for (ModelListener listener : listeners) {
        listener.modelChanged();
     }
   }

}

将按钮执行的所有操作以及选择在任何给定时间显示到“Controller”类中的“视图”。基本上,它应该调用setModel(...)方法,它应该从当前显示的窗口添加和删除“视图”类。

虽然这可能看起来像显示简单闪卡的一些代码,但请记住,您的许多模型将比闪卡更复杂。您可能需要在不久的将来代表测试,主题等课程。

答案 1 :(得分:1)

这是一个非常简单的example and discussion,可能会有所帮助。

  

你会在哪里阅读数据库内容?

我希望模型保持对当前CardSet的引用,在构造时将其初始化为某个默认值,并在控制器说用户想要新集时重新填充它。只有CardSet知道Card来自何处或如何获得新集。为了响应用户的操作,视图会询问模型中的下一张或上一张卡,并在它从其正在侦听的模型中回来时自行更新。

不要将控制器与控件混淆:视图和控制器都可以管理按钮等控件。在引用的example中,控制器有一个重置按钮,而视图有一个游戏按钮面板。在您的应用程序中,控制器可能会启动更改集,而视图可以控制在集合中的卡之间移动。

作为参考,MVC图中的实线是方法调用,虚线是对侦听器的回调。在引用的example中,ObservableObserver类提供update()回调,但EventListenerList机制也很常见。