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

Java 如何避免将顶级组件的单个实例传递给所有子类,java,swing,design-patterns,Java,Swing,Design Patterns,因此,我一直在尝试如何最好地构造代码,因为我有一种直觉,即必须有更好的方法来实现我想要的,而不必将单个对象传递给项目中的几乎每个UI类 我正在做的项目有一个类,它扩展了JRootPane。然后,构造器继续创建所有组成节奏轮的组件。例如,它创建了一个ControlPanel(扩展了JPanel)的实例并将其添加到自身中 但是,ControlsPanel需要了解节奏控制盘中定义的许多内容,例如当前选择的控制盘数量。当前,ControlsPanel的构造函数将一个节奏轮作为参数,然后保留对它的引用。它

因此,我一直在尝试如何最好地构造代码,因为我有一种直觉,即必须有更好的方法来实现我想要的,而不必将单个对象传递给项目中的几乎每个UI类

我正在做的项目有一个类,它扩展了JRootPane。然后,构造器继续创建所有组成节奏轮的组件。例如,它创建了一个
ControlPanel
(扩展了JPanel)的实例并将其添加到自身中

但是,
ControlsPanel
需要了解节奏控制盘中定义的许多内容,例如当前选择的控制盘数量。当前,
ControlsPanel
的构造函数将一个节奏轮作为参数,然后保留对它的引用。它使用它来表示组件a
JFileChooser
的父对象,并作为将应用程序的相关状态写入XML文件的函数的参数

在我看来,在这么多类中传递一个主要组件似乎是错误的。我考虑了设计模式,并认为单例可能是解决这个问题的一个方法。然而,我读过很多次,单身是邪恶的,是一种反模式。我想MVC模式可能会有所帮助,但我不确定如何在Swing中实现这一点。最近我发现依赖注入是一种可能的解决方案


我有点不知所措,不知道我应该做什么,或者我是否应该做任何事情。如果您想浏览一下我正在编写的代码,您可以在上看到它,因此任何关于如何继续的建议都是非常好的。

我不知道使用单例有什么问题。控制面板听起来像是单身人士的首选。为什么你会有不止一个?其他的也一样。您当前在
控制面板
中从
节奏轮
访问的任何内容都可以通过getter和setter公开


除非你想分离模型/视图,或者视图需要观察模型更新,否则我不会使用MVC。

如果所有东西都需要引用
节奏轮
,那么听起来
节奏轮
非常复杂。也许您可以将
wirthydreel
分解成一个组件集合(希望并且很可能,因为GUI应该反映逻辑结构)对应于GUI的特定部分

另外,为什么所有GUI组件都保留对
hyrthrome
(或者适当的子组件,如果您按照上述方式进行重构)的引用?我没有做过太多的spring编程,但我认为这个想法是围绕着一个。在这种情况下,gui组件应该将自己注册为控制盘组件上的观察者,以便在控制盘更改时进行更新

是的,这是mvc。车轮组件构成您的模型;gui是您的视图。不太清楚的是控制器是什么。我怀疑这是高级车轮

因此,总而言之:

  • 车轮由子部件组成
  • 控制盘具有高级方法,可反映您可以对其“执行”的操作
  • 控制盘的高级方法由视图中的操作调用
  • 控制盘的高级方法对控制盘的子组件进行更改
  • 控制盘的子零部件发生更改时,将通知模型,模型将更新
只有视图的输入部分需要引用控制盘;显示部件通过与车轮子部件注册的回调触发


(为了直接回答最初的问题,我认为传递一个wheel实例没有什么不好的地方,但正如我在上面所建议的,最好是将它“分割”成不同的组件,因为它在GUI中的位置“更低”).

您可能会看到这是否提供了有关MVC的任何见解。我认为,将模型与视图分离将带来其他好处,因为在情况发生变化时,除了UI之外,我还希望通知其他方面。这始终是一个好做法。从我所看到的代码来看,我无法判断是否存在模型。如果有多个视图组件响应单个事件,则应使用观察者模式。