java - 为 GUI 创建一个通用接口(interface),让它由许多类实现

标签 java interface implementation

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

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 Controller 可以用它调用它的方法

AppControllerInterface appCI = new WHATHERE???();

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

非常感谢您的帮助!

最佳答案

您应该查看模型- View - Controller (MVC)。此模式应能帮助您分离业务逻辑、数据库和图形元素。

引用 Martin Fowler 的话:

"At the heart of MVC is what I call Separated Presentation. The idea behind Separated Presentation is to make a clear division between domain objects that model our perception of the real world, and presentation objects that are the GUI elements we see on the screen. Domain objects should be completely self contained and work without reference to the presentation, they should also be able to support multiple presentations, possibly simultaneously."

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

DefaultController.java - 运行程序。创建 View 和模型。实例化应用程序(通过 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 并处理按钮点击。它以模型和 View 作为参数,因为它可能会根据事件更新模型或 View 。 ButtonAction 可以被认为是 Controller 的扩展。

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 为 View 注册监听器。它处理创建 View 和模型并最终显示 View 。 Controller 仅通过 DefaultView 公共(public)接口(interface)与 View 交互。 DefaultModel 也是如此。 DefaultViewDefaultModel 不直接相互交互。

有许多不同的实现方式(您会发现每个人的实现方式略有不同),并且可以找到一个很好的教程 here .

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

关于java - 为 GUI 创建一个通用接口(interface),让它由许多类实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20527763/

相关文章:

java - 使用当前 Activity 的 Google Drive 集成

java - 我如何用抽象类设计这些

java - 如何避免 swagger codegen 接口(interface)中的默认方法实现?

java - DAO 接口(interface)

c# - 什么时候在 C# 中使用 "using [alias = ]class_or_namespace;"?

java - 提取二进制的最后 2 位

java - VLCJ 无法在客户端使用 http 打开音频流

java - Gson StackOverflowError

c - 需要帮助转换 C Mersenne twister 实现以对我有用

Java:实现无符号 128 位整数