【发布时间】:2011-10-10 23:17:22
【问题描述】:
我觉得我知道设计模式,但这让我无法理解。我有两个独立的项目,一个作为另一个库。该库读取 XML 文件并将它们解析为数据结构。它仅用于负责与 XML 之间的转换。我的另一个项目是一个引擎,它作用于库组装的数据。它可能包含反映库中的类的类,但具有行为方法。如果您想知道,引擎和库分离的原因是有第三个项目,一个编辑器,它修改 XML 数据。这是一个游戏。
我现在在库中创建一个类,它代表一组可以在引擎中执行的命令,以及一个包含许多不同命令的对象。我的问题是我想不出一个好的模式来定义这些命令和抽象它们的容器,这样引擎就不必打开类型。如果这里没有两个项目,只有一个,那就很容易了。不同的命令将实现一个包含Execute() 方法或类似方法的接口。但在这里行不通。该库无法实现命令的行为,只能实现从 XML 中提取的属性。
我可以在库中创建容器可以使用的接口,其中包含加载和保存 XML 数据的方法。但是引擎仍然必须在命令上switch 才能:
- 在引擎的容器类中运行一个方法来相应地修改它自己的状态,或者
- 创建控制命令行为的正确类型的引擎对象,然后通过其接口执行。
有问题的容器是我的游戏和其中的关键帧的过场动画。命令将控制其行为,例如音乐、图像、文本等。
以下是库中的一些示例代码:
public class SceneInfo
{
/* Other stuff... */
public List<KeyFrameInfo> KeyFrames { get; private set; }
}
public class KeyFrameInfo
{
public List<IKeyFrameCommandInfo> Commands { get; private set; }
}
public class KeyFramePlayCommandInfo : IKeyFrameCommandInfo
{
public int Track { get; set; }
public static KeyFramePlayCommandInfo FromXml(XElement node)
{
var info = new KeyFramePlayCommandInfo();
info.Track = node.GetInteger("track");
return info;
}
public void Save(XmlTextWriter writer)
{
writer.WriteStartElement("PlayMusic");
writer.WriteAttributeString("track", Track.ToString());
writer.WriteEndElement();
}
}
我还没有编写引擎的一半,但它会访问keyframe.Commands,遍历它,然后做一些事情。我试图避免类型切换,而不是过度设计这个问题。它可能有 KeyFramePlayCommand 之类的类(与 KeyFramePlayCommandInfo 相比)。
有什么好的模式可以解决这个问题?
【问题讨论】:
-
它只有 Save 方法,但我认为它并不真正相关。如果您需要修改它以获得答案,请这样做。
标签: c# design-patterns interface