怎么看会知道要创建什么组件?

时间:2010-03-10 12:50:24

标签: java model-view-controller components

我正在开发这个应用程序,您可以在其中放置文本和绘图。我的应用程序是MVC模式,我需要所有的模型部分,文本和形状是相同的概念。例如,它们都扩展了一个抽象的ReportElement clas。

但问题是我为页面中的每个形状创建一个JPanel,但是要处理文本我需要使用JTextArea或其他东西。为了呈现元素,View直接从Model中获取报表元素列表并逐个绘制。如何在不损害MVC模式的情况下区分文本元素。

我的意思是,这是不可能的,对吧?我不知道,有什么想法吗?

2 个答案:

答案 0 :(得分:2)

我会通过构建一个工厂方法来处理这种情况,该方法为任何给定的ReportElement生成正确类型的Swing组件,如下所示:

public static JComponent buildViewForReportElement(ReportElement element)

在此方法中,您需要实际检查ReportElement个对象以查看要构建的组件类型。此检查可能意味着检查每个对象上的字段或标记,或者甚至可能意味着使用instanceof来区分ReportElement的不同子类。

请注意,检查这样的ReportElement个对象违反了面向对象编程的原则。一个简单的“面向对象”解决方案需要所有ReportElement个对象使用buildView()getView()方法,因此您的GUI代码只能在每个getView()上调用ReportElement,而不知道实际调用了getView()的哪个实现。

不幸的是,面向对象的解决方案迫使您将视图代码与模型代码混合在一起,并且您尝试将两者分开是很好的。这就是为什么我主张保持GUI构建代码不在ReportElement个对象中,而是使用工厂方法为任何给定的ReportElement构建正确的视图。

答案 1 :(得分:2)

我认为你正在寻找“Factory Pattern

您需要一个基于您自己的JComponent条件返回ReportElement的包装器方法。