我有以下问题。
我有一个管理图形元素的抽象类。我们叫它GraphicHost吧。就像这样:
class GraphicHost {
class GraphicHostState {
List<Sprite> sprites;
List<Text> texts;
}
GraphicHostState state;
public void setState(GraphicHostState s);
public GraphicHostState getState();
public void addSprite(Sprite s);
public void addText(Text t);
}当我从一个场景移动到另一个场景时,我需要保存和恢复状态,因此需要状态子类。
现在,我有了一个使用OpenGL的具体实现。显然,除了基本的状态,我还需要着色器和纹理的处理等。
继承GraphicHostState并将它们添加到那里是一个很好的解决方案吗?比如:
...
class GLGraphicHostState {
List<Integer> textures;
List<Integer> shaders;
}
...问题是图形主机对象必须是多态的。我有ScriptHost,它使用图形主机添加精灵/文本,它不应该知道具体的实现,但是应该能够保存和恢复它的状态。我可以覆盖getState/ setState,但是在setState中,我必须检查所提供的状态是否是GLGraphicHostState,这个检查看起来有点混乱,就像一个解决方法。
所以,通常,如果我有一个带有某种状态的抽象类,带有附加状态参数的子类,并且状态必须以多态方式保存/恢复(通过父GraphicHost接口),那么您建议如何做呢?
据我所知,Memento模式适合于必须保存和恢复状态的情况,但如何将其与前面提到的类层次结构相匹配呢?
发布于 2018-07-03 09:46:33
我觉得你的做法在这里被误导了。因为我比C#更了解C#,我将使用前者来表示代码。但是,一些一般性的想法也适用于其他语言。
首先,这里不需要抽象类。所以使用一个接口:
interface IGraphicHost
{
GraphicHostState State { get; set; }
void addSprite(Sprite s);
void addText(Text t);
}接下来,我们需要处理不同的实现需要不同版本的GraphicHostState这一问题。我会选择两种方法中的一种来解决这个问题:
interface IGraphicHost<TState> where TState : IGraphicHostState
{
TState State { get; set; };
public void addSprite(Sprite s);
public void addText(Text t);
}因此,现在IGraphicHost的每个实现都提供了自己的IGraphicHostState实现,例如:
class GLGraphicHost : IGraphicHost<GLGraphicHostState>
{
...
}interface IGraphicHost
{
void SaveState(Stream stateStream);
void RestoreState(Stream stateStream);
public void addSprite(Sprite s);
public void addText(Text t);
}因此,现在,类被提供了一个流,它可以读取和写入自己的状态。这个状态是什么样子的,以及它如何加载和保存它,然后就变成了类的责任,根本不需要一个GraphicHostState。
https://softwareengineering.stackexchange.com/questions/373510
复制相似问题