Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/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
Design patterns 我应该在这里应用状态模式吗?_Design Patterns_State Pattern - Fatal编程技术网

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

Design patterns 我应该在这里应用状态模式吗?,design-patterns,state-pattern,Design Patterns,State Pattern,我有一个画很多东西的面板。为了提高绘图效率,我使用了一个BuffereImage,这样我就不必在每次发生某些事情时都绘制所有内容 我的paintComponent只需要“如果”语句: if(!extraOnly) //paint something paint something if(listener.getRectangle() != null) // Paint something 我喜欢使用状态模式的想法,但我不确定使用它的时机是否合适?我不喜欢必须为extraOnly设置布尔值的

我有一个画很多东西的面板。为了提高绘图效率,我使用了一个BuffereImage,这样我就不必在每次发生某些事情时都绘制所有内容

我的paintComponent只需要“如果”语句:

if(!extraOnly) //paint something

paint something

if(listener.getRectangle() != null) // Paint something
我喜欢使用状态模式的想法,但我不确定使用它的时机是否合适?我不喜欢必须为extraOnly设置布尔值的想法,也许我也有模式热:)。每个州只有一种方法,draw(图g)


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

一个可绘制列表怎么样,每个列表都有一个z级别和一个脏标志? 因此,您的油漆可以看起来像:

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

你需要考虑脏的重叠对象,但是通常这种方法很容易实现。 编辑: 嗯,没那么简单。 如果移动对象,则需要在其下方重新绘制曲面。


如果背景元素和背景元素之间有明确的区别,您可能希望将它们绘制到不同的图像缓冲区中,这将允许您快速重新绘制背景,而无需再次渲染。

我认为在视图中使用状态没有错误。但这显然与模型中的状态不同


网络浏览器就是一个例子。本例中的模型是网页DOM,浏览器视图将DOM呈现为屏幕显示。在向下滚动网页时,在每个帧上呈现DOM的效率非常低。显然,缓冲状态是解决这个问题的方法。只有在底层DOM发生更改时,才需要更新状态。

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

如果绘制速度较慢,则局部绘制是提高性能的好方法

不过,首先要证明画画是慢的!如果分析表明图形存在问题,则可以迁移到部分更新

一种方法是使用“脏矩形跟踪”。这是一个非常广泛使用的东西,术语是“无效”(需要重新绘制的区域)和“验证”(绘制脏位的行为)。几乎可以肯定的是,窗口系统已经做到了这一点,因此您可以借助它,例如,Java Swing重新绘制管理器保留了脏区域的边界矩形


然而,你可以很容易地推出自己的。您可以有一个成员变量(一个“区域”,或者只是一个向量中的矩形列表,或者一个边界矩形)来表示下一次绘制时要更新的区域。在构造函数或大小更改处理程序中,将其初始化为整个区域。任何时候,当您想要重新绘制面板的一部分时,通过将矩形添加到脏区域来使该部分无效。绘制时,仅绘制脏区域中的零件,然后清除脏区域。例如,以这种方式进行的局部绘制可以很好地将缓冲图像作为中介。轻松点

目前还不清楚extraOnly的用途以及它与国家的关系。你能详细说明一下吗?这是最短的路径。extraOnly是指如果我只需要在我的图片上画一条最短的路径。答案是:)我对mvc有点困惑。那么,是控制器改变了视图的状态吗?是的,如果是间接的话。控制器的任务是管理功能逻辑,而视图应该管理表示逻辑。例如,控制器会对视图说,模型以最短路径更新。然后视图可以执行操作并显示最短路径。不确定这是否让事情变得更清楚。。。