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

时间:2012-03-17 05:35:02

标签: java swing design-patterns

所以我一直在试着看看如何才能最好地构建我的代码,因为我有一种直观的感觉,必须有一种更好的方法来实现我想要的东西,而不会将单个对象传递给几乎每个UI类。项目

我正在开发的项目有一个扩展JRootPane的类RhythmWheel。然后构造函数继续创建形成RhythmWheel的所有组件。例如,它创建了ControlPanel的实例(扩展了JPanel)并将其添加到自身。

然而,ControlsPanel需要在RhythmWheels中定义很多知识,比如当前选择的车轮数量。目前ControlsPanel的构造函数将RhythmWheel作为参数,然后保留对它的引用。它将这个用于组件a JFileChooser应该作为父项的范围,并作为将应用程序的重要状态写入XML文件的函数的参数。

我似乎错误地认为我在这么多课程中传递了一个主要组件。我考虑过设计模式,并认为单例可能是解决方案。然而,我已多次读过单身人士是邪恶的并且是反模式的。我想MVC模式可能会有所帮助,但我不确定如何在Swing中实现它。最近我遇到了依赖注入作为一种可能的解决方案。

我对自己应该做的事情有点失落,或者我是否应该做任何事情。如果你想看看我正在处理的代码,你可以在https://github.com/vamega/RhythmWheels看到它,所以任何有关如何继续的建议都会很棒。

2 个答案:

答案 0 :(得分:1)

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

另外,为什么所有GUI组件都会引用RhythmWheel(或者如果你按照上面的描述进行重构,那么适当的子组件)?我没有做太多的春季编程,但我认为这个想法是围绕observer pattern构建事物。在这种情况下,gui组件应该在车轮组件上注册为观察者,以便在车轮更换时更新。

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

所以,总结:

  • 轮子由子组件
  • 组成
  • 方向盘具有高级方法,反映了你可以“做”的事情
  • 轮子的高级方法是视图中的动作调用的方法
  • 车轮的高级方法改变车轮的子组件
  • 车轮的子组件在更改时通知模型,更新

只有视图的输入部分需要参考车轮;显示部件通过轮子子部件注册的回调触发。

(为了直接回答原始问题,我没有看到任何通过轮子实例的东西如此糟糕,但正如我上面所说,它可能更好地“碎片化”成不同的组件,因为它“低” “进入GUI。”

答案 1 :(得分:0)

我没有看到使用单身人士有什么问题。控制面板听起来像单身人士的主要候选人。为什么你会不止一个?其他人也一样。您当前从ControlPanel RhythmWheel访问的任何内容都可以通过getter和setter公开。

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