我应该在这里应用状态模式吗?

时间:2009-05-02 09:18:08

标签: design-patterns

我有一个小组,可以吸引很多东西。为了使绘图有效,我使用的是BufferedImage,这样每次发生事情时我都不必绘制所有内容。

我的paintComponent只需要'if'语句:

if(!extraOnly) //paint something

paint something

if(listener.getRectangle() != null) // Paint something

我喜欢使用状态模式的想法,但我不确定它是否适合使用它?我不喜欢为extraOnly设置一个布尔值的想法,也许在我身上也有模式发烧:)。每个州只有一个方法,draw(Graphics g)

由于这是我在MVC模式中应用程序的视图部分,我也不确定使用状态模式是错误的。不应该声明模型的一部分而不是视图?

3 个答案:

答案 0 :(得分:1)

我认为在视图中拥有状态并没有错。这显然与模型中的状态不同。

一个例子是webbrowser。在这种情况下,模型是网页DOM,浏览器视图将DOM呈现为屏幕呈现。在向下滚动网页时,在每个帧上渲染DOM将是非常低效的。显然,缓冲状态是解决此问题的方法。如果底层DOM被更改,则只需要更新状态。

答案 1 :(得分:0)

一个drawable列表怎么样,每个都有一个z级别和一个脏标志? 所以你的油漆看起来像:

paint()
{
    sort(drawables, by z-level)
    foreach(drawable in drawables)
       if (drawable.isDirty())
           drawable.paint()
}

您需要考虑弄脏重叠的对象,但通常这种方法实现起来非常简单。

编辑: 嗯,不是那么简单。 如果移动一个物体,则需要重新绘制它下面的表面。 如果你对背景元素和forground元素有明确的区别,你可能想要将它们绘制到不同的图像缓冲区中,这样你就可以快速重新绘制背景而不再渲染它。

答案 2 :(得分:0)

一般更大的问题似乎是如何进行有效的绘画?

如果绘图很慢,部分绘画是提高性能的好方法。

然而,首先证明绘图很慢!如果分析表明绘图是个问题,那么您可以迁移到部分更新。

一种方法是使用“脏矩形跟踪”。这是一个非常广泛使用的东西,术语是'invalidation'(需要重绘的区域)和'validation'(绘制脏位的行为)。窗口系统几乎肯定已经这样做了,所以你可以背负这个例子。 Java Swing RepaintManager保留脏区域的边界矩形。

但是,您可以轻松自己动手。您可以拥有一个成员变量 - 一个“区域”,或者只是一个向量中的矩形列表,或一个边界矩形 - 来表示下一个绘图上要更新的区域。在构造函数或大小更改的处理程序中,将其初始化为整个区域。每当您想要重绘部分面板时,通过将矩形添加到脏区域来使该部分无效。绘画时,只在脏区绘制零件,然后清除脏区。例如,以这种方式的部分绘图适用于作为中介的缓冲图像。简单!