如何避免将顶层组件的单个实例传递给所有子类

3
所以,我一直在试图看如何最好地构建我的代码,因为我有一种直觉感觉,在项目中,几乎每个UI类都需要传递单个对象来实现我想要的效果,肯定有更好的方法。
我正在处理的项目有一个名为“RhythmWheel”的类,它扩展了JRootPane。然后,构造函数继续创建形成RhythmWheel的所有组件。例如,它创建了ControlPanel的一个实例(它扩展了JPanel)并将其添加到自身中。
然而,ControlPanel需要对在RhythmWheels中定义的许多内容有很多了解,比如当前选择的轮子数量等。目前,ControlsPanel的构造函数需要将RhythmWheel作为参数,然后保留对其的引用。它使用此参数进行诸如应该将哪个组件JFileChooser作为父级,以及作为将应用程序的相关状态写入XML文件的函数参数等事项。
我觉得在这么多类之间传递一个主要组件是不对的。我考虑过设计模式,认为单例可能是解决方案。然而,我已经多次阅读到单例是有害的并且是一种反模式。我想MVC模式可能有所帮助,但我不确定如何在Swing中实现它。最近我发现依赖注入是一种可能的解决方案。
我有点迷失在该做什么或者是否需要做任何事情上。如果您想看一下我正在工作的代码,可以在https://github.com/vamega/RhythmWheels中查看,因此任何关于如何继续的建议都将非常好。

你可以看一下这个示例,它对MVC可能会有一些启发。 - undefined
2个回答

1

如果所有东西都需要引用RhythmWheel,那么它听起来非常复杂。也许你可以将RhythmWheel分解成一系列组件,这些组件(希望如此,并且很可能如此,因为GUI应该反映逻辑结构)对应于GUI的特定部分?

另外,为什么所有GUI组件都保留对RhythmWheel(或适当的子组件,如果按上述方式进行重构)的引用?我没有做过太多的Spring编程,但我认为这个想法是围绕观察者模式构建结构的。在这种情况下,GUI组件应该在轮组件上注册自己作为观察者,以便在轮变化时更新。

是的,这就是MVC。轮组件形成您的模型;GUI是您的视图。不太清楚的是控制器是什么。我怀疑它是高级轮。

因此,总之:

  • 这个轮子由子组件组成
  • 这个轮子有高级别方法,反映了你可以对它进行的操作
  • 视图中的动作调用的是该轮子的高级别方法
  • 该轮子的高级别方法会更改该轮子的子组件
  • 当该轮子的子组件发生更改时,会通知模型,然后更新

只有视图的输入部分需要引用该轮子;显示部分通过注册在轮子子组件上的回调函数触发。

(直接回答原始问题,我认为传递轮子实例并没有什么不好,但正如我以上所建议的那样,当其进入 GUI 中变得“较低”时,将其“分解”为不同的组件可能更好)。


0
我不明白为什么使用单例会有问题。控制面板听起来像是一个很好的单例候选对象。你为什么需要多个呢?其他情况也是一样的。你目前从ControlPanel中访问的任何内容都可以通过getter和setter方法来获取。
除非你想要解耦模型/视图分离,或者有一个需要观察模型更新的视图,否则我不会使用MVC。

我认为将模型与视图解耦会带来其他优势,因为除了用户界面之外,当事物发生变化时,我还想通知其他内容。 - undefined
这是一个很好的实践。从我所看到的你的代码,我无法确定是否有一个模型。如果你有多个视图组件响应同一个事件,你应该使用观察者模式。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接