Java OOP策略

时间:2015-03-05 11:22:08

标签: java swing oop

我有一个名为Visual Data Structures的项目。我有这样的OOP设计。

Class VisualDataStructures extends JFrame
Class ControlPanel extends JPanel
Class CodePanel extends JPanel

Class VisualDataStructures有主要内容。此类具有Class ControlPanel和CodePanel的实例。

Class ControlPanel JMenuItem内有JMenuBar Class CodePanel名为“加载”。

JTextAreaJMenuItem

问题:
我需要在类ControlPanel中为JTextArea命名为“load”的actionlistener。单击加载后,用户将进入该文件的目录,然后该文件将加载并显示在CodePanel的{​​{1}}处。

我是否需要将从VisualDataStructures实例化的对象CodePanel传递给ControlPanel,以便我使用该对象然后修改JTextArea的值?

有人知道更好的方法吗?感谢。

1 个答案:

答案 0 :(得分:4)

在没有看到实际代码的情况下回答这个问题有点困难,但我仍然会尝试。也许如果你能以某种方式分享你的代码,通过Github,Bitbucket,作为Gist或者在Pastebin中,我可以给出更好的答案。然后,在CodeReview stackexchange而不是StackOverflow上执行此操作可能会更好。

一般来说,我发现GU​​I父类有这么多extends有点可疑。 扩展名用法可以是一些反模式。首先,它可能会在微小的应用程序中导致看似简单的代码,但从长远来看,它往往会混淆源代码,因为它鼓励混合使用业务逻辑和UI。误解延伸是OOP的核心。不是。多态抽象是为了解耦和反转关键依赖关系,这是OOP的核心。扩展只是一个很好的方便的东西,而且它被过度使用了。

说到这一点,您可能听说过 MVC - 模型视图控制器。这是用于保持事物分离的UI的典型模式。

您不希望对ActionListener操作做出反应的load直接知道CodePanel,因为这样的依赖性太具体了。您希望在介于两者之间的抽象,如界面,并引用该界面而不是CodePanel

说到ActionListener和类似的界面,如果你还没有完成,你可能会对升级到Java 8感兴趣。像ActionListener这样只有一个抽象方法的接口是隐式功能接口,这意味着你可以使用lambdas或方法引用。

一般来说,我认为这有助于我们始终牢记以下问题:如果我用不同的工具包替换UI工具包该怎么办?即使它不是用途案例并且永远不会发生,为了回答这个问题,你所做的关注点的分离和分离会导致更模块化,更好的设计,更容易理解和维护。最后,问题如果我用不同的工具包替换UI工具包会怎样?会导致设计遵循更多 SOLID原则

在Swing中处理ActionListener时,您可能需要查看interface Actionabstract class AbstractAction。它们提供非常有趣的功能。以正确的方式使用,它们可以简化代码。