我正在开发这个应用程序,您可以在其中放置文本和绘图。我的应用程序是MVC模式,我需要所有的模型部分,文本和形状是相同的概念。例如,它们都扩展了一个抽象的ReportElement clas。
但问题是我为页面中的每个形状创建一个JPanel,但是要处理文本我需要使用JTextArea或其他东西。为了呈现元素,View直接从Model中获取报表元素列表并逐个绘制。如何在不损害MVC模式的情况下区分文本元素。
我的意思是,这是不可能的,对吧?我不知道,有什么想法吗?
答案 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
的包装器方法。