我是设计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一书,但它没有足够的实例让我完全掌握它的应用程序。
答案 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中,Observable
和Observer
类提供update()
回调,但EventListenerList
机制也很常见。