我正在编写一个由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???();


我知道自己无法以自己的方式进行操作,但是也许有人知道如何解决该问题。除此之外,是否有任何理由创建多个与其他层进行通信的接口?

在此先感谢您的帮助!

最佳答案

您应该研究Model-View-Controller(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-实际显示。这可以是图形的或基于文本的。假定下面的示例包含一个标记为JButtonbutton

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上找到。

09-10 07:06
查看更多