分离数据模型和gui表示的设计模式

时间:2011-08-16 07:18:19

标签: java oop user-interface design-patterns

在分离数据模型和gui绘图机制时,是否存在被认为是最佳模式的设计模式?

所以说我有一个Circle类和一个Square Square,那么我很想在这两个类中都有一个draw方法。然而,这会迫使班级根据绘图画布使用(swing,j3d,opengl等)导入各种令人讨厌的东西。

我首先想到的是,一个访问者模式可以通过使Square和Circle实现一个方法来解决这个问题,该方法将访问者作为输入参数并调用访问者的函数。然后我可以在访问者上有两个绘制方法,它们将Circle和Square实例作为输入参数,并相应地绘制它们。

对此有何建议?

6 个答案:

答案 0 :(得分:5)

Model View Controller模式可能是最常用的模式。 Swing在很大程度上依赖于这种模式,Decorator(用于滚动条等)和Strategy(布局管理器等)似乎是支持模式。

至于MVC的替代方案,您可以查看Model View Presenter,但在大多数实现中,完全分离将严重依赖某种事件总线,例如Observer中的Swing (事件监听器)模式。

datamodel / gui的解决方案似乎是一个小问题,但实际上很难正确管理所述事件总线。

我最喜欢的做法是依靠Command模式。使用事件总线传递不同的命令使分离有点干净。 datamodel以某种方式执行命令(通常使用相关的命令处理程序对象),然后调用回调。

这实际上是一个美化的MVC,因为执行命令的类最终成为你的控制器,但模式允许模型/控制器只知道回调对象。根据程序的性质,您可以实现一组类,只有视图知道使用Data Transfer Object模式。 这是我对GWT等异步应用程序的首选方法。

在桌面和Android应用程序中,您仍然运行异步(Context.runOnUiThread()SwingUtilities.invokeLater()指示此操作),因此命令模式恰好适合.DTO是否是您的应用程序的最佳方法取决于,但他们肯定会将模型与视图分开。

答案 1 :(得分:3)

没有“最好”的方法,这一切都取决于你的平台,架构和其他东西。 通常,在GUI方面,应该结合几种模式。 其中一个通常是MVC,其中视图可以使用其他层次结构模式进行扩展(访客也是一个选项)。

答案 2 :(得分:2)

我认为您可能使用strategy模式或composition成功。

使用合成,您可以添加负责绘制的对象,无需将其定义到形状实例中,使用策略可以在运行时选择算法。

答案 3 :(得分:1)

是的,你正在寻找MVC模式。例如,Swing使用MVC。您可以在TableModel界面中为表格数据定义模型。然后由Component决定如何呈现它。 JTable以表格形式呈现它。自定义JPieChart可以将其呈现为饼图。 MVC中的C代表控制器,可以让用户在与GUI交互时更新模型。

答案 4 :(得分:1)

可能感兴趣的MVC的专门案例是Model View Presenter

答案 5 :(得分:1)

Decorator Design Pattern也可以应用于GUI工具包以动态添加行为。