在分离数据模型和图形用户界面绘制机制时,是否有一种设计模式被认为是最好的模式?
假设我有一个类Circle和一个类Square,那么我很想在这两个类中都有一个draw方法。然而,这将迫使类导入各种令人讨厌的东西,这取决于我使用的画布(swing,j3d,opengl等)。
我的第一个想法是,访问者模式可以通过使Square和Circle实现一个方法来解决这个问题,该方法将访问者作为输入参数,并对访问者调用函数。然后,我可以在访问者上使用两个draw方法,它们将Circle和Square实例作为输入参数,并相应地绘制它们。
对此有什么建议吗?
发布于 2011-08-16 15:21:14
没有“最好”的方法,这完全取决于你的平台,架构和其他东西。通常,当涉及到GUI时,应该组合几种模式。其中一个通常是MVC,视图可以通过其他层次结构模式进行扩展(访问者也是一个选项)。
发布于 2011-08-16 16:12:38
Model View Controller模式可能是最常用的。Swing在很大程度上依赖于这种模式,其中Decorator (用于滚动条)和Strategy (布局管理器等)似乎是支持模式。
至于MVC的替代方案,您可以看看Model View Presenter,但在大多数实现中,完全分离将在很大程度上依赖于某种类型的事件总线,在Observer (事件侦听器)模式中的Swing。
数据模型/gui的解决方案看起来是一个小问题,但实际上很难正确地管理所述事件总线。
我最喜欢的方式是依赖于Command模式。使用事件总线来传递不同的命令,这使得分离变得更加清晰。数据模型以某种方式执行命令(通常使用相关的命令处理程序对象),然后调用回调。
这实际上是一个美化的MVC,因为执行命令的类最终是您的控制器,但该模式允许模型/控制器只知道回调对象。根据程序的性质,您可以实现一组类,只有视图知道如何使用Data Transfer Object模式。这是我对诸如GWT这样的异步应用程序的首选方法。
在桌面和安卓应用程序中,您仍然运行异步(Context.runOnUiThread()和SwingUtilities.invokeLater()规定了这一点),因此命令模式非常适合。DTO是否是您的应用程序的最佳方法取决于,但它们肯定会将模型与视图分开。
发布于 2011-08-16 15:37:14
我认为使用strategy pattern或composition可能会取得成功。
使用组合,您可以添加负责绘制的对象,无需将其定义到形状实例中;使用策略,您可以在运行时选择算法。
https://stackoverflow.com/questions/7074775
复制相似问题