我只是在编写一个由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???();
我知道我不能按照我的思维方式做到这一点,但也许有人知道如何以某种方式解决这个问题。除此之外,是否有任何理由创建多个接口与其他层进行通信?
非常感谢您的帮助!
答案 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
也是如此。 DefaultModel
和DefaultView
不会直接互动。
有很多不同的方法可以实现这一点(你会发现每个人实现它的方式略有不同),并且可以找到一个好的教程here。
MVC还有一些可以在Wikipedia上找到的不同变体(例如MVC,MVP,MVVM等)。