我正在编写一个由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-实际显示。这可以是图形的或基于文本的。假定下面的示例包含一个标记为
JButton
的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);
}
}
现在,
DefaultController
为视图注册侦听器。它负责创建视图和模型,并最终显示视图。 Controller仅通过DefaultView
公共接口与视图交互。 DefaultModel
也是如此。 DefaultView
和DefaultModel
不能直接相互交互。有许多不同的实现方式(您会发现每个人实现的方式略有不同),并且可以找到一个很好的教程here。
MVC也有一些不同的变体(例如MVC,MVP,MVVM等),可以在Wikipedia上找到。