java - 如何为猜字游戏实现 MVC 模式?

标签 java swing model-view-controller jbutton

我有一些猜字游戏的工作代码。但我担心它不会限制设计规则,尤其是 MVC图案。附图是我的GUI现在。我将对象从一个类(class)扔到另一个类(class),我听说这是一种糟糕的风格。虽然我同意这一点,但我无法想出好的 MVC猜字游戏或通常称为 Hangman 的模式方法。 主应用程序将有一些像这样的:

public class Application {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                runApp();
            }

        });
    }

    public static void runApp() {
        Model model = new Model();
        View view = new View(model); //not sure if this correct, some suggest it is valid and some not

        Controller controller = new Controller(view, model);
    }

}

我将如何处理这个问题? GUI如所附图片所示,将是 View类(class)。这包括所有 JButtons, Textfield, borders, labels等附上actionlistenersJButtonsView

controller将通过 eventsmodel .例如,如果一些 letter buttons被点击,它会将字母“A”被点击传递给modelmodel要么将指令发送至controller更新view否则它将更新 view直接地。根据我对 MVC 的理解图案,model类必须与 view 分开实现和测试和 controller .我不明白如何在这里实现这一目标。我有完整的代码可用。我需要重构以限制 MVC 模式。请传递你的建议。 enter image description here

最佳答案

我认为您感到困惑的领域之一是“责任”。每个组件负责什么以及它实际可以做什么。

问题不在于您在程序周围传递对象,而更多的是您传递的对象暴露了您的应用程序的某些部分,而接收者不知道或应该被允许操纵。

我的意思是,如果您要将“按钮”面板传递给“猜测”面板,因为您希望能够让“猜测”面板检测按钮何时被单击,那么您已将“按钮”面板暴露给您的应用程序的某个区域,但您无权实际查看它。

是什么阻止“猜测”面板移除组件?没什么...

相反,我们应该使用 interfaces 来确定应用程序的每个部分可以做什么和不能做什么以及可以使用哪些信息。

这就是您的模型发挥作用的地方。该模型确定哪些信息可用、如何访问这些信息以及可能触发哪些事件以通知相关方模型已更改。

例如。您的“按钮”面板会告诉模型用户又做了一次猜测(响应用户按下按钮)。然后该模型会引发一个事件,该事件会通知“猜测”面板发生了变化。然后,“猜测”面板会相应地更新它的状态,向模型询问它需要的信息,以表示模型的当前状态(就它所负责的而言)。

你可以看看

现在,有了 MCV 模式, View 必须能够看到模型, Controller 必须能够看到 View 和模型,模型不关心。

Controller 正在监听 View 的变化(即用户交互),并将其传递给模型。该模型会触发有关其状态更改的通知,而 View 会根据需要更新自身来响应这些更改。

例如,用户点击“按钮”面板上的一个按钮。 “按钮”面板的 Controller 检测到此事件(可能通过 ActionListener),它处理此操作并更新模型。

模型更新其内部状态并触发某种事件。

“猜测”面板检测到模型中的这种变化(通过某种监听器)并相应地更新它的 View (根据模型的指示更新猜测和图像)。

现在,请记住,Swing 不使用纯 MCV 模式,它的控件(即按钮)既是 Controller 又是 View ,所以在使用这些控件时要小心...

我将从 HangManModel interface 开始,它定义了您想要公开的所有属性,例如猜测、“ secret ”字词以及可能不正确的次数例如,做出的猜测和游戏状态(赢或输)。

我还会定义可能注册到模型的监听器,它描述了该模型可以生成的事件。您可以使用 PropertyChangeListener 甚至 ChangeListener 或根据您自己的需要定义您自己的,例如...

public interface HangManModel {

    public void addGuess(char guess);

    public char[] getGuesses();
    public String getSecretWord();
    public int getState(); // running, win or lose

    public void addChangeListener(ChangeListener listener);
    public void removeChangeListener(ChangeListener listener);

}

现在这只是一个例子,就我个人而言,我可能会忍不住隐藏 secret 词并公开它的属性(例如它的长度)。您也可能想为 secret 词提供一个 setter ,这样模型就可以重置...

这将代表您的应用程序的“心脏”,您将围绕它构建您的 View 和 Controller 。

关于java - 如何为猜字游戏实现 MVC 模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19555075/

相关文章:

java - 使用该程序运行后编译错误

java - 游戏场景的多个 JFrame

java - 更新文本文件方法

c# - 使用模型和 View (MVC)

java - 具有多个Windows设计的MVC

java - Glassfish 和 MongoDB 连接错误 : NoClassDefFoundError

javascript - 如何构建一个每天调用另一个javascript文件的Java文件?

java - 在 IDE 和 JAR 中使用 Java 加载资源(从静态上下文)

java - jPanel 的同步

java - 使用 MVC 和 DAO 模式在 JSP 页面中以 HTML 格式显示 JDBC ResultSet