2010-07-04 193 views
3

我是设计面向对象系统的新手。我有一个简单的闪存卡应用程序,我无法找出构建系统的正确方法。该应用程序有一个简单的图形用户界面,包含问题,答案和情侣按钮。问题和答案数据集存储在Derby嵌入式数据库中。应用程序体系结构问题

快速安装:
数据库类 - 处理的连接,断开连接,并返回基于选定的滤光器(当前由CardSet对象调用)上一个ArrayList(DB类被设置为静态)
CardSet讲座持有该ArrayList当前正在使用,保持当前卡
卡类 - 适用于闪存卡中的数据(问题和答案,其他的一些东西)
App类 - 创建GUI和处理action事件

所以这里是我的问题:我想分离GUI和应用程序逻辑。我认为这可能是一个MVC的好例子,但我不知道如何真正将它分开(从未使用过)。控制器类是否在主体中创建,然后启动GUI,然后创建其他类(在我的例子中是CardSet)。访问怎么样?某些事情需要静态吗?

另一个问题 - 对于处理GUI事件,你是否设置它来调用控制器类中的泛型方法?例如,点击“下一张卡片”按钮,是否应该调用像controller.nextCardAction()这样的东西?我应该尝试使用Observer模式让GUI获取数据吗?

对于初学者的问题很抱歉,但这是我第一次在Java应用程序中执行操作。任何帮助都会很棒。良好的联系也是受欢迎的。我有Head First Design Patterns书,但它没有足够的真实例子让我完全掌握它。

+0

假设您使用SWT或Swing作为GUI安全吗? – btreat 2010-07-04 00:54:10

+0

GUI的Swing。我有1个主要的JFrame,它拥有1个主面板,可容纳3个子面板。 – Awaken 2010-07-04 02:40:30

回答

1

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

你会在哪里阅读数据库的东西?

我期望的模式来维持一个参考目前CardSet,它初始化为建设一些默认每当控制器说用户想要一套新的补充它。只有CardSet知道Card来自哪里或如何获得一个新的集合。响应用户操作,视图会询问下一张或上一张名片的模型,并在它从所听到的模型中听到时自动更新。

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

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

+0

@Aaken:我已经更新了我的回答以回应您的评论。 – trashgod 2010-07-04 03:51:51

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(); 
    } 
    } 

} 

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

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

+0

感谢您的详细回复。你会在哪里阅读数据库的东西?控制器类?你会使用这种模式将你的闪存卡存储在那里吗? – Awaken 2010-07-04 02:47:33

+0

控制器将根据需要从存储设备读取创建新模型类。你存储闪存卡的地方是你的业务,但它可能在磁盘或数据库中。由于存储模拟模型不同,所以不同的模式可能是最好的。至于这个模型的代码,那么这真的取决于你写的东西,我不能为你提供任何准确的程序,考虑到需求的松散程度,但我很高兴向你展示一个模式如何适用于其中的一部分。 – 2010-07-04 03:24:52