Java 减少Swing应用中耦合的设计模式

Java 减少Swing应用中耦合的设计模式,java,user-interface,swing,design-patterns,Java,User Interface,Swing,Design Patterns,大家好,我目前正在开发一个JavaSwing应用程序,我正在寻找一些指南。应用程序相当小,但我注意到,随着代码库越来越大,我的对象图中有很多耦合。我对Swing还比较陌生,但我已经编写了足够长的程序,知道这将走向何方 我遇到的最大问题是设置事件处理。我的子窗口和对象应该如何在没有引用的情况下将事件传递给更高级别的对象?我已经做了大量的MVC网络编码。这种模式适合摇摆吗?我应该构建自己的控制器吗?我想我只是在寻找人们在挥杆时发现有用的模式 提前感谢您的帮助。是的。MVC是您必须使用的。下面是一篇关

大家好,我目前正在开发一个JavaSwing应用程序,我正在寻找一些指南。应用程序相当小,但我注意到,随着代码库越来越大,我的对象图中有很多耦合。我对Swing还比较陌生,但我已经编写了足够长的程序,知道这将走向何方

我遇到的最大问题是设置事件处理。我的子窗口和对象应该如何在没有引用的情况下将事件传递给更高级别的对象?我已经做了大量的MVC网络编码。这种模式适合摇摆吗?我应该构建自己的控制器吗?我想我只是在寻找人们在挥杆时发现有用的模式


提前感谢您的帮助。

是的。MVC是您必须使用的。下面是一篇关于MVC和Swing的非常好的文章:


正如您已经说过的,您打算使用MVC,或者您可能已经在使用MVC了。一旦分离出数据(我称之为数据模型层)。现在您需要在这些数据模型类上应用观察者模式。使用此数据模型的所有视图(您的ui组件)都在观察此模型对象的任何更改(通过观察者模式)


我希望这就是您想要的。

我认为,减少GUI中耦合的最佳方法是使用事件总线。 有几种现有的实现,包括一些专门支持Swing的实现

只要你能找到


如果您在GUI中使用,您可能还想看看。

另一个您可能感兴趣的模式是MVP(模型视图演示者)模式。这对于将视图更松散地耦合到模型非常有用。可以找到托德·斯奈德的一个很好的解释。

MVC!!!然后,您还可以使用一个名为Publish/Subscribe的Observer变体,以便在您的应用程序中实现事件流。

我不同意建议使用的人,因为

  • 因为类似于
    EventBus.subscribe(symbolistchangevent.class,this)的代码您的整个代码将依赖于单个事件总线实例,这使得测试非常困难
  • 很难找出在哪里使用了特定事件

相反,我建议使用接口来封装模块的外部依赖项。如果你喜欢,你可以用侦听器模式来使用它们,但是如果你喜欢的话,通常可以自由地重构所有的东西。

如果你想与层次结构中的其他GUI组件通信,那么你应该考虑像SuntLon这样的东西来调解分支之间的调用。见:


另请参见,谢谢,这是我一直在寻找的。用于在应用程序中提供消息传递总线的API。我看了看guts和事件。我想我会选择后者。没关系,我过去用过EventBus,不必抱怨。然而,我记得在某些版本中,使用事件使用者的注释可能会泄漏内存;我不知道这是否在最新版本中得到了修复。事件总线并不一定意味着总线是一个没有任何接口的类,你为什么这么说?在guts事件的情况下,事件通道是接口,在需要的地方注入(通过Guice),因此很容易进行模拟测试。根据我的经验,我已经系统地更新了一份文档(包含事件、含义、生产者和消费者的列表),以便于维护。顺便问一下,如果您不喜欢事件总线解决方案,您建议采用什么方法?请搜索EventBus.subscribe(symbolistchangevent.class,this);IMHO这看起来像一个单一的eventbus instance.IIRC(但我使用eventbus已经很长时间了,现在我只使用我自己的eventbus,它肯定是基于接口的)eventbus static singleton只是为了方便起见而提供的,但您实际上不必使用它,并且仍然可以在任何需要的地方使用EventService接口。