为GUI创建一个通用接口,让它由许多类实现

时间:2013-12-11 19:02:31

标签: java interface implementation

我只是在编写一个由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 个答案:

答案 0 :(得分:0)

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

引用Martin Fowler的话:

  

“MVC的核心是我称之为分离演示文稿。这个想法   分离演示文稿的背后是明确区分   领域对象模拟我们对现实世界的感知,和   演示文稿对象是我们在屏幕上看到的GUI元素。   域对象应该是完全自包含的,并且不需要工作   参考演示文稿,他们也应该能够支持   多次演示,可能同时进行。“

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

DefaultController.java - 运行show。创建视图和模型。实例化应用程序(通过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 - 实际显示。这可以是图形或基于文本的。假设下面的示例包含标有JButton的{​​{1}}。

button

现在,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); } } 为视图注册了侦听器。它处理创建视图和模型并最终显示视图。 Controller仅通过DefaultController公共接口与视图交互。 DefaultView也是如此。 DefaultModelDefaultView不会直接互动。

有很多不同的方法可以实现这一点(你会发现每个人实现它的方式略有不同),并且可以找到一个好的教程here

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