我覺得我知道設計模式,但這是逃避我。我有兩個單獨的項目,一個作爲另一個的庫。該庫讀取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
比較)。
解決此問題的任何良好模式?
Post IKeyFrameCommandInfo :) –
它只有Save方法,但它並不真正相關,我想。如果你需要修改它的答案,請這樣做。 – Tesserex