Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 分离数据模型和gui表示的设计模式_Java_Oop_User Interface_Design Patterns - Fatal编程技术网

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

Java 分离数据模型和gui表示的设计模式,java,oop,user-interface,design-patterns,Java,Oop,User Interface,Design Patterns,在分离数据模型和gui绘图机制时,是否有一种被认为是最佳模式的设计模式 假设我有一个类圆和一个类方,那么我很想在这两个类中都有一个draw方法。然而,这将迫使类根据im使用的绘图画布(swing、j3d、opengl等)导入各种讨厌的东西 我的第一个想法是,访问者模式可以通过让正方形和圆形实现一个方法来解决这个问题,该方法将访问者作为输入参数,并对访问者调用函数。然后,我可以在访问者上有两个绘制方法,它们以一个圆和一个正方形实例作为输入参数,并相应地绘制它们 对此有什么建议吗?是的,您正在寻找M

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

假设我有一个类圆和一个类方,那么我很想在这两个类中都有一个draw方法。然而,这将迫使类根据im使用的绘图画布(swing、j3d、opengl等)导入各种讨厌的东西

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


对此有什么建议吗?

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

没有“最佳”方法,这完全取决于您的平台、体系结构和其他内容。 通常,当涉及到GUI时,应该组合几种模式。
其中之一通常是视图可以用其他层次结构模式扩展的地方(访问者也是一个选项)。

MVC的一个特殊情况可能会引起兴趣。

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

我认为您可以成功地使用该模式,或者

使用composition,您可以添加负责绘制的对象,而无需将其定义到shape实例中,使用strategy,您可以在运行时选择算法

该模式可能是使用最多的。Swing严重依赖于此模式,其中(用于滚动条等)和(布局管理器等)似乎是支持模式

至于MVC的替代方案,您可以看一看,但是在大多数实现中,完全分离在很大程度上依赖于某种类型的事件总线,例如(事件侦听器)模式中的Swing

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

我最喜欢的方法是依赖于模式。使用事件总线传递不同的命令可以使分离变得更加清晰。 数据模型以某种方式执行命令(通常使用相关的命令处理程序对象),然后调用回调

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


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

问题是,我不认为(强调思考)每个gui组件都需要一个控制器。MVC难道不是一种架构模式吗?问题是如果您不喜欢在模型内实现渲染逻辑(圆形、矩形等)类,您可以为它们实现视图(在某些框架中,此类视图称为渲染器,例如JavaServer Faces)。那么,MVC不是一种体系结构模式吗?我认为问题在于(类级别)设计模式。您是对的,karla,我更多地考虑了类级别。