【发布时间】:2013-08-28 18:08:22
【问题描述】:
问题
我正在寻找(希望)一种我可能不知道的设计模式,它可以帮助完成我在下面定义的问题的一些代码分离:
我有一组代表各种实体的类,例如 Point、Vector、Arc 等,它们属于二维笛卡尔平面,由类 Model 表示。 Model 类充当这些实体的集合并存储有用的计算值。
我还有一个可视化界面,应该渲染模型状态的 2D 图像,并且还可以通过向模型添加实体来与模型进行小范围的交互(例如,用户可以添加 @987654326 @ 通过单击某处的 GUI 来添加模型。)。
第一个想法
起初,我有一个接口Drawable,它有一个方法Draw,它将接受一个图形上下文对象,实现实体将使用我正在使用的图形库(Java Swing /AWT 在这种情况下)。
这很有效,因为我的应用程序的 GUI 部分只需遍历模型中的所有实体并运行它们的 Draw 方法来生成可视化。最大的问题是我将我的模型与它的图形表示结合起来,我觉得这是一种不好的做法。
第二个想法
我创建了一个接受实体的EntityDrawer 类,根据实体类型选择正确的绘制方法,然后绘制到我的图形上下文。
这种方法实现了我一直在寻找的代码分离,但EntityDrawer 类严重依赖instanceOf/isA 方法来确定如何绘制实体,我多次看到这种方法被描述为糟糕的设计.我尝试重新设计它,以便类使用重载方法来确定要使用哪种绘图方法,但我意识到这基本上是相同的instanceOf/isA 方法,以更好看的方式编写。此外,对于我添加的每个新实体类,我都需要在 EntityDrawer 的代码中进行镜像,这对我来说是一种耦合形式。
我希望我的模型与其图形表示之间尽可能多地解耦,以便模型可以专注于对问题进行建模,而不是如何将自己呈现到图形上下文中。此外,将来我可能会添加更多的模型实体类型,它们将有截然不同的绘图需求。
那么,我可以使用一种模式或设计技术来实现这一点吗?我觉得我提出的两种解决方案都不是最优的,并且可能有一种设计模式可以解决这类问题。
【问题讨论】:
-
另一种方法是实现模型的绘图方法可以使用的绘图抽象层。然后,您可以插入多个绘图实现。
-
@Henry 这个抽象层会类似于我的第二个解决方案中的
EntityDrawer,还是我错过了你的意思? -
不,它会提供绘图图元(例如点、线和样条线)。您仍然会在调用这些绘图原语的模型类中拥有绘图方法。如果必须绘制复杂的形状,可能有几个。实际实现在抽象接口之下,可以在 swing 中渲染图元或编写 SVG 文件,或者...
标签: java oop design-patterns code-separation