【问题标题】:Java Swing + MVC pattern in a modular way模块化方式的 Java Swing + MVC 模式
【发布时间】:2014-09-01 01:15:32
【问题描述】:

我正在开发一个Java Swing 应用程序,并且我正在遵循 MVC 方法。我有一个控制器,然后我有我的模型和我的视图。

ModelView 只能通过Controller 进行通信。 Controller 通过接口与ModelView 通信,导致大量嵌套代码。

在我的老板审查了代码后,他抱怨说它不是模块化的。他想要一种更加模块化的方法。他可以毫不费力地放入一个新模块或移除一个模块。 对于模块,他的意思是工具栏、表格、菜单栏……所有这些都与我的View 模型有关。 他也不喜欢他看到的所有接口和嵌套代码。

您对我有什么建议可以改变我的方法,而不会弄乱我已经拥有的所有代码(代码真的很多,真的很多!)。

我在谷歌上搜索了“java mvc 模块化”,但没有找到太多相关信息。

我认为可以解决我的问题的方法是使用EventBus。模块只需要使用总线发送一个事件,控制器就会处理它。至少不再有所有这些接口的嵌套代码。

在巴士上,我会做一些类似的事情(在模块上):

bus.post(new MyEvent());

在控制器上:

@Subscribe 
public void onEventMyEvent(MyEvent event) {
     // handle the event
}

--------------- 编辑 -------------

阅读用户trashgod 提供的链接(在cmets 部分中)并得出结论,我现在正在使用此图像所代表的MVP (Model View Presenter):(图像归功于udalmik 和在这里找到:enter link description here)

【问题讨论】:

  • 你的问题是?
  • 可能duplicate:“不是每个交互都需要通过应用程序的控制器。”
  • @MadProgrammer 如果可以使用 MVC,我如何使我的方法更加模块化
  • 我认为您正在将您的应用程序视为一个整体并将 MVC 应用于它,这是错误的。应用程序具有层,其中可能包含多个 MVC 模式,这允许更大程度的职责分离和解耦,从而允许替换 UI 的不同区域而不影响其他区域。请参阅trashgod提供的链接,该链接描述得更好
  • @trashgod 阅读您的链接后,我得出的结论是,我正在使用 MVP (Model View Presenter),正如 udalmik 答案中所述。

标签: java swing design-patterns model-view-controller module


【解决方案1】:

模型、视图、控制器模式允许我们将业务逻辑、屏幕渲染和处理异步事件分离到离散的类中。这样做的好处是它有效地将 GUI 驱动的应用程序的所有基本职责分解为专用类。这意味着每个类的功能都是隔离的,从而更好地适应特定于应用程序的定制和可维护性。

因此,使用这种基本方法,到目前为止,您的应用程序的应用程序整体架构是好的,但是您的老板正在寻找的东西略有不同。他要求实现一些架构,使您能够快速简单地修改 UI。因此,您可以立即看出他所要求的是关于 MVC 的 View 元素的内容。

下面我使用伪代码提供一个通用示例,说明如何创建这些模块化图形元素。

public final class View {

private GUIElement mModularElement;

public final void setModularElement(final GUIElement pModularElement) {
    this.mModularElement = pModularElement;
}

public final GUIElement getModularElement() {
    return this.mModularElement;
}

public final void onRender(final GUIVariable pGUIVariable) {
    this.getModularElement().draw(pGUIVariable);
}

}

在这段代码中,我们定义了应用程序的View 访问一个名为ModularElement 的实例,类型为GUIElement。通过使用公共的 getter/setter 方法,Controller 可以获取View 来渲染继承自GUIElement 的任何类型的对象。因此,如果您想更改 GUI,您可以指定一种新的 GUIElement,而无需更改周围的架构。

这是一个基本示例,因为 GUIElement 需要处理其他类型的职责,而不仅仅是渲染,以最大限度地提高灵活性。这些将包括定义屏幕布局、封装更多图形元素、它们如何处理 MotionEvents,所有这些都在扩展 GUIElement 的功能范围内。您甚至可以绘制 GUIElements 数组。重要的是,mModularElement 将存在于您的 Model 中以遵守 MVC 模式;为了简单起见,上面的实现避免了这种情况。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-09
    • 2011-07-10
    • 2014-10-17
    • 2011-04-11
    • 2012-09-02
    • 2011-07-02
    • 2012-07-08
    • 2010-12-04
    相关资源
    最近更新 更多