【问题标题】:Create one general interface for GUI, have it implemented by many classes为 GUI 创建一个通用接口,由多个类实现
【发布时间】:2013-12-11 19:02:31
【问题描述】:

我只是在编写一个由 3 层(GUI、AppLogic、DatabaseQueries)组成的应用程序。 我希望我的 GUI 仅通过接口与 AppLogic 进行通信(我猜这是常见的做法)。 我希望 AppLogic 中只有一个接口,它定义了 GUI 可以调用的所有方法。 在我的 AppLogic 中,我想要许多类来实现这个接口。 因此,在我的 Controller 类中,我想创建一个实例来实现 GUI 可以用来调用 AppLogic 方法的接口。

public interface AppControllerInterface {

    public void m1();
    public void m2();
    public void m3();
    public void m4();
    public void m4();

}

public class M1 implements AppControllerInterface{

    public void m1(){};

}

public class M2 implements AppControllerInterface{

    public void m2(){};

}  

...and so on

所以,我想指定尽可能多的类,并只创建一个实例,GUI 控制器可以使用它调用它的方法

AppControllerInterface appCI = new WHATHERE???();

我知道我不能按照我的想法这样做,但也许有人知道如何以某种方式解决这个问题。除此之外,是否有任何理由创建多个接口来与其他层进行通信?

非常感谢您的帮助!

【问题讨论】:

  • 您打算做的事情的文本是有道理的,但您的代码示例与您编写的内容不匹配。您的代码示例意味着您希望在 1 个类中实现 1 个方法,在另一个类中实现另一个方法,该类不受 java 支持。似乎您要描述的内容类似于facade pattern
  • Dependency injection. 让一些外部引导程序类决定使用哪个实现,并通过构造函数或设置器将其注入 GUI 类。
  • 另外,创建接口的一个重要原因是可测试性。针对接口进行编码可以更轻松地创建模拟实现,而无需使用字节码工程。一般来说,“你可能想换掉实现”有点红鲱鱼,我在实践中从未见过这样做过。 (并不是说它永远不会发生,只是说您可能不会在生命周期足够长的应用程序上工作,以保证完全重新实现数据访问层。)

标签: java interface implementation


【解决方案1】:

您应该研究模型-视图-控制器 (MVC)。此模式应该可以帮助您分离业务逻辑、数据库和图形元素。

引用马丁·福勒的话:

“MVC 的核心是我所说的分离表示。这个想法 分离演示的背后是要明确区分 模拟我们对现实世界的感知的领域对象,以及 表示对象,它们是我们在屏幕上看到的 GUI 元素。 域对象应该是完全自包含的并且可以在没有的情况下工作 参考演示文稿,他们也应该能够支持 多个演示文稿,可能同时进行。”

以下演示了构建这些层的一个非常原始的示例:

DefaultController.java - 运行节目。创建视图和模型。实例化应用程序(通过 main 方法)。

public class DefaultController
{
    final DefaultView view = new DefaultView();
    final DefaultModel model = new DefaultModel();

    public JFrame init()
    {
        this.view.addButtonActionListener(new ButtonAction(this.view, this.model));
        return this.view;
    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                new DefaultController().init().setVisible(true);
            }
        });
    }
}

ButtonAction.java - 未显示,但会实现 ActionListener 并处理按钮点击。它将模型和视图作为参数,因为它可能会根据事件更新模型或视图。 ButtonAction 可以看作是控制器的扩展。

DefaultModel.java - 包含呈现的数据(例如表单值、连接设置等)。

public class DefaultModel
{
    boolean buttonClicked = false;

    public void setButtonClicked(boolean clicked)
    {
        this.buttonClicked = clicked;
    }

    public boolean getButtonClicked()
    {
        return this.buttonClicked;
    }
}

DefaultView.java - 实际显示。这可以是图形的或基于文本的。假设下面的示例包含一个标记为buttonJButton

public class DefaultView extends javax.swing.JFrame
{
    // ... auto generated code ...

    public void addButtonActionListener(ActionListener listener)
    {
        this.button.addActionListener(listener);
    }

    // Other view controls...
    public void setEnabledButton(boolean enabled)
    {
        this.button.setEnabled(enabled);
    }
}

现在,DefaultController 为视图注册了侦听器。它处理创建视图和模型并最终显示视图。 Controller 仅通过DefaultView 公共接口与视图交互。 DefaultModel 也是如此。 DefaultViewDefaultModel 不直接相互交互。

有很多不同的实现方式(你会发现每个人的实现方式略有不同),可以在here 找到一个很好的教程。

MVC 还有一些不同的变体(例如 MVC、MVP、MVVM 等),可以在 Wikipedia 上找到。

【讨论】:

  • MVC 在这里有什么意义?这就像教科书上的例子,说明为什么只有链接的答案是有问题的。
  • @millimoose 听起来他们对构建具有图形用户界面的应用程序很感兴趣。听起来他们在谈论模型(数据库)、视图(GUI)和控制器(AppLogic)......
  • 是的。但问题是“我如何连接这些层?”,而不是“我应该制作哪些层?”
  • @millimoose 同意了。我正在更新以提供一个原始示例。
  • 现在您已经解释了如何连接一堆与 OP 的情况无关的类。 (这可能是支持 GUI 的众多模型之一。MVC 中的模型在 OP 的代码中是由外观接口 AppControllerInterface 表示的 AppLogic 层。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-21
  • 1970-01-01
  • 1970-01-01
  • 2022-11-28
  • 1970-01-01
  • 2014-02-11
  • 1970-01-01
相关资源
最近更新 更多