问题
我正在寻找(希望)一种我可能不知道的设计模式,它可以帮助完成我在下面定义的问题的一些代码分离:
我有一组代表各种实体的类,例如Point
、Vector
、Arc
等,它们属于二维笛卡尔平面,由 class 表示Model
。该类Model
充当这些实体的集合并存储有用的计算值。
我还有一个可视化界面,应该呈现模型状态的 2D 图像,并且还可以通过向模型添加实体来与模型进行小范围的交互(例如,用户可以Point
通过单击向模型添加在某处的GUI上。)。
第一个想法
起初,我有一个接口Drawable
,它有一个方法,Draw
它可以接受一个图形上下文对象,并且实现实体会使用我正在使用的图形库(在本例中为 Java Swing/AWT)将自己绘制到该上下文中。
这很有效,因为我的应用程序的 GUI 部分只需遍历模型中的所有实体并运行它们的Draw
方法来生成可视化。最大的问题是我将我的模型与它的图形表示结合起来,我觉得这是一种不好的做法。
第二个想法
我创建了一个EntityDrawer
接受实体的类,根据实体类型选择正确的绘图方法,然后绘制到我的图形上下文。
这种方法实现了我一直在寻找的代码分离,但EntityDrawer
该类严重依赖instanceOf
/isA
方法来确定如何绘制实体,我多次看到这种方法被描述为糟糕的设计。我尝试重新设计它,以便类使用重载方法来确定要使用哪种绘图方法,但我意识到这基本上是相同的instanceOf
/isA
以更好看的方式编写的方法。此外,对于我添加的每个新实体类,我都需要在 thisEntityDrawer
的代码中进行镜像,这对我来说就像是一种耦合形式。
我希望我的模型与其图形表示之间尽可能多地解耦,以便模型可以专注于对问题进行建模,而不是如何将自己呈现到图形上下文中。此外,将来我可能会添加更多的模型实体类型,它们将具有截然不同的绘图需求。
那么,有没有一种模式或设计技术可以用来实现这一点?我觉得我提出的两种解决方案都不是最优的,并且可能有一种设计模式可以解决这类问题。